@ -0,0 +1,771 @@
#!/bin/sh
# Copyright (C) 2025 sfwtw <sfwtw@qq.com>
_Vendor = "telit"
_Author = "sfwtw"
_Maintainer = "sfwtw <sfwtw@qq.com>"
source /usr/share/qmodem/generic.sh
debug_subject = "telit_ctrl"
vendor_get_disabled_features( )
{
json_add_string "" "IMEI"
json_add_string "" "NeighborCell"
}
get_mode( )
{
at_command = 'AT#USBCFG?'
local mode_num = $( at ${ at_port } ${ at_command } | grep -o "#USBCFG:" | awk -F': ' '{print $2}' )
case " $mode_num " in
"0" ) mode = "rndis" ; ;
"1" ) mode = "qmi" ; ;
"2" ) mode = "mbim" ; ;
"3" ) mode = "ecm" ; ;
*) mode = " ${ mode_num } " ; ;
esac
available_modes = $( uci -q get qmodem.$config_section .modes)
json_add_object "mode"
for available_mode in $available_modes ; do
if [ " $mode " = " $available_mode " ] ; then
json_add_string " $available_mode " "1"
else
json_add_string " $available_mode " "0"
fi
done
json_close_object
}
set_mode( )
{
local mode = $1
case $mode in
"rndis" ) mode = "0" ; ;
"qmi" ) mode = "1" ; ;
"mbim" ) mode = "2" ; ;
"ecm" ) mode = "3" ; ;
*) echo "Invalid mode" && return 1; ;
esac
at_command = 'AT#USBCFG=' ${ mode }
res = $( at " ${ at_port } " " ${ at_command } " )
json_select "result"
json_add_string "set_mode" " $res "
json_close_object
}
get_network_prefer( )
{
at_command = 'AT+WS46?'
local response = $( at ${ at_port } ${ at_command } | grep "+WS46:" | awk -F': ' '{print $2}' | sed 's/\r//g' )
network_prefer_3g = "0" ;
network_prefer_4g = "0" ;
network_prefer_5g = "0" ;
#匹配不同的网络类型
local auto = $( echo " ${ response } " | grep "38" )
if [ -n " $auto " ] ; then
network_prefer_3g = "1"
network_prefer_4g = "1"
network_prefer_5g = "1"
else
local wcdma = $( echo " ${ response } " | grep "22" || echo " ${ response } " | grep "31" || echo " ${ response } " | grep "38" || echo " ${ response } " | grep "40" )
local lte = $( echo " ${ response } " | grep "28" || echo " ${ response } " | grep "31" || echo " ${ response } " | grep "37" || echo " ${ response } " | grep "38" )
local nr = $( echo " ${ response } " | grep "36" || echo " ${ response } " | grep "37" || echo " ${ response } " | grep "38" || echo " ${ response } " | grep "40" )
if [ -n " $wcdma " ] ; then
network_prefer_3g = "1"
fi
if [ -n " $lte " ] ; then
network_prefer_4g = "1"
fi
if [ -n " $nr " ] ; then
network_prefer_5g = "1"
fi
fi
json_add_object network_prefer
json_add_string 3G $network_prefer_3g
json_add_string 4G $network_prefer_4g
json_add_string 5G $network_prefer_5g
json_close_object
}
set_network_prefer( )
{
network_prefer_3g = $( echo $1 | jq -r 'contains(["3G"])' )
network_prefer_4g = $( echo $1 | jq -r 'contains(["4G"])' )
network_prefer_5g = $( echo $1 | jq -r 'contains(["5G"])' )
length = $( echo $1 | jq -r 'length' )
case " $length " in
"1" )
if [ " $network_prefer_3g " = "true" ] ; then
network_prefer_config = "22"
elif [ " $network_prefer_4g " = "true" ] ; then
network_prefer_config = "28"
elif [ " $network_prefer_5g " = "true" ] ; then
network_prefer_config = "36"
fi
; ;
"2" )
if [ " $network_prefer_3g " = "true" ] && [ " $network_prefer_4g " = "true" ] ; then
network_prefer_config = "31"
elif [ " $network_prefer_3g " = "true" ] && [ " $network_prefer_5g " = "true" ] ; then
network_prefer_config = "40"
elif [ " $network_prefer_4g " = "true" ] && [ " $network_prefer_5g " = "true" ] ; then
network_prefer_config = "37"
fi
; ;
"3" ) network_prefer_config = "38" ; ;
*) network_prefer_config = "38" ; ;
esac
at_command = 'AT+WS46=' ${ network_prefer_config }
at " ${ at_port } " " ${ at_command } "
}
get_voltage( )
{
at_command = "AT#CBC"
local voltage = $( at ${ at_port } ${ at_command } | grep "#CBC:" | awk -F',' '{print $2}' | sed 's/\r//g' )
[ -n " $voltage " ] && {
voltage = $( awk " BEGIN {printf \"%.2f\", $voltage / 100} " )
add_plain_info_entry "voltage" " $voltage V " "Voltage"
}
}
get_temperature( )
{
at_command = "AT#TEMPSENS=2"
local temp
QTEMP = $( at ${ at_port } ${ at_command } | grep "#TEMPSENS: TSENS," )
temp = $( echo $QTEMP | awk -F',' '{print $2}' | sed 's/\r//g' )
if [ -n " $temp " ] ; then
temp = " ${ temp } $( printf "\xc2\xb0" ) C "
fi
add_plain_info_entry "temperature" " $temp " "Temperature"
}
base_info( )
{
m_debug "Telit base info"
#Name( 名称)
at_command = "AT+CGMM"
name = $( at $at_port $at_command | sed -n '3p' | sed 's/\r//g' )
#Manufacturer( 制造商)
at_command = "AT+CGMI"
manufacturer = $( at $at_port $at_command | sed -n '3p' | sed 's/\r//g' )
#Revision( 固件版本)
at_command = "AT+CGMR"
revision = $( at $at_port $at_command | sed -n '3p' | sed 's/\r//g' )
class = "Base Information"
add_plain_info_entry "manufacturer" " $manufacturer " "Manufacturer"
add_plain_info_entry "revision" " $revision " "Revision"
add_plain_info_entry "at_port" " $at_port " "AT Port"
get_temperature
get_voltage
get_connect_status
}
sim_info( )
{
m_debug "Telit sim info"
#SIM Slot( SIM卡卡槽)
at_command = "AT#QSS?"
sim_slot = $( at $at_port $at_command | grep "#QSS:" | awk -F',' '{print $3}' | sed 's/\r//g' )
if [ " $sim_slot " = "0" ] ; then
sim_slot = "1"
elif [ " $sim_slot " = "1" ] ; then
sim_slot = "2"
fi
#IMEI( 国际移动设备识别码)
at_command = "AT+CGSN"
imei = $( at $at_port $at_command | sed -n '3p' | sed 's/\r//g' )
#SIM Status( SIM状态)
at_command = "AT+CPIN?"
sim_status_flag = $( at $at_port $at_command | sed -n '3p' )
sim_status = $( get_sim_status " $sim_status_flag " )
if [ " $sim_status " != "ready" ] ; then
return
fi
#ISP( 互联网服务提供商)
at_command = "AT+COPS?"
isp = $( at $at_port $at_command | sed -n '3p' | awk -F'"' '{print $2}' )
# if [ "$isp" = "CHN-CMCC" ] || [ "$isp" = "CMCC" ]|| [ "$isp" = "46000" ]; then
# isp="中国移动"
# # elif [ "$isp" = "CHN-UNICOM" ] || [ "$isp" = "UNICOM" ] || [ "$isp" = "46001" ]; then
# elif [ "$isp" = "CHN-UNICOM" ] || [ "$isp" = "CUCC" ] || [ "$isp" = "46001" ]; then
# isp="中国联通"
# # elif [ "$isp" = "CHN-CT" ] || [ "$isp" = "CT" ] || [ "$isp" = "46011" ]; then
# elif [ "$isp" = "CHN-TELECOM" ] || [ "$isp" = "CTCC" ] || [ "$isp" = "46011" ]; then
# isp="中国电信"
# fi
#IMSI( 国际移动用户识别码)
at_command = "AT+CIMI"
imsi = $( at $at_port $at_command | sed -n '3p' | sed 's/\r//g' )
#ICCID( 集成电路卡识别码)
at_command = "AT+ICCID"
iccid = $( at $at_port $at_command | grep -o "+ICCID:[ ]*[-0-9]\+" | grep -o "[-0-9]\{1,4\}" )
class = "SIM Information"
case " $sim_status " in
"ready" )
add_plain_info_entry "SIM Status" " $sim_status " "SIM Status"
add_plain_info_entry "ISP" " $isp " "Internet Service Provider"
add_plain_info_entry "SIM Slot" " $sim_slot " "SIM Slot"
add_plain_info_entry "IMEI" " $imei " "International Mobile Equipment Identity"
add_plain_info_entry "IMSI" " $imsi " "International Mobile Subscriber Identity"
add_plain_info_entry "ICCID" " $iccid " "Integrate Circuit Card Identity"
; ;
"miss" )
add_plain_info_entry "SIM Status" " $sim_status " "SIM Status"
add_plain_info_entry "IMEI" " $imei " "International Mobile Equipment Identity"
; ;
"unknown" )
add_plain_info_entry "SIM Status" " $sim_status " "SIM Status"
; ;
*)
add_plain_info_entry "SIM Status" " $sim_status " "SIM Status"
add_plain_info_entry "SIM Slot" " $sim_slot " "SIM Slot"
add_plain_info_entry "IMEI" " $imei " "International Mobile Equipment Identity"
add_plain_info_entry "IMSI" " $imsi " "International Mobile Subscriber Identity"
add_plain_info_entry "ICCID" " $iccid " "Integrate Circuit Card Identity"
; ;
esac
}
network_info( )
{
m_debug "Telit network info"
at_command = "AT#CAMETRICS=1;#CAMETRICS?"
network_type = $( at ${ at_port } ${ at_command } | grep "#CAMETRICS:" | awk -F',' '{print $3}' )
at_command = "AT#CQI"
response = $( at ${ at_port } ${ at_command } | grep "#CQI:" | sed 's/#CQI: //g' | sed 's/\r//g' )
if [ -n " $response " ] ; then
cqi = $( echo " $response " | cut -d',' -f1)
second_value = $( echo " $response " | cut -d',' -f2)
[ " $cqi " = "31" ] && cqi = " $second_value "
fi
class = "Network Information"
add_plain_info_entry "Network Type" " $network_type " "Network Type"
add_plain_info_entry "CQI DL" " $cqi " "Channel Quality Indicator for Downlink"
}
lte_hex_to_bands( ) {
local hex_value = " $1 "
local result = ""
hex_value = $( echo " $hex_value " | tr 'a-z' 'A-Z' )
local decimal = $( echo " ibase=16; $hex_value " | bc)
local i = 1
while [ " $decimal " != "0" ] ; do
local bit = $( echo " $decimal % 2 " | bc)
if [ " $bit " -eq 1 ] ; then
result = " $result B $i "
fi
decimal = $( echo " $decimal / 2 " | bc)
i = $( expr $i + 1)
done
result = $( echo " $result " | tr -s ' ' | sed -e 's/^ *//' -e 's/ *$//' )
echo " $result "
}
lte_bands_to_hex( ) {
local bands = " $1 "
local decimal_value = 0
for band in $bands ; do
local band_num = $( echo " $band " | sed 's/^B//' )
local bit_value = $( echo " 2^( $band_num -1) " | bc)
decimal_value = $( echo " $decimal_value + $bit_value " | bc)
done
local hex_value = $( echo " obase=16; $decimal_value " | bc)
echo " $hex_value "
}
nr_hex_to_bands( ) {
local hex_value = " $1 "
local result = ""
hex_value = $( echo " $hex_value " | tr 'a-z' 'A-Z' )
local decimal = $( echo " ibase=16; $hex_value " | bc)
local j = 1
[ " $2 " = "65_128" ] && j = 65
while [ " $decimal " != "0" ] ; do
local bit = $( echo " $decimal % 2 " | bc)
if [ " $bit " -eq 1 ] ; then
result = " $result N $j "
fi
decimal = $( echo " $decimal / 2 " | bc)
j = $( expr $j + 1)
done
result = $( echo " $result " | tr -s ' ' | sed -e 's/^ *//' -e 's/ *$//' )
echo " $result "
}
nr_bands_to_hex( ) {
local bands = " $1 "
local decimal_value = 0
local decimal_value_ext = 0
for band in $bands ; do
local band_num = $( echo " $band " | sed 's/^N//' )
if expr " $band_num " : '[0-9][0-9]*$' >/dev/null; then
if [ $band_num -lt 65 ] ; then
local bit_value = $( echo " 2^( $band_num -1) " | bc)
decimal_value = $( echo " $decimal_value + $bit_value " | bc)
else
local bit_value = $( echo " 2^( $band_num -65) " | bc)
decimal_value_ext = $( echo " $decimal_value_ext + $bit_value " | bc)
fi
fi
done
local hex_value = $( echo " obase=16; $decimal_value " | bc)
if [ " $decimal_value_ext " != "0" ] ; then
local hex_value_ext = $( echo " obase=16; $decimal_value_ext " | bc)
echo " ${ hex_value_ext } "
else
echo " $hex_value "
fi
}
get_lockband( )
{
json_add_object "lockband"
m_debug "Telit get lockband info"
get_lockband_config_command = "AT#BND?"
get_available_band_command = "AT#BND=?"
get_lockband_config_res = $( at $at_port $get_lockband_config_command )
get_available_band_res = $( at $at_port $get_available_band_command )
json_add_object "LTE"
json_add_array "available_band"
json_close_array
json_add_array "lock_band"
json_close_array
json_close_object
json_add_object "NR_NSA"
json_add_array "available_band"
json_close_array
json_add_array "lock_band"
json_close_array
json_close_object
json_add_object "NR"
json_add_array "available_band"
json_close_array
json_add_array "lock_band"
json_close_array
json_close_object
lte_avalible_band = $( echo $get_available_band_res | grep -o "#BND: ([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*)" | sed 's/#BND: (\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\))/\3/' )
lte_avalible_band = $( lte_hex_to_bands " $lte_avalible_band " )
nsa_nr_avalible_band_1_64 = $( echo $get_available_band_res | grep -o "#BND: ([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*)" | sed 's/#BND: (\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\))/\5/' )
nsa_nr_avalible_band_65_128 = $( echo $get_available_band_res | grep -o "#BND: ([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*)" | sed 's/#BND: (\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\))/\6/' )
nsa_nr_avalible_band = " $( nr_hex_to_bands " $nsa_nr_avalible_band_1_64 " "1_64" ) $( nr_hex_to_bands " $nsa_nr_avalible_band_65_128 " "65_128" ) "
sa_nr_avalible_band_1_64 = $( echo $get_available_band_res | grep -o "#BND: ([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*)" | sed 's/#BND: (\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\))/\7/' )
sa_nr_avalible_band_65_128 = $( echo $get_available_band_res | grep -o "#BND: ([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*)" | sed 's/#BND: (\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\)),(\([^)]*\))/\8/' )
sa_nr_avalible_band = " $( nr_hex_to_bands " $sa_nr_avalible_band_1_64 " "1_64" ) $( nr_hex_to_bands " $sa_nr_avalible_band_65_128 " "65_128" ) "
for i in $( echo " $lte_avalible_band " | awk -F" " '{for(j=1; j<=NF; j++) print $j}' ) ; do
json_select "LTE"
json_select "available_band"
add_avalible_band_entry " $i " " $i "
json_select ..
json_select ..
done
for i in $( echo " $nsa_nr_avalible_band " | awk -F" " '{for(j=1; j<=NF; j++) print $j}' ) ; do
json_select "NR_NSA"
json_select "available_band"
add_avalible_band_entry " $i " " $i "
json_select ..
json_select ..
done
for i in $( echo " $sa_nr_avalible_band " | awk -F" " '{for(j=1; j<=NF; j++) print $j}' ) ; do
json_select "NR"
json_select "available_band"
add_avalible_band_entry " $i " " $i "
json_select ..
json_select ..
done
lte_band = $( echo $get_lockband_config_res | awk -F "," '{print $3}' )
lte_band = $( lte_hex_to_bands " $lte_band " )
nsa_nr_band_1_64 = $( echo $get_lockband_config_res | awk -F "," '{print $5}' )
nsa_nr_band_65_128 = $( echo $get_lockband_config_res | awk -F "," '{print $6}' )
nsa_nr_band = " $( nr_hex_to_bands " $nsa_nr_band_1_64 " "1_64" ) $( nr_hex_to_bands " $nsa_nr_band_65_128 " "65_128" ) "
sa_nr_band_1_64 = $( echo $get_lockband_config_res | awk -F "," '{print $7}' )
sa_nr_band_65_128 = $( echo $get_lockband_config_res | awk -F "," '{print $8}' | sed 's/\r//g' | sed 's/ OK//g' )
sa_nr_band = " $( nr_hex_to_bands " $sa_nr_band_1_64 " "1_64" ) $( nr_hex_to_bands " $sa_nr_band_65_128 " "65_128" ) "
for i in $( echo " $lte_band " | cut -d, -f2| tr -d '\r' | awk -F" " '{for(j=1; j<=NF; j++) print $j}' ) ; do
if [ -n " $i " ] ; then
json_select "LTE"
json_select "lock_band"
json_add_string "" " $i "
json_select ..
json_select ..
fi
done
for i in $( echo " $nsa_nr_band " | cut -d, -f2| tr -d '\r' | awk -F" " '{for(j=1; j<=NF; j++) print $j}' ) ; do
if [ -n " $i " ] ; then
json_select "NR_NSA"
json_select "lock_band"
json_add_string "" " $i "
json_select ..
json_select ..
fi
done
for i in $( echo " $sa_nr_band " | cut -d, -f2| tr -d '\r' | awk -F" " '{for(j=1; j<=NF; j++) print $j}' ) ; do
if [ -n " $i " ] ; then
json_select "NR"
json_select "lock_band"
json_add_string "" " $i "
json_select ..
json_select ..
fi
done
json_close_array
json_close_object
}
set_lockband( )
{
m_debug "telit set lockband info"
config = $1
#{"band_class":"NR","lock_band":"41,78,79"}
band_class = $( echo $config | jq -r '.band_class' )
lock_band = $( echo $config | jq -r '.lock_band' )
lock_band = $( echo $lock_band | tr ',' ' ' )
case " $band_class " in
"LTE" )
lock_band = $( lte_bands_to_hex " $lock_band " )
at_command = " AT#BND=0,22, $lock_band "
res = $( at $at_port $at_command )
; ;
"NR_NSA" )
orig = $( at $at_port "AT#BND?" )
orig_lte = $( echo $orig | awk -F "," '{print $3}' )
orig_lte_ext = $( echo $orig | awk -F "," '{print $4}' )
nr_bands_1_64 = ""
nr_bands_65_128 = ""
for band in $lock_band ; do
band_num = $( echo " $band " | sed 's/^N//' )
if [ " $band_num " -lt 65 ] ; then
nr_bands_1_64 = " $nr_bands_1_64 N $band_num "
else
nr_bands_65_128 = " $nr_bands_65_128 N $band_num "
fi
done
nsa_nr_1_64 = $( nr_bands_to_hex " $nr_bands_1_64 " | cut -d',' -f1)
nsa_nr_65_128 = $( nr_bands_to_hex " $nr_bands_65_128 " | cut -d',' -f2)
[ -z " $nsa_nr_1_64 " ] && nsa_nr_1_64 = $orig_nsa_nr_1_64
[ -z " $nsa_nr_65_128 " ] && nsa_nr_65_128 = $orig_nsa_nr_65_128
at_command = " AT#BND=0,22, $orig_lte , $orig_lte_ext , $nsa_nr_1_64 , $nsa_nr_65_128 "
res = $( at $at_port $at_command )
; ;
"NR" )
orig = $( at $at_port "AT#BND?" )
orig_lte = $( echo $orig | awk -F "," '{print $3}' )
orig_lte_ext = $( echo $orig | awk -F "," '{print $4}' )
orig_nsa_nr_1_64 = $( echo $orig | awk -F "," '{print $5}' )
orig_nsa_nr_65_128 = $( echo $orig | awk -F "," '{print $6}' )
orig_sa_nr_1_64 = $( echo $orig | awk -F "," '{print $7}' )
orig_sa_nr_65_128 = $( echo $orig | awk -F "," '{print $8}' | sed 's/\r//g' | sed 's/ OK//g' )
nr_bands_1_64 = ""
nr_bands_65_128 = ""
for band in $lock_band ; do
band_num = $( echo " $band " | sed 's/^N//' )
if [ " $band_num " -lt 65 ] ; then
nr_bands_1_64 = " $nr_bands_1_64 N $band_num "
else
nr_bands_65_128 = " $nr_bands_65_128 N $band_num "
fi
done
nr_1_64 = $( nr_bands_to_hex " $nr_bands_1_64 " )
nr_65_128 = $( nr_bands_to_hex " $nr_bands_65_128 " )
[ -z " $nr_1_64 " ] && nr_1_64 = $orig_sa_nr_1_64
[ -z " $nr_65_128 " ] && nr_65_128 = $orig_sa_nr_65_128
at_command = " AT#BND=0,22, $orig_lte , $orig_lte_ext , $orig_nsa_nr_1_64 , $orig_nsa_nr_65_128 , $nr_1_64 , $nr_65_128 "
res = $( at $at_port $at_command )
; ;
esac
json_select "result"
json_add_string "set_lockband" " $res "
json_add_string "config" " $config "
json_add_string "band_class" " $band_class "
json_add_string "lock_band" " $lock_band "
json_close_object
}
calc_average( ) {
local values = " $1 "
local sum = 0
local count = 0
for val in $values ; do
if [ -n " $val " ] && [ " $val " != "NA" ] ; then
sum = $( echo " $sum + $val " | bc -l)
count = $(( count + 1 ))
fi
done
if [ $count -gt 0 ] ; then
printf "%.1f" $( echo " $sum / $count " | bc -l)
else
echo "NA"
fi
}
convert_band_number( ) {
local band_num = $1
case " $band_num " in
120) echo "B1" ; ;
121) echo "B2" ; ;
122) echo "B3" ; ;
123) echo "B4" ; ;
124) echo "B5" ; ;
125) echo "B6" ; ;
126) echo "B7" ; ;
127) echo "B8" ; ;
128) echo "B9" ; ;
129) echo "B10" ; ;
130) echo "B11" ; ;
131) echo "B12" ; ;
132) echo "B13" ; ;
133) echo "B14" ; ;
134) echo "B17" ; ;
135) echo "B33" ; ;
136) echo "B34" ; ;
137) echo "B35" ; ;
138) echo "B36" ; ;
139) echo "B37" ; ;
140) echo "B38" ; ;
141) echo "B39" ; ;
142) echo "B40" ; ;
143) echo "B18" ; ;
144) echo "B19" ; ;
145) echo "B20" ; ;
146) echo "B21" ; ;
147) echo "B24" ; ;
148) echo "B25" ; ;
149) echo "B41" ; ;
150) echo "B42" ; ;
151) echo "B43" ; ;
152) echo "B23" ; ;
153) echo "B26" ; ;
154) echo "B32" ; ;
155) echo "B125" ; ;
156) echo "B126" ; ;
157) echo "B127" ; ;
158) echo "B28" ; ;
159) echo "B29" ; ;
160) echo "B30" ; ;
161) echo "B66" ; ;
162) echo "B250" ; ;
163) echo "B46" ; ;
166) echo "B71" ; ;
167) echo "B47" ; ;
168) echo "B48" ; ;
250) echo "N1" ; ;
251) echo "N2" ; ;
252) echo "N3" ; ;
253) echo "N5" ; ;
254) echo "N7" ; ;
255) echo "N8" ; ;
256) echo "N20" ; ;
257) echo "N28" ; ;
258) echo "N38" ; ;
259) echo "N41" ; ;
260) echo "N50" ; ;
261) echo "N51" ; ;
262) echo "N66" ; ;
263) echo "N70" ; ;
264) echo "N71" ; ;
265) echo "N74" ; ;
266) echo "N75" ; ;
267) echo "N76" ; ;
268) echo "N77" ; ;
269) echo "N78" ; ;
270) echo "N79" ; ;
271) echo "N80" ; ;
272) echo "N81" ; ;
273) echo "N82" ; ;
274) echo "N83" ; ;
275) echo "N84" ; ;
276) echo "N85" ; ;
277) echo "N257" ; ;
278) echo "N258" ; ;
279) echo "N259" ; ;
280) echo "N260" ; ;
281) echo "N261" ; ;
282) echo "N12" ; ;
283) echo "N25" ; ;
284) echo "N34" ; ;
285) echo "N39" ; ;
286) echo "N40" ; ;
287) echo "N65" ; ;
288) echo "N86" ; ;
289) echo "N48" ; ;
290) echo "N14" ; ;
291) echo "N13" ; ;
292) echo "N18" ; ;
293) echo "N26" ; ;
294) echo "N30" ; ;
295) echo "N29" ; ;
296) echo "N53" ; ;
*) echo " $band_num " ; ;
esac
}
cell_info( )
{
m_debug "Telit cell info"
at_command = "AT#CAINFOEXT?"
ca_response = $( at ${ at_port } ${ at_command } )
info_line = $( echo " $ca_response " | grep -o " #CAINFOEXT: [^ $]* " | head -1)
ca_count = $( echo " $info_line " | awk -F',' '{print $1}' | awk -F': ' '{print $2}' )
network_type_raw = $( echo " $info_line " | awk -F',' '{print $2}' )
network_mode = $( echo " $network_type_raw " | tr -d ' ' )
[ " $ca_count " -gt 1 ] && network_mode = " $network_mode with $ca_count CA "
pcc_line = $( echo " $ca_response " | grep "PCC-" )
band_number = $( echo " $pcc_line " | grep -o "BandClass: [^,]*" | awk -F': ' '{print $2}' )
band = $( convert_band_number " $band_number " )
bw = $( echo " $pcc_line " | grep -o "BW: [^,]*" | awk -F': ' '{print $2}' )
if [ -z " $bw " ] ; then
dl_bw_raw = $( echo " $pcc_line " | grep -o "DL_BW: [^,]*" | awk -F': ' '{print $2}' )
case " $dl_bw_raw " in
"0" ) bw = "1.4 MHz" ; ;
"1" ) bw = "3 MHz" ; ;
"2" ) bw = "5 MHz" ; ;
"3" ) bw = "10 MHz" ; ;
"4" ) bw = "15 MHz" ; ;
"5" ) bw = "20 MHz" ; ;
*) bw = " $dl_bw_raw " ; ;
esac
fi
arfcn = $( echo " $pcc_line " | grep -o "CH: [^,]*" | awk -F': ' '{print $2}' )
[ -z " $arfcn " ] && arfcn = $( echo " $pcc_line " | grep -o "RX_CH: [^,]*" | awk -F': ' '{print $2}' )
pci = $( echo " $pcc_line " | grep -o "PCI: [^,]*" | awk -F': ' '{print $2}' )
rsrp = $( echo " $pcc_line " | grep -o "RSRP: [^,]*" | awk -F': ' '{print $2}' )
rsrq = $( echo " $pcc_line " | grep -o "RSRQ: [^,]*" | awk -F': ' '{print $2}' )
rssi = $( echo " $pcc_line " | grep -o "RSSI: [^,]*" | awk -F': ' '{print $2}' )
sinr_raw = $( echo " $pcc_line " | grep -o "SINR: [^,]*" | awk -F': ' '{print $2}' )
sinr = $( printf "%.1f" $( echo " -20 + ( $sinr_raw * 0.2) " | bc -l) )
tac = $( echo " $pcc_line " | grep -o "TAC: [^,]*" | awk -F': ' '{print $2}' )
tx_power = $( echo " $pcc_line " | grep -o "TX_PWR: [^,]*" | awk -F': ' '{print $2}' )
[ -n " $tx_power " ] && tx_power = $( printf "%.1f" $( echo " $tx_power / 10 " | bc -l) )
[ -z " $tx_power " ] && tx_power = "0"
ul_mod = $( echo " $pcc_line " | grep -o "UL_MOD: [^,]*" | awk -F': ' '{print $2}' )
dl_mod = $( echo " $pcc_line " | grep -o "DL_MOD: [^,]*" | awk -F': ' '{print $2}' | sed 's/[^0-9]//g' )
case " $ul_mod " in
"0" ) ul_mod = "BPSK" ; ;
"1" ) ul_mod = "QPSK" ; ;
"2" ) ul_mod = "16QAM" ; ;
"3" ) ul_mod = "64QAM" ; ;
"4" ) ul_mod = "256QAM" ; ;
*) ul_mod = " $ul_mod " ; ;
esac
case " $dl_mod " in
"0" ) dl_mod = "BPSK" ; ;
"1" ) dl_mod = "QPSK" ; ;
"2" ) dl_mod = "16QAM" ; ;
"3" ) dl_mod = "64QAM" ; ;
"4" ) dl_mod = "256QAM" ; ;
*) dl_mod = " $dl_mod " ; ;
esac
if [ " $ca_count " -gt 1 ] ; then
scc_band = ""
scc_bw = ""
scc_arfcn = ""
scc_pci = ""
scc_rsrp = ""
scc_rssi = ""
scc_rsrq = ""
scc_sinr = ""
for i in $( seq 0 $(( ca_count-2)) ) ; do
scc_line = $( echo " $ca_response " | grep -A 1 " SCC $i - " | tr '\r\n' ' ' )
if [ -n " $scc_line " ] ; then
scc_band_number = $( echo " $scc_line " | grep -o "BandClass: [^,]*" | awk -F': ' '{print $2}' )
scc_band_new = $( convert_band_number " $scc_band_number " )
if [ -z " $scc_band " ] ; then
scc_band = " $scc_band_new "
else
scc_band = " $scc_band / $scc_band_new "
fi
scc_bw_new = $( echo " $scc_line " | grep -o "BW: [^,]*" | awk -F': ' '{print $2}' )
if [ -z " $scc_bw_new " ] ; then
scc_dl_bw = $( echo " $scc_line " | grep -o "DL_BW: [^,]*" | awk -F': ' '{print $2}' )
case " $scc_dl_bw " in
"0" ) scc_bw_new = "1.4 MHz" ; ;
"1" ) scc_bw_new = "3 MHz" ; ;
"2" ) scc_bw_new = "5 MHz" ; ;
"3" ) scc_bw_new = "10 MHz" ; ;
"4" ) scc_bw_new = "15 MHz" ; ;
"5" ) scc_bw_new = "20 MHz" ; ;
*) scc_bw_new = " $scc_dl_bw " ; ;
esac
fi
if [ -z " $scc_bw " ] ; then
scc_bw = " $scc_bw_new "
else
scc_bw = " $scc_bw / $scc_bw_new "
fi
scc_arfcn_new = $( echo " $scc_line " | grep -o "CH: [^,]*" | awk -F': ' '{print $2}' )
[ -z " $scc_arfcn_new " ] && scc_arfcn_new = $( echo " $scc_line " | grep -o "RX_CH: [^,]*" | awk -F': ' '{print $2}' )
if [ -z " $scc_arfcn " ] ; then
scc_arfcn = " $scc_arfcn_new "
else
scc_arfcn = " $scc_arfcn / $scc_arfcn_new "
fi
scc_pci_new = $( echo " $scc_line " | grep -o "PCI: [^,]*" | awk -F': ' '{print $2}' )
if [ -z " $scc_pci " ] ; then
scc_pci = " $scc_pci_new "
else
scc_pci = " $scc_pci / $scc_pci_new "
fi
scc_rsrp_new = $( echo " $scc_line " | grep -o "RSRP: [^,]*" | awk -F': ' '{print $2}' )
scc_rsrp = " $scc_rsrp $scc_rsrp_new "
scc_rssi_new = $( echo " $scc_line " | grep -o "RSSI: [^,]*" | awk -F': ' '{print $2}' )
scc_rssi = " $scc_rssi $scc_rssi_new "
scc_rsrq_new = $( echo " $scc_line " | grep -o "RSRQ: [^,]*" | awk -F': ' '{print $2}' )
scc_rsrq = " $scc_rsrq $scc_rsrq_new "
scc_sinr_raw = $( echo " $scc_line " | grep -o "SINR: [^,]*" | awk -F': ' '{print $2}' )
scc_sinr_new = $( printf "%.1f" $( echo " -20 + ( $scc_sinr_raw * 0.2) " | bc -l) )
scc_sinr = " $scc_sinr $scc_sinr_new "
fi
done
arfcn = " $arfcn / $scc_arfcn "
band = " $band / $scc_band "
bw = " $bw / $scc_bw "
pci = " $pci / $scc_pci "
# rsrp=$(calc_average "$rsrp $scc_rsrp")
# rssi=$(calc_average "$rssi $scc_rssi")
# rsrq=$(calc_average "$rsrq $scc_rsrq")
# sinr=$(calc_average "$sinr $scc_sinr")
fi
class = "Cell Information"
add_plain_info_entry "network_mode" " $network_mode " "Network Mode"
add_plain_info_entry "Band" " $band " "Band"
add_plain_info_entry "Bandwidth" " $bw " "Bandwidth"
add_plain_info_entry "ARFCN" " $arfcn " "Absolute Radio-Frequency Channel Number"
add_plain_info_entry "Physical Cell ID" " $pci " "Physical Cell ID"
add_plain_info_entry "TAC" " $tac " "Tracking Area Code"
add_plain_info_entry "DL/UL MOD" " $dl_mod / $ul_mod " "DL/UL MOD"
add_plain_info_entry "TX Power" " $tx_power " "TX Power"
add_bar_info_entry "RSRP" " $rsrp " "Reference Signal Received Power" -140 -44 dBm
add_bar_info_entry "RSRQ" " $rsrq " "Reference Signal Received Quality" -19.5 -3 dB
add_bar_info_entry "RSSI" " $rssi " "Received Signal Strength Indicator" -120 -20 dBm
add_bar_info_entry "SINR" " $sinr " "Signal to Interference plus Noise Ratio Bandwidth" 0 30 dB
}