🌴 Sync 2026-03-05 23:51:42

This commit is contained in:
github-actions[bot] committed 2026-03-05 23:51:42 +08:00
1 parent 0d155c70be
commit 32600acc60
14258 files changed
+3954570

No files matched your search

+6
View File
@@ -0,0 +1,6 @@
#!/bin/sh
. /usr/share/libubox/jshn.sh
json_load "$(/usr/share/modeminfo/modeminfo)"
json_dump
+58
View File
@@ -0,0 +1,58 @@
#!/bin/sh
DATA=$(/usr/share/modeminfo/modeminfo)
SECTIONS=$(echo $(uci show modeminfo | awk -F [\]\[\@=] '/=modeminfo/{print $3}'))
# load channel to band converter
. /usr/share/modeminfo/scripts/ch_to_band
get_data(){
jsonfilter -s "$DATA" -e "MODE=$['modem'][$s]['mode']" \
-e "DEVICE=$['modem'][$s]['device']" \
-e "CH=$['modem'][$s]['arfcn']" \
-e "COPS=$['modem'][$s]['cops']" \
-e "PERS=$['modem'][$s]['csq_per']" \
-e "CA=$['modem'][$s]['lteca']" \
-e "RSSI=$['modem'][$s]['rssi']" \
-e "RSRP=$['modem'][$s]['rsrp']" \
-e "RSRQ=$['modem'][$s]['rsrq']" \
-e "SINR=$['modem'][$s]['sinr']" \
-e "ENBID=$['modem'][$s]['enbid']" \
-e "PCI=$['modem'][$s]['pci']" \
-e "CELL=$['modem'][$s]['cell']" \
-e "DIST=$['modem'][$s]['distance']" \
-e "SB=$['modem'][$s]['scc']"
}
for s in ${SECTIONS}; do
eval $(echo "$(get_data)" | sed -e 's/export//g')
ch_to_band $CH
echo -ne "*Modem $(($s+1))*\n"
echo -ne "*Device:* $DEVICE\n*Operator:* $COPS 📶${PERS}% $MODE\n"
case $MODE in
LTE)
if [ $CA -ge 1 ]; then
CA="$(($CA+1))xCA"
BAND="${SC}${SB}"
echo -ne "*CA:* $CA BAND ($BAND)\n"
else
echo -ne "*BAND:* $SC\n"
fi
echo -ne "*RSSI/RSRP:* ${RSSI}dBm/${RSRP}dBm\n*RSRQ/SINR:* ${RSRQ}dB/${SINR}dB\n*eNBID-Cell/PCI:* ${ENBID}-${CELL}/${PCI}"
if [ "$DIST" ] && [ "$DIST" != "0.00" ]; then
echo -ne " ~${DIST}km\n"
else
echo -ne "\n"
fi
;;
UMT*|WCD*|*HSP*|*HUS*)
echo -ne "*BAND:* $SC\n"
echo -ne "*RSSI/ECIO:* ${RSSI}dBm/${SINR}dB\n*LAC/CID:* ${LAC}/${CID}"
;;
*)
echo -ne "*BAND:* $SC\n"
echo -ne "*RSSI:* ${RSSI}dBm\n*LAC/CID:* ${LAC}/${CID}"
;;
esac
echo -e "\n"
done
@@ -0,0 +1,180 @@
# qmi addon for luci-app-modeminfo
# require full version libqmi (need build in SDK)
# (c) 2020-2024 written by Konstantine Shevlakov (c) at <shevlakov@132lan.ru>
get_device_info(){
DEVPORT=$(uci -q get modeminfo.@modeminfo[$s].device_qmi)
DEVCTL=$(echo $DEVPORT | awk -F [\/] '{print $NF}')
if [ -x /usr/bin/qmicli ]; then
export QMICTL="qmicli -p -d $DEVPORT"
else
logger -t "luci-app-modeminfo" "qmicli not found!"
exit 1
fi
if [ $DEVPORT ]; then
QPROXY=$(uci -q get modeminfo.@modeminfo[$s].qmi_proxy)
if [ $QPROXY -eq 1 ]; then
export QMICTL="qmicli -p -d $DEVPORT"
else
export QMICTL="qmicli -d $DEVPORT"
fi
else
for qmi in $(ls /dev/cdc-wdm*); do
if [ $qmi ]; then
QMI_DEVICE=$qmi
if [ -n $(which qmicli) ]; then
export QMICTL="qmicli -p -d ${QMI_DEVICE}"
else
logger -t "luci-app-modeminfo" "qmi-utils not found or installed!"
exit 0
fi
else
logger -t "luci-app-modeminfo" "Device is no QMI mode or not found!"
exit 0
fi
done
if [ $qmi ]; then
uci set modeminfo.@modeminfo[0].device_qmi="$qmi"
uci commit modeminfo
break
fi
fi
}
get_hardware_info(){
MANUF=$(cat $(readlink -f /sys/class/usbmisc/${DEVCTL})/../../../manufacturer)
MODEL="$(cat $(readlink -f /sys/class/usbmisc/${DEVCTL})/../../../product)"
if [ -n "$(echo "${MODEL}" | grep -Ei "${MANUF}")" ] || [ -n "$(echo "${MANUF}" | grep -Ei QUAL)" ]; then
DEVICE="${MODEL}"
else
DEVICE="${MANUF} ${MODEL}"
fi
IMEI=`$QMICTL --dms-get-ids | awk -F [:] '/IMEI:/{gsub("'\''|\*", ""); print $2}'`
FW=$($QMICTL --dms-get-software-version | awk -F [:] '/version:/{print $2}' )
ICCID=$($QMICTL --dms-uim-get-iccid | awk -F [:] '/ICCID/{gsub("'\''",""); print $2}' )
}
get_lte_bw(){
case $BWDx in
3) BWDL=1 ;;
5) BWDL=2 ;;
10) BWDL=3 ;;
15) BWDL=4 ;;
20) BWDL=5 ;;
esac
}
get_signal_info(){
NETWORK=`$QMICTL --nas-get-home-network | awk -F [:] '/MCC|MNC|Description/{gsub("'\''|^ ", "");print $2}'`
COPS_MCC=$(echo ${NETWORK} |awk '{print $1}')
COPS_MNC_RAW=$(echo ${NETWORK} |awk '{print $2}')
if [ $COPS_MNC_RAW -lt 10 ]; then
COPS_MNC=0${COPS_MNC_RAW}
else
COPS_MNC=$COPS_MNC_RAW
fi
COPS="$(echo "${NETWORK}" |tail -1)"
SIGNAL=$($QMICTL --nas-get-signal-info)
MODE=$(echo "$SIGNAL" | awk 'NR ==2{gsub("\:", ""); print $1}')
STRENGTH=$(echo "$SIGNAL" | awk '/RSSI|RSRQ|RSRP|SNR|ECIO/{gsub("'\''",""); print $2}')
SERVING=$($QMICTL --nas-get-serving-system)
RFBAND=$($QMICTL --nas-get-rf-band-info)
if [ $MODE == "LTE" ]; then
MIMO=$($QMICTL --nas-get-tx-rx-info=lte | grep 'RX Chain' | wc -l)
LACTAC=$(echo "$SERVING" | awk -F [:] '/tracking area code:|3GPP cell ID:/{gsub("'\''",""); print $2}')
LAC_NUM=$(echo $LACTAC | awk '{print $2}')
CID_NUM=$(echo $LACTAC | awk '{print $1}')
CID=$(echo $CID_NUM | awk '{printf "%x\n", $1}' |awk '{print toupper($1)}')
LAC=$(echo $LAC_NUM | awk '{printf "%x\n", $1}' |awk '{print toupper($1)}')
CSQ_RSSI=$(echo ${STRENGTH} | awk '{print $1}')
RSRQ=$(echo ${STRENGTH} | awk '{print $2}')
RSRP=$(echo ${STRENGTH} | awk '{print $3}')
SINR=$(echo ${STRENGTH} | awk '{printf "%.0f\n", $4}')
ENBx=$(echo $CID | sed -e 's/..$//')
ENBID=$(printf %d 0x$ENBx)
CELL=$(printf %d 0x${CID: -2})
PCI=$($QMICTL --nas-get-cell-location-info | awk -F [:] '/Serving Cell ID:/{gsub("'\''",""); print $2}')
LTE_O=$($QMICTL --nas-get-lte-cphy-ca-info)
LTE_CA=$(echo "$LTE_O" |grep -i '^secondary cell' | wc -l)
BWDx=$(echo "$LTE_O" | grep -A4 'Primary Cell Info' | awk -F [:] '/DL Bandwidth:/{gsub("'\''| ", ""); print $2}')
get_lte_bw
if [ $LTE_CA -ge 1 ]; then
BWC=$(echo "$LTE_O" | grep -A4 '^Secondary Cell' | awk -F [:] '/DL Bandwidth:/{gsub("'\''| ", ""); printf "+"$2}')
BWCA=$(($BWDx$BWC))
BANDCH=$(echo "$LTE_O" | grep -A4 '^Primary Cell' | awk -F [:] '/RX Channel:/{gsub("'\''| ", ""); print $2}')
# Fix qmicli band T77W968 modem
case $DEVICE in
*Dell*|*LN960*) CA=$(echo "$LTE_O" | grep -A4 '^Secondary Cell' | awk -F [:-] '/LTE Band:/{gsub("'\''| ", ""); printf " "$NF-1}') ;;
*) CA=$(echo "$LTE_O" | grep -A4 '^Secondary Cell' | awk -F [:-] '/LTE Band:/{gsub("'\''| ", ""); print $NF}') ;;
esac
for cc in $CA; do
SCC=$SCC+$cc
done
else
BANDCH=$(echo "$RFBAND" | awk -F [:] '/Active Channel:/{gsub("'\''",""); print $2}' | head -1)
if [ "x" == "x$BWDx" ]; then
BWDx=$(echo "$RFBAND" | awk -F [:] '/Bandwidth:/{gsub("'\''| ",""); print $2}' | tail -1)
get_lte_bw
fi
fi
EARFCN=$BANDCH
else
MIMO=$($QMICTL --nas-get-tx-rx-info=umts | grep 'RX Chain' | wc -l)
case $MIMO in
0) MIMO=$($QMICTL --nas-get-tx-rx-info=gsm | grep 'RX Chain' | wc -l) ;;
esac
LACTAC=$(echo "$SERVING" | awk -F [:] '/3GPP location area code:|3GPP cell ID:/{gsub("'\''",""); print $2}')
LAC_NUM=$(echo $LACTAC | awk '{print $1}')
CID_NUM=$(echo $LACTAC | awk '{print $2}')
LAC=$(echo $LAC_NUM | awk '{printf "%x\n", $1}' |awk '{print toupper($1)}')
CID=$(echo $CID_NUM | awk '{printf "%x\n", $1}' |awk '{print toupper($1)}')
CSQ_RSSI=$(echo ${STRENGTH} | awk '{print $1}')
if [ $(echo ${STRENGTH} | awk '{print$2}') ]; then
SINR=$(echo ${STRENGTH} | awk '{printf "%.0f\n", $2}')
fi
BANDCH=$(echo "$RFBAND" | awk -F [:] '/Active Channel:/{gsub("'\''| ",""); print $2}')
EARFCN=$(echo $BANDCH | awk '{print $2}')
fi
CSQ_PER=$(echo $CSQ_RSSI |awk '{printf "%d\n", (100*(1-(-50 - $1)/(-50 - -120)))}')
[ $CSQ_RSSI -ge -110 ] && CSQ_COL="black"
[ $CSQ_RSSI -ge -105 ] && CSQ_COL="red"
[ $CSQ_RSSI -ge -95 ] && CSQ_COL="orange"
[ $CSQ_RSSI -ge -75 ] && CSQ_COL="green"
if [ $CSQ_PER -gt 100 ]; then
CSQ_PER=100
elif [ $CSQ_PER -lt 0 ]; then
CSQ_PER=0
fi
EARFCN=$BANDCH
DISTANCE=$($QMICTL --nas-get-cell-location-info | awk '/LTE Timing Advance:/{gsub("\047",""); printf "%.2f\n", (299792458*($4*10^-6)/1000)/2}')
REG=$(echo "$SERVING" | awk -F [:] '/Registration state:/{print $2}' | sed "s/'//g" | awk '{print $1}')
case $REG in
registered)
REGST=1
;;
registration-denied)
REGST=3
;;
esac
DECIMAL=$(uci -q get modeminfo.@general[0].decimail)
if [ "x${DECIMAL}" != "x" ]; then
LAC=$(printf %d 0x$LAC_NUM)
CID=$(printf %d 0x$CID_NUM)
fi
}
#get_device
function get_data_in(){
get_hardware_info >/dev/null 2>&1
get_signal_info >/dev/null 2>&1
}
get_hwinfo(){
continue
}
@@ -0,0 +1,176 @@
#!/bin/sh
get_device_info(){
DEVPORT=$(uci -q get modeminfo.@modeminfo[0].device_qmi)
DEVCTL=$(echo $DEVPORT | awk -F [\/] '{print $NF}')
if ! [ -x /sbin/uqmi ]; then
logger -t "luci-app-modeminfo" "uqmi not found!"
exit 1
fi
if [ $DEVPORT ]; then
QPROXY=$(uci -q get modeminfo.@modeminfo[0].qmi_proxy)
if [ "x${QPROXY}" = "x" ]; then
export MBIM=""
else
export MBIM="-m"
fi
else
for qmi in $(ls /dev/cdc-wdm*); do
if [ $qmi ]; then
QMI_DEVICE=$qmi
if ! [ -n $(which uqmi) ]; then
logger -t "luci-app-modeminfo" "uqmi not found or installed!"
exit 0
fi
else
logger -t "luci-app-modeminfo" "Device is no QMI mode or not found!"
exit 0
fi
done
if [ $qmi ]; then
uci set modeminfo.@modeminfo[0].device_qmi="$qmi"
uci commit modeminfo
break
fi
fi
}
get_data(){
case $1 in
hw)
uqmi ${MBIM} -s -d ${DEVPORT} --get-imei
;;
net)
uqmi ${MBIM} -s -d ${DEVPORT} \
--get-serving-system
;;
sig)
uqmi ${MBIM} -s -d ${DEVPORT} \
--get-signal-info
;;
lte)
uqmi ${MBIM} -d ${DEVPORT} \
--get-lte-cphy-ca-info
;;
base)
uqmi ${MBIM} -s -d ${DEVPORT} \
--get-system-info
;;
mimo)
uqmi ${MBIM} -s -d ${DEVPORT} \
--nas-get-tx-rx-info=$MODE
;;
sta)
uqmi ${MBIM} -d ${DEVPORT} \
--get-cell-location-info
;;
esac
killall -9 uqmi >/dev/null 2>&1
}
get_hardware_info(){
DATA=$(get_data hw)
MANUF=$(cat $(readlink -f /sys/class/usbmisc/${DEVCTL})/../../../manufacturer)
MODEL="$(cat $(readlink -f /sys/class/usbmisc/${DEVCTL})/../../../product)"
DEVICE="$MANUF $MODEL"
IMEI=$(echo "$DATA" | tail -1 | tr -d '"')
}
get_signal_info(){
DATA=$(get_data net)
eval $(jsonfilter -s "$DATA" -e "COPS=$['plmn_description']" \
-e "COPS_MCC=$['plmn_mcc']" \
-e "COPS_MNC_RAW=$['plmn_mnc']" \
-e "REG=$['registration']" \
-e "ROAM=$['roaming']" )
DATA=$(get_data sig)
eval $(jsonfilter -s "$DATA" -e "MODE=$['type']" \
-e "CSQ_RSSI=$['rssi']" \
-e "RSRP=$['rsrp']" \
-e "RSRQ=$['rsrq']" \
-e "SINR=$['snr']")
DATA=$(get_data base)
eval $(jsonfilter -s "$DATA" -e "TAC_NUM=$['$MODE']['tracking_area_code']" \
-e "CELL=$['$MODE']['cell_id']" \
-e "ENBID=$['$MODE']['enodeb_id']")
DATA=$(get_data sta)
EARFCN=$(echo "$DATA" | awk '/channel/{gsub(",",""); print $2}' | head -1)
PCI=$(echo "$DATA" | awk '/serving_cell_id/{gsub(",",""); print $2}' | head -1)
case $MODE in
LTE)
DATA=$(get_data lte)
eval $(jsonfilter -s "$DATA" -e "BW=$['primary']['bandwidth']")
CA=$(echo "$DATA" | awk -F [:] '/secondary_/{gsub("\"","");print $1}')
LTE_CA=$(echo "$CA" | wc -l)
if [ $LTE_CA -ge 1 ]; then
BWCA=0
for a in $CA; do
eval $(jsonfilter -s "$DATA" -e "SCx=$['$a']['band']" \
-e "BWC=$['$a']['bandwidth']")
SCC="$SCC+$SCx"
BWCA=$(($BWCA+$BWC))
done
BWCA=$(($BW+$BWCA))
fi
;;
esac
MODE=$(echo $MODE | awk '{print toupper($1)}')
if [ "$COPS_MNC_RAW" -lt "10" ]; then
COPS_MNC=0${COPS_MNC_RAW}
else
COPS_MNC=${COPS_MNC_RAW}
fi
if [ "x${COPS}" = "x" ]; then
COPS="${COPS_MCC} ${COPS_MNC}"
fi
SINR=$(echo $SINR | awk '{printf "%.0f\n", $1}')
LAC=$(echo $TAC_NUM | awk '{printf "%x\n", toupper($1)}')
ENBID_h=$(printf %x $ENBID)
CELL_h=$(printf %x $CELL)
if [ "$CELL" -le 15 ]; then
CELL_h="0${CID_h}"
fi
CID="${ENBID_h}${CELL_h}"
CID_NUM=$(printf %d 0x$CID)
case $REG in
not_registered) REGST=0 ;;
registered)
case $ROAM in
true) REGST=5 ;;
*) REGST=1 ;;
esac
;;
searching) REGST=2 ;;
registering_denied) REGST=3 ;;
unknown) REGST=4 ;;
esac
CSQ_PER=$(echo $CSQ_RSSI |awk '{printf "%d\n", (100*(1-(-50 - $1)/(-50 - -120)))}')
[ $CSQ_RSSI -ge -110 ] && CSQ_COL="black"
[ $CSQ_RSSI -ge -105 ] && CSQ_COL="red"
[ $CSQ_RSSI -ge -95 ] && CSQ_COL="orange"
[ $CSQ_RSSI -ge -75 ] && CSQ_COL="green"
if [ $CSQ_PER -gt 100 ]; then
CSQ_PER=100
elif [ $CSQ_PER -lt 0 ]; then
CSQ_PER=0
fi
DECIMAL=$(uci -q get modeminfo.@modeminfo[0].general)
if [ "x${DECIMAL}" != "x" ]; then
LAC=$LAC_NUM
CID=$CID_NUM
fi
}
function get_data_in(){
get_hardware_info >/dev/null 2>&1
get_signal_info >/dev/null 2>&1
}
get_hwinfo(){
continue
}
@@ -0,0 +1,74 @@
# Modem support list
# Format: VIDPID;FAMILY
# Intel XMM modems
2cb70007;INTEL
8087095a;INTEL
# Fibocom modems
2cb70104;FIBOCOM
2cb70105;FIBOCOM
2cb70109;FIBOCOM
2cb7010a;FIBOCOM
# Huawei modems
12d11c25;HUAWEI
12d115c1;HUAWEI
12d11506;HUAWEI
# DELL modems
413c81d7;DELL
413c81e4;DELL
1bc71910;DELL
1bc71911;DELL
# Quectel modems
05c69215;QUECTEL
2c7c0125;QUECTEL
2c7c0121;QUECTEL
2c7c6026;QUECTEL
2c7c0620;QUECTEL
2c7c6000;QUECTEL
2c7c0901;QUECTEL
2c7c0306;QUECTEL
2c7c0512;QUECTEL
# SimCOM modems
1e0e9001;SIMCOM
1e0e9002;SIMCOM
1e0e9003;SIMCOM
1e0e9004;SIMCOM
1e0e9005;SIMCOM
1e0e9006;SIMCOM
1e0e9007;SIMCOM
1e0e9011;SIMCOM
1e0e9016;SIMCOM
1e0e9018;SIMCOM
1e0e9019;SIMCOM
# Telit LN940 LT4220
1bc71900;QUALCOMM
1bc71901;QUALCOMM
# Yuge CLM920
12864e3c;YUGE
# ThinkWill ML7820
19d20532;THINKWILL
# MEIG SLM820
2dee4d22;MEIGLINK
2dee4d07;MEIGLINK
2dee4d02;MEIGLINK
# GOCUNCN Welink GM510
305a1415;GOSUN
# Sierra EM7455
11999078;SIERRA
11999079;SIERRA
11999071;SIERRA
119990e2;SIERRA
119990e3;SIERRA
# Fibocom FM350
0e8d7126;INTEL_FM350
0e8d7127;INTEL_FM350
# Mikrotik modems
2cd20001;MIKROTIK
2cd20004;MIKROTIK
# ZTE modems
19d21404;ZTE
19d21424;ZTE
# Thales T99W175
05c69025;THALES
05c690d5;THALES
1e2d00b7;THALES
1e2d00b3;THALES
+116
View File
@@ -0,0 +1,116 @@
#!/bin/sh
trap 'cleanup >/dev/null 2>&1; exit 0' INT TERM
SECTIONS=$(echo $(uci show modeminfo | awk -F [\]\[\@=] '/=modeminfo/{print $3}'))
get_vars(){
for v in device device_qmi qmi_proxy decimail qmi_mode; do
eval $v=$(uci -q get modeminfo.@modeminfo[${s}].${v} 2>/dev/null)
done
}
cleanup(){
CURRENT_PID=$$
ps ww | grep "/bin/sh.*modeminfo" | grep -v grep | awk '{print $1}' | grep -v "^$CURRENT_PID\$" | xargs -r kill -9 >/dev/null 2>&1
ps ww | grep "atinout" | grep -v grep | awk '{print $1}' | xargs -r kill -9 >/dev/null 2>&1
}
function json_status() {
cat << EOF
{
"device": "$DEVICE",
"cops": "$COPS",
"mode": "$MODE",
"csq_per": "$CSQ_PER",
"lac": "$LAC",
"cid": "$CID",
"rssi": "$CSQ_RSSI",
"sinr": "$SINR",
"rsrp": "$RSRP",
"rsrq": "$RSRQ",
"imei": "$IMEI",
"reg": "$REGST",
"csq_col": "$CSQ_COL",
"arfcn": "$EARFCN",
"chiptemp": "$CHIPTEMP",
"firmware": "$FW",
"bwdl": "$BWDL",
"lteca": "$LTE_CA",
"enbid": "$ENBID",
"distance": "$DISTANCE",
"cell": "$CELL",
"scc": "$SCC",
"bwca": "$BWCA",
"iccid": "$ICCID",
"imsi": "$IMSI",
"pci": "$PCI"
EOF
}
function if_null() {
for var in DEVICE COPS MODE CSQ_PER LAC CSQ_RSSI SINR RSRP \
RSRQ IMEI REGST EARFCN CHIPTEMP FW BWDL ICCID IMSI; do
if [ "x$(eval echo \${$var})" = "x" ]; then
eval $var='--'
fi
done
}
qmi_device(){
if [ $qmi_mode ]; then
SCRIPT=/usr/share/modeminfo/scripts/modeminfo-qmi
else
SCRIPT=/usr/share/modeminfo/scripts/modeminfo
fi
if [ -r $SCRIPT ]; then
. $SCRIPT
else
exit 0
fi
}
args(){
echo "$#"
}
ARGSLEN=$(args $SECTIONS)
echo "{ \"modem\" : ["
for s in $SECTIONS; do
m=$((${s} + 1))
if [ "$s" ]; then
get_vars
qmi_device
get_device_info
get_data_in >/dev/null 2>&1
if_null
json_status
fi
if [ "$ARGSLEN" = "${m}" ]; then
echo " }"
else
echo " },"
fi
# flush modem variables
unset BWCA SCC SC BWDx BWPx BWCx BWDL LTE_CA \
DEVICE COPS MODE CSQ_PER LAC CSQ_RSSI \
SINR RSRP IMEI REGST EARFCN CHIPTEMP FW \
ICCID IMSI RSRQ DISTANCE
done
echo "]}"
DELAY=$(uci get modeminfo.@general[0].delay >/dev/null 2>&1)
kill -9 $(pgrep atinout) >/dev/null 2>&1
[ $DELAY ] || DELAY=0 && sleep $DELAY
exit 0
@@ -0,0 +1,62 @@
modem_data(){
# hwinfo
OIFS="$IFS"; IFS="|"
set -- $(echo "$O" | awk '
BEGIN{IGNORECASE=1} $0 ~ /DELL|Telit/ {manufacturer=$1; getline model; getline fw}
/^ICCID:/{iccid=$2; getline imei; getline imsi}
/^PA:|^xo_therm_buf:/ {sub(/C/, "", $2); split($0,arr,":"); if (arr[2] !="") temp = arr[2]; else temp=$2 }
END {print manufacturer "|" model "|" fw "|" iccid "|" imei "|" imsi "|" temp }')
DEVICE="${1} ${2}"; MANUF=${1}; MODEL=${2}; FW=${3}; ICCID=${4}; IMEI=${5}; IMSI=${6}; CHIPTEMP=${7}
IFS="$OIFS"; unset OIFS
generic_data
# get signal info
OIFS="$IFS"; IFS="|"
set -- $(echo "$O" | awk -v mode="$MODE" '
BEGIN {
lac=""; cid=""; earfcn=""; pci=""; bw=""; bwc=""; rsrp=""; rssi=""; rsrq=""; sinr=""; rscp=""; csq=""; lte_ca=0
map[3]=1; map[5]=2; map[10]=3; map[15]=4; map[20]=5
}
# LTE Carrier Aggregation
/SCC[0-9]+ info:/ {lte_ca++}
# LTE
mode == "LTE" {
if (/\+CEREG/) { gsub(/"/, ""); split($0, arr, ","); lac = arr[3]; cid = arr[5]}
if (/EARFCN\(DL\/UL\):/ && earfcn == "") {split($0, arr, /[ \/]/); earfcn = arr[3]}
if (/PCI\)/ && pci == "") {gsub("\)","",$0); gsub("\("," ",$0); pci=$NF}
if (/^RSRP:/ && rsrp == "") {sub(/dBm/, "", $2); rsrp = sprintf("%.0f", $2)}
if (/^RSSI:/ && rssi == "") {sub(/dBm/, "", $2); rssi = sprintf("%.0f", $2)}
if (/^RSRQ:/ && rsrq == "") {sub(/dB/, "", $2); rsrq = sprintf("%.0f", $2)}
if (/^RS-SINR:/ && sinr == "") {sub(/dB/, "", $2); sinr = sprintf("%.0f", $2)}
if (/^RS-SNR:/ && sinr == "") {sub(/dB/, "", $2);sinr = sprintf("%.0f", $2)}
if (/PCC info/ && bwc == "") { bwc = sprintf("%.0f", $8); bw=map[bwc] }
cell = sprintf("%d", "0x" substr(cid, length(cid) - 1, 2))
enbid = sprintf("%d", "0x" substr(cid, 1, length(cid) - 2))
}
# Other mode (3G)
mode != "LTE" {
if (/\+CREG/) {gsub(/"/, "");split($0, arr, ",");lac = arr[3]; cid = arr[4]}
if (/Active channel/ && earfcn == "") {split($0, arr, /:/); gsub(/ /, "", arr[2]); earfcn = arr[2]}
if (/QCSQ/ && csq == "") { split($0, arr, /[:,]/); rscp = arr[2]; sinr = arr[3]; rssi = arr[6] }
}
END {print lac "|" cid "|" earfcn "|" rssi "|" sinr "|" pci "|" bw "|" bwc "|" rsrp "|" rsrq "|" rscp "|" csq "|" lte_ca "|" cell "|" enbid}')
LAC=${1}; CID=${2}; EARFCN=${3}; CSQ_RSSI=${4}; SINR=${5}; PCI=${6}; BWDL=${7}; BWDx=${8}; RSRP=${9}; RSRQ=${10}; LTE_CA=${13}
CELL=${14}; ENBID=${15}
IFS="$OIFS"; unset OIFS
if [ $LTE_CA -ge 1 ]; then
OIFS="$IFS"; IFS="|"
set -- $(echo "$O" | awk -v bwc=${BWDx:-0} '
/^SCC\d info:/ {for(i=1; i<=NF; i++) { if($i ~ /LTE_B/) { gsub(/[^0-9]/, "", $i); scc = scc "+" $i}} bwca_raw += sprintf("%.0f", $8)
bwca=bwca_raw+bwc}
END { print scc "|" bwca }')
IFS="$OIFS"; unset BWDx OIFS
SCC=${1}; BWCA=${2}
fi
if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
LAC=$(printf %d 0x$LAC)
CID=$(printf %d 0x$CID)
fi
}
@@ -0,0 +1,12 @@
ATE0
AT+CSQ
AT+COPS=3,0; +COPS?
AT+CREG=2; +CREG?
AT+CGREG=2; +CGREG?
AT+CEREG=2; +CEREG?
AT$QCSQ
AT^DEBUG?
AT^CA_INFO?
AT+TEMP?
AT^TEMP?
AT+CGMI; +CGMM; +CGMR; +ICCID; +CGSN; +CIMI
@@ -0,0 +1,73 @@
function modem_data(){
generic_data
DATA=$(echo "$O" | grep -Ev '^$|^OK|^AT' | sort)
MANUF=$(echo "$DATA" | awk 'c&&! --c;/ZRSSI/{c=4}')
MODEL=$(echo "$DATA" | awk 'c&&! --c;/ZRSSI/{c=3}')
FW=$(echo "$DATA" | awk '/CGMR/{print $2}')
DEVICE="$MODEL"
TECH=$(echo "$DATA" | awk -F [,] '/\+COPS/{print $NF}')
ICCID=$(echo "$DATA" | awk '/ICCID:/{print $2}')
IMSI=$(echo "$DATA" | awk 'c&&! --c;/ZRSSI/{c=1}')
IMEI=$(echo "$DATA" | awk 'c&&! --c;/ZRSSI/{c=2}')
REGST=$(echo "$DATA" | awk -F[,] '/\'$CREG'/ {print $2}')
CHIPTEMP=$(echo "$DATA" | awk '/\+CPMUTEMP/{printf "%.0f\n", ($2/1000)}')
EARFCN=$(echo "$DATA" | awk -F[,\ ] '/^\+CPSI/ {print $9}')
case $TECH in
0|1) MODE=GSM ;;
2) MODE=WCDMA ;;
3) MODE=EDGE ;;
4) MODE=HSDPA ;;
5) MODE=HSUPA ;;
6) MODE=HSDPA,HSUPA ;;
7|9) MODE=LTE ;;
8) MODE=HSPA+ ;;
esac
case $TECH in
7|9)
PCI=$(echo "$DATA" | awk -F[,\ ] '/^\+CPSI/ {print $7}')
BWDL=$(echo "$DATA" |awk -F[,\ ] '/^\+CPSI/ {print $10}')
LAC=$(echo "$DATA" | awk -F [:,] '/\+CEREG/{gsub("\"","");print $4}')
CID=$(echo "$DATA" | awk -F [:,] '/\+CEREG/{gsub("\"","");print $5}')
ENBx=$(echo $CID | sed -e 's/..$//')
ENBID=$(printf %d 0x$ENBx)
CELL=$(printf %d 0x${CID: -2})
CSQ_RSSI=$(echo "$DATA" | awk -F [:,] '/\+ZRSSI/{print $4}')
RSRQ=$(echo "$DATA" | awk -F [:,] '/\+ZRSSI/{printf "%.0f\n", $3}')
RSRP=$(echo "$DATA" | awk -F [:,] '/\+ZRSSI/{printf "%.0f\n", $2}')
SINR=$(echo "$DATA" | awk -F[,\ ] '/^\+CPSI/ {printf "%.0f\n", $15}')
# Carrier Aggregation
SCx1=$(echo "$DATA" | awk -F [\:\;] '/ZCAINFO/{print $3}')
SCx2=$(echo "$DATA" | awk -F [\:\;] '/ZCAINFO/{print $4}')
SCC1=$(echo $SCx1 | awk -F [,] '{print $2}')
case $BWDL in
1) BWCx=3 ;;
2) BWCx=5 ;;
3) BWCx=10 ;;
4) BWCx=15 ;;
5) BWCx=20 ;;
esac
if [ $SCC1 -ne 0 ]; then
LTE_CA=1
for a in "$SCx1 $SCx2"; do
SCH=$(echo $a | awk -F[,] '{print $3}')
SCC="$SCC+$SCH"
SBW=$(echo $a | awk -F[,] '{print $5}')
BWCx=$(($BWCx+$SBW))
done
BWCA=$((BWCx+BWCA))
fi
;;
2|4|6|8)
LAC=$(echo "$DATA" | awk -F [:,] '/\+CGREG/{gsub("\"","");print $4}')
CID=$(echo "$DATA" | awk -F [:,] '/\+CGREG/{gsub("\"","");print $5}')
CSQ_RSSI=$(echo "$DATA" | awk -F [:,] '/\+ZRSSI/{print $2}')
SINR=$(echo "$DATA" | awk -F [:,] '/\+ZRSSI/{printf "%.0f\n", $3}')
;;
esac
if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
LAC=$(printf %d 0x$LAC)
CID=$(printf %d 0x$CID)
fi
}
@@ -0,0 +1,10 @@
ATE0
AT+COPS=3,0; +COPS?
AT+CREG=2; +CREG?
AT+CGREG=2; +CGREG?
AT+CEREG=2; +CEREG?; +CSQ
AT+CPSI?
AT+ZRSSI
AT+CGMI; +CGMM; +CGMR; +CIMI; +CGSN; +CICCID
AT+CPMUTEMP
AT+ZCAINFO?
@@ -0,0 +1,93 @@
# Fibocom modems NL668/NL678/NL952/FM150/FM190
function modem_data(){
generic_data
OIFS="$IFS"; IFS="|" # Get hw and sim info
# FIX regstate
REGST=$(echo "$O" | awk -F',' '/(\+CREG|\+CGREG|\+CEREG)/ {if (NF >= 5 && $NF ~ /^[0-9]$|^1[0-3]$/) {print $2; exit}}')
set -- $(echo "$O" | awk -F'[:,]' '
/\+CGMI/ {gsub("\"",""); manuf=$2}
/\+CGMM/ {gsub("\"",""); model=$2}
/\+CGMR/ {gsub("\"",""); fw=$2}
/\+CIMI/ {gsub("\"",""); imsi=$2}
/\+CGSN/ {gsub("\"",""); imei=$2}
/ICCID:/ {gsub("\r",""); iccid=$2}
/\+MTSM/ {temp = sprintf("%0.f\n", $2)}
END { print manuf "|" model "|" fw "|" imsi "|" imei "|" iccid "|" temp }')
DEVICE="${1} ${2}"; MANUF="${1}"; MODEL="${2}"; FW="${3}"; IMSI="${4}"; IMEI="${5}"; ICCID="${6}" CHIPTEMP=${7}
IFS="$OIFS"; unset OIFS
OIFS="$IFS"; IFS="|" # Get Signal info
set -- $(echo "$O" | awk -v model=$MODEL -v mode=$MODE '
BEGIN { map[15]=1; map[25]=2; map[50]=3; map[75]=4; map[100]=5 }
mode ~ /LTE/ { # LTE mode
if (/^\PCC:/ && model~/952|FM/) {split($0, ca, ","); pch = ca[3]; pcica = ca[2] }
if (/^\SCC\d/ && model~/952|FM/) {lte_ca++}
if (/^\+GTCAINFO: 1/) { lte_ca++; split($0, ca, ","); pch = ca[5]; pcica = ca[4] }
if (/\+GTCCINFO:/) { getline; getline; split($0, f, ",")
lac = (model~/952|FM/) ? sprintf("%d","0x"f[5]) : f[5]
cid = (model~/952|FM/) ? sprintf("%d","0x"f[6]) : f[6]
earfcn = (model~/952|FM/) ? sprintf("%d","0x"f[7]) : f[7]
pci = (model~/952|FM/) ? sprintf("%d","0x"f[8]) : f[8]
rsrq = sprintf("%.0f", -20 + (f[14]/2)); rsrp = sprintf("%.0f", f[13] - 140)
sinr = sprintf("%.0f", f[11]/4 + 5); bwc = f[10]; bw=map[bwc]}
}
mode !~ /LTE/ { # 3G mode
if (/CNTI/) { split($0, f, ",")
tech = f[2] }
if (/\+GTCCINFO:/) { getline; getline; split($0, f, ",")
lac = (model~/952|FM/) ? sprintf("%d","0x"f[5]) : f[5]
cid = (model~/952|FM/) ? sprintf("%d","0x"f[6]) : f[6]
earfcn = (model~/952|FM/) ? sprintf("%d","0x"f[7]) : f[7]
sinr = (model~/952|FM/) ? sprintf("%.0f", -24+(f[12]*24/255)) : sprintf("%.0f", -24+(f[14]*24/255))}
}
END { print earfcn "|" lac "|" cid "|" tech "|" rsrq "|" rsrp "|" sinr "|" pci "|" bwc "|" bw "|" lte_ca "|" pcica "|" pch }
')
# Define variables
EARFCN=${1}; LAC=${2}; CID=${3}; SINR=${7}
IFS="$OIFS"; unset OIFS
if [ "$MODE" = "LTE" ]; then
RSRQ=${5}; RSRP=${6}; PCI=${8}; BWDx=${9}; BWDL=${10}; PCICA=${12}; PCH=${13}; LTE_CA=${11}
ENBx=$(echo $CID | sed -e 's/..$//')
CELL=$(printf %d 0x${CID: -2})
ENBID=$(printf %d 0x$ENBx)
if [ "$EARFCN" = "$PCH" ] && [ "$PCI" = "$PCICA" ]; then
OIFS="$IFS"; IFS="|" # Get LTE-A bandwith and CA bands
set -- $(echo "$O" | awk -F'[,]' -v model="$MODEL" -v mode="$MODE" -v bwp="${BWDx:-0}" '
BEGIN { scc = ""; sum = 0; bwp_num = (bwp == 15 ? 1.3 : bwp/5) }
function earfcn_to_band(channel) {
if (channel <= 1) return ""
cmd = "/usr/share/modeminfo/scripts/ch_to_band " mode " " channel
cmd | getline band
close(cmd)
return band
}
{
if (model ~ /FM|952/ && /^SCC[0-9]+:/) {
chan_field = 5; bw_field = 6
} else if (/\+GTCAINFO: 2/) {
chan_field = 4; bw_field = NF
} else {
next
}
if ($chan_field > 1) {
band = earfcn_to_band($chan_field)
if (band != "") scc = scc "+" band
sum += $bw_field/5; bwca = sum + bwp_num
}
} END { print scc "|" bwca }
')
SCC=${1}; BWCA=${2}
IFS="$OIFS"; unset OIFS
fi
else
TECH=${4}
[ "x$TECH" != "x" ] && MODE="$TECH"
fi
if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
LAC=$(printf %d 0x$LAC); CID=$(printf %d 0x$CID)
fi
}
@@ -0,0 +1,13 @@
ATE0
AT+COPS=3,0; +COPS?; +CREG?
AT+CEREG=2; +CEREG?
AT+CGREG=2; +CGREG?; +CSQ
AT+GTCCINFO?; +GTCAINFO?
AT*CNTI=0
AT+MTSM=1
AT+CGMI?
AT+CGMM?
AT+CGMR?
AT+CIMI?
AT+ICCID
AT+CGSN?
@@ -0,0 +1,5 @@
# Generic modem data
modem_data(){
REGST=$(echo "$O" | awk -F[,] '/\+CREG/ {print $2}')
generic_data
}
@@ -0,0 +1,6 @@
ATE0
AT+CSQ
AT+COPS=3,0; +COPS?
AT+CREG=2; +CREG?
AT+CGREG=2; +CGREG?
AT+CGMI; +CGMM; +CGMR; +ICCID; +CGSN; +CIMI
@@ -0,0 +1,53 @@
function modem_data(){
DATA=$(echo "$O" | grep -Ev '^OK')
MANUF=$(echo "$DATA" | awk 'c&&! --c;/ZCHIPTEMP/{c=1}')
MODEL=$(echo "$DATA" | awk 'c&&! --c;/ZCHIPTEMP/{c=2}')
FW=$(echo "$DATA" | awk 'c&&! --c;/ZCHIPTEMP/{c=3}')
DEVICE="$MANUF $MODEL"
TECH=$(echo "$DATA" | awk -F [,] '/\+COPS/{print $NF}')
ICCID=$(echo "$DATA" | awk '/ZGETICCID/{print $2}')
IMSI=$(echo "$DATA" | awk 'c&&! --c;/ZGETICCID/{c=1}')
IMEI=$(echo "$DATA" | awk 'c&&! --c;/ZGETICCID/{c=2}')
CHIPTEMP=$(echo "$DATA" | awk '/\+ZCHIPTEMP/{print $2}')
case $TECH in
0|1) MODE=GSM ;;
2) MODE=WCDMA ;;
3) MODE=EDGE ;;
4) MODE=HSDPA ;;
5) MODE=HSUPA ;;
6) MODE=HSDPA,HSUPA ;;
7) MODE=LTE ;;
8) MODE=DC-HSPA+ ;;
esac
case $TECH in
7)
PCI=$(echo "$DATA" | awk -F [:,] '/\+ZCDS/{print $10}')
EEMGINFO=$(echo "$O" | awk -F[':'] '/^\+EEMLTESVC:/ {print $2}')
EARFCN=$(echo $EEMGINFO | awk -F [,] '{print $6}')
LAC=$(echo $EEMGINFO | awk -F [,] '{printf "%x\n", toupper($4)}')
CID=$(echo $EEMGINFO | awk -F [,] '{printf "%x\n", toupper($21)}')
ENBx=$(echo $CID | sed -e 's/..$//')
ENBID=$(printf %d 0x$ENBx)
CELL=$(printf %d 0x${CID: -2})
PCI=$(echo $EEMGINFO | awk -F [,] '{print $5}')
RSRQ=$(echo $EEMGINFO | awk -F[,] '{printf "%.0f\n", -19.5+$11/2}')
RSRP=$(echo $EEMGINFO | awk -F[,] '{print -140+$10'})
SINR=$(echo $EEMGINFO | awk -F[','] '{printf "%.0f\n", $12/4+5}')
BWDL=$(echo $EEMGINFO | awk -F[','] '{print $9}')
;;
2|4|5|6|8)
EEMGINFO=$(echo "$O" | awk -F[':'] '/^\+EEMUMTSSVC/ {print $2}')
EARFCN=$(echo $EEMGINFO | awk -F [,] '{print $20}')
SINR=$(echo $EEMGINFO | awk -F [,] '{printf "%.0f\n", -24+$6/2}')
LAC=$(echo $EEMGINFO | awk -F [,] '{printf "%x\n", toupper($16)}')
CID=$(echo $EEMGINFO | awk -F [,] '{printf "%x\n", toupper($17)}')
;;
esac
if [ $(uci -q get modeminfo.@generic[0].decimail) -eq 1 ]; then
LAC=$(printf %d 0x$LAC)
CID=$(printf %d 0x$CID)
fi
}
@@ -0,0 +1,5 @@
ATE0
AT+COPS=3,0; +COPS?; +CREG?; +CGREG?; +CGREG?; +CEREG?; +CSQ
AT+EEMGINFO?
AT+ZCHIPTEMP?
AT+CGMI; +CGMM; +CGMR; +ZGETICCID; +CIMI ;+CGSN
@@ -0,0 +1,68 @@
# Huawei modems
function modem_data(){
# Get hw and sim info
OIFS="$IFS"; IFS="|"
set -- $(echo "$O" | awk -F [:] -v fam=$FAMILY '
BEGIN { IGNORECASE=1 }
$0 ~ fam { gsub(",", "")
manuf = $1 $2
if ((getline line) > 0) model = line
if ((getline line) > 0) fw = line
}
/ICCID/ { split($0, parts, /:[[:space:]]*/)
iccid = parts[2]
if ((getline line) > 0) imsi = line
if ((getline line) > 0) imei = line
}
/^\^CHIPTEMP/ {n=split($0, t, ",")
temp=sprintf("%.0f", t[n]/10)
}
END { print model "|" fw "|" iccid "|" imsi "|" imei "|" temp "|" manuf}
')
MANUF=${7}; MODEL=${1}; FW=${2}; ICCID=${3}; IMSI=${4}; IMEI=${5}; CHIPTEMP=${6}
IFS="$OIFS"; unset OIFS
DEVICE="$MANUF $MODEL"
# get signal info
OIFS="$IFS"; IFS="|"
set -- $(echo "$O" | awk -v mode="$MODE" '
BEGIN {
tmap[1]="GSM"; tmap[2]="GPRS"; tmap[3]="EDGE"; tmap[4]="UMTS"; tmap[5]="HSDPA"; tmap[6]="HSUPA"
tmap[7]="HSPA"; tmap[9]=tmap[17]=tmap[18]="HSPA+"
bmap[1400]=0; bmap[3000]=1; bmap[5000]=2; bmap[10000]=3; bmap[15000]=4; bmap[20000]=5
}
/^\^SYSINFOEX/{ gsub("\"",""); n=split($0, m, ",")
mode=m[n]; tech=m[6]
if (length(mode) == 0) mode=tmap[tech]
}
/^\+CGREG/ {gsub("\"","");split($0, r, ","); gsub("\"","")
lac=r[3]; cid=r[4]
cell = sprintf("%d", "0x" substr(cid, length(cid) - 1, 2))
enbid = sprintf("%d", "0x" substr(cid, 1, length(cid) - 2))
}
/^\^HFREQINFO/{split($0, r, ",")
earfcn=r[4]
}
/^\^MONSC/{ split($0, r, ",")
pci=r[6]
if (earfcn !~ "") earfcn=r[5]
}
/^\^HCSQ:/{split($0, r, ",")
rssi=-121+r[2]
if (mode ~ /LTE/)sinr=sprintf("%.0f", -20+r[4]/5); rsrp=-141+r[2]; rsrq=-20+r[5]/2
if (mode ~ /WCDMA|UMTS|3G|HS/) sinr=sprintf("%.0f",-32+a[4]); rscp=-121+a[3]
}
/^\^HFREQINFO/ { split($0, r, ",")
bwc=r[6]/1000; bw=bmap[r[6]]
}
END {print mode "|" lac "|" cid "|" earfcn "|" rssi "|" sinr "|" rsrp "|" rsrq "|" pci "|" cell "|" enbid "|" bw }
')
MODE=${1}; LAC=${2}; CID=${3}; EARFCN=${4}; CSQ_RSSI=${5}; SINR=${6}; RSRP=${7}; RSRQ=${8}; PCI=${9}; CELL=${10}; ENBID=${11} BWDL=${12}
IFS="$OIFS"; unset OIFS
if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
LAC=$(printf %d 0x$LAC)
CID=$(printf %d 0x$CID)
fi
}
@@ -0,0 +1,13 @@
ATE0
AT+COPS=3,0
AT+COPS?; +CREG?; +CSQ
AT+CGREG=2
AT+CGREG?; ^MONSC
AT^HFREQINFO?
AT^SYSINFOEX
AT^LTERSRP?
AT^CSNR?
AT^HCSQ?
AT^CHIPTEMP?
AT^SYSCFGEX?
AT+CGMI; +CGMM; +CGMR; ^ICCID?; +CIMI; +CGSN
@@ -0,0 +1,122 @@
# Parser DATA form XMM and T7xx modems
# copyright by Konstantine Shevlakov (koshev-msk) 2026
function modem_data(){
generic_data
# hwdata
OIFS="$IFS";IFS="|"
set -- $(echo "$O" | awk '
/\+GTPKGVER:/{gsub("\"","");fw=$2}
/CGMI:/ {gsub("\"|\r","",$0); split($0,a,":"); manuf=a[2]}
/GMM:/ {gsub("\"|\r","",$0); split($0,a,/[:,]/); model=a[2]}
/CCID:/ {iccid=$2; getline imsi; getline imei}
/\+MTSM:/ {split($0,a,":"); temp=a[2]}
END { print manuf "|" model "|" fw "|" iccid "|" imsi "|" imei "|" temp }
')
DEVICE="$(echo ${1} ${2})"; FW=${3}; ICCID=${4}; IMSI=${5}; IMEI=${6}; CHIPTEMP=${7}
IFS="$OIFS"; unset OIFS
# signal data
OIFS="$IFS";IFS="|"
set -- $(echo "$O" | awk -v mode=$MODE '
# define maps and variables
BEGIN {
map[1]=15; map[2]=25; map[3]=50; map[4]=75; map[5]=100
csq_range["black"] = "0:0"; csq_range["red"] = "1:10"
csq_range["orange"] = "11:20"; csq_range["green"] = "21:50"
rsrp = bwc = csq = rssi = csq_per = 0; csq_col = "black";
}
# text color percentage
function get_csq_color(csq_raw_val) {
if (csq_raw_val == "") return "black"
csq_num = csq_raw_val + 0
for (color in csq_range) {
split(csq_range[color], limits, ":")
min = limits[1] + 0; max = limits[2] + 0
if (csq_num >= min && csq_num <= max) {return color}
} return "black"
}
# lte mode
mode ~ /LTE/ {
if (/\+CEREG/){gsub("\"","");split($0,a,",");reg=a[2];lac=a[3]; cid=a[4]}
if (/\+XLEC:/){gsub("\r","");split($0,a,/[:,]/);lte_ca=a[3]-1;bw=a[4];bwc=map[bw]}
if (/\+RSRP:/){split($0,a,/[:,]/);pci=a[2];earfcn=a[3];rsrp=sprintf("%.0f",a[4])}
if (/\+RSRQ:/){split($0,a,/[:,]/);rsrq=sprintf("%.0f",a[4])}
if (/\+XMCI: 4/){gsub(/"/,"");split($0,a,/[:,]/)
pci=sprintf("%d", a[7]);sinr=sprintf("%.0f", a[13]/4+5)
distance=sprintf("%.2f", (a[14]*78/1000))
}
# RSSI not correct sending via modem. Calc manually.
csq_raw=sprintf("%.0f", ((rsrp+10*log(12*bwc)/log(10))+113)/2)
csq = (csq_raw > 50) ? 50 : csq = csq_raw
csq_col = get_csq_color(csq)
csq_per = (csq > 30) ? 100 : sprintf("%.0f", csq*100/31); rssi=(2*csq-113)
}
# 3g mode
mode !~ /LTE/{
if (/\+CREG/){gsub("\"","");split($0,a,",");reg=a[2];lac=a[3];cid=a[4]}
if (/\+RSCP:/){split($0,a,",");earfcn=a[2]}
if (/\+XMCI: 2/) {n=split($0,a,",");sinr_raw=a[n-1]; rssi_raw=a[n-2]; sinr = sprintf("%.0f", (sinr_raw*24)/24-50); rssi = (rssi_raw*64/64-110)
csq=rssi_raw/2; csq_col = get_csq_color(csq); csq_per = (csq > 30) ? 100 : sprintf("%.0f", csq*100/31)}
rsrp=""
}
END {print reg "|" earfcn "|" lac "|" cid "|" rssi "|" sinr "|" rsrp "|" rsrq "|" bw "|" bwc "|" pci "|" lte_ca "|" csq_col "|" csq_per "|" distance}
')
REGST=${1}; EARFCN=${2}; LAC=${3}; CID=${4}; CSQ_RSSI=${5}; SINR=${6}; RSRP=${7}; RSRQ=${8}; BWDL=${9}; BWCx=${10}
PCI=${11}; LTE_CA=${12}; CSQ_COL=${13}; CSQ_PER=${14}; DISTANCE=${15}
IFS="$OIFS"; unset OIFS
if [ $MODE = LTE ]; then
ENBx=$(echo $CID | sed -e 's/..$//')
CELL=$(printf %d 0x${CID: -2})
ENBID=$(printf %d 0x$ENBx)
OIFS="$IFS";IFS="|"
set -- $(echo "$O"| awk -F [:,] -v lte_ca=$LTE_CA -v mode="$MODE" '
# define maps and variables
BEGIN { map[1]=3; map[2]=5; map[3]=10; map[4]=15; map[5]=20; scc = "" }
function earfcn_to_band(channel, cmd, band) {
if (channel == "" || channel == "0") return "N/A"
cmd = "/usr/share/modeminfo/scripts/ch_to_band " mode " " channel
cmd | getline band
close(cmd)
return (band != "" ? band : "")
}
# find secondary CA bands
/\+RSRP:/ {
for (i = 1; i <= lte_ca; i++) {
field_num = 6 + 3 * (i - 1)
if (field_num <= NF) {
earfcn = $field_num; band = earfcn_to_band(earfcn)
if (band != "") {
scc = (scc == "") ? "+" band : scc "+" band
}
}
}
}
# bandwith summ CA
/\+XLEC/ {
gsub("\r", "", $0); bwca = 0
if (lte_ca >= 1 && NF >= 5) {
val1 = $4 + 0; val2 = $5 + 0
if (val1 in map) bwca += map[val1]
if (val2 in map) bwca += map[val2]
}
for (i = 2; i <= lte_ca; i++) {
field_num = 4 + i # 6, 7, 8, ...
if (field_num <= NF) {
val = $(field_num) + 0
if (val in map) {
bwca += map[val]
}
}
}
}
END { print scc "|" bwca }
')
SCC=${1}; BWCA=${2}
IFS="$OIFS"; unset OIFS
fi
if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
LAC=$(printf %d 0x$LAC)
CID=$(printf %d 0x$CID)
fi
}
@@ -0,0 +1,9 @@
ATE0
AT+COPS=3,0; +COPS?
AT+CEREG=2; +CEREG?
AT+CREG=2; +CREG?; +CSQ?
AT+XCESQ?; +RSRP?; +RSRQ?; +RSCP?
AT+XLEC?
AT+MTSM=1
AT+XMCI=1
AT+GTPKGVER?; +CGMI; +GMM?; +CCID; +CIMI; +CGSN
@@ -0,0 +1,106 @@
# Fibocom FM350 parse data
#
function ch_to_band(){
/usr/share/modeminfo/scripts/ch_to_band $1 $2
}
function modem_data(){
generic_data
# get hw and sim data
IFS="$IFS";IFS="|"
set -- $(echo "$O" | awk -F [:] '
{ gsub(/"/, ""); sub(/^[[:space:]]+/, "", $2);sub(/[[:space:]]+$/, "", $2)
if (/GTPKGVER/) { fw = $2 }
if (/CGMI/) { manuf = $2 }
if (/CGMM/) { model = $2 }
if (/CGMR/) { version = $2 }
if (/CIMI/) { imsi = $2 }
if (/ICCID/) { iccid = $2 }
if (/CGSN/) { imei = $2 }
if (/GTSENRDTEMP/) {n=split($0,t,","); temp=sprintf("%.0f", t[n]/1000)}
}
END { print manuf "|" model "|" fw "|" iccid "|" imsi "|" imei "|" temp }
')
MANUF=${1}; MODEL=${2}; FW=${3}; ICCID=${4}; IMSI=${5}; IMEI=${6}; CHIPTEMP=${7}
IFS="$OIFS"; unset OIFS
DEVICE="$MANUF $MODEL"
# Get signal info
IFS="$IFS";IFS="|"
set -- $(echo "$O" | awk -v mode="$MODE" -F [,] '
BEGIN {
bmap[15]=1; bmap[25]=2; bmap[50]=3; bmap[75]=4; bmap[100]=5
nmap[15]=3; nmap[25]=5; nmap[50]=10; nmap[75]=15; nmap[100]=20
csq_range["black"] = "0:0"; csq_range["red"] = "1:10"
csq_range["orange"] = "11:20"; csq_range["green"] = "21:50"
}
# text color percentage
function get_csq_color(csq_raw_val) {
if (csq_raw_val == "") return "black"
csq_num = csq_raw_val + 0
for (color in csq_range) {
split(csq_range[color], limits, ":")
min = limits[1] + 0; max = limits[2] + 0
if (csq_num >= min && csq_num <= max) {return color}
} return "black"
}
mode ~ /LTE/ { gsub("\"",""); gsub(/[[:space:]]+/, "")
if (/\+CEREG/){ gsub("\"","")
reg=$2; lac=$3; cid=$4
}
if (/^\+CESQ/){split ($1, r, ":")
rssi=r[2]-110; csq_raw = sprintf("%.0f", (rssi + 113)/2); csq=(csq_raw>30) ? 30 : csq_raw
csq_col=get_csq_color(csq); csq_per=sprintf("%.0f", csq*100/31)
}
if(/\+GTCCINFO:/){ getline; earfcn=$7; rsrq=sprintf("%.0f", -20+($14/2)); rsrp=sprintf("%.0f", $13-140)
sinr=sprintf("%.0f",($11/4)+5); pci=$8; bw=bmap[$10]; bwc=nmap[$10]
}
if (/SCC/){lte_ca++}
cell = sprintf("%d", "0x" substr(cid, length(cid) - 1, 2))
enbid = sprintf("%d", "0x" substr(cid, 1, length(cid) - 2))
}
mode !~ /LTE/{
if (/\+CGREG/){ gsub("\"","")
reg=$2; lac=$3; cid=$4
}
if (/^\+CESQ/){
rssi=sprintf("%.0f",((95*$3)/96-120)); csq_raw = sprintf("%.0f", (rssi + 113)/2); csq=(csq_raw>30) ? 30 : csq_raw
csq_col=get_csq_color(csq); csq_per=sprintf("%.0f", csq*100/31); sinr=sprintf("%.0f",(24*$4)/49-24)
}
if(/\+GTCCINFO:/){ getline; earfcn=$7 }
}
END { print reg "|" lac "|" cid "|" earfcn "|" rssi "|" sinr "|" rsrp "|" rsrq "|" pci "|" bw "|" bwc "|" lte_ca "|" csq_col "|" csq_per "|" enbid "|" cell }
')
REGST=${1}; LAC=${2}; CID=${3}; EARFCN=${4}; CSQ_RSSI=${5}; SINR=${6}; RSRP=${7}; RSRQ=${8}; PCI=${9}; BWDL=${10}; BWDx=${11}
LTE_CA=${12}; CSQ_COL=${13}; CSQ_PER=${14}; ENBID=${15}; CELL=${16}
IFS="$OIFS"; unset OIFS
# Calc LTE CA
if [ "$LTE_CA" -ge "1" ]; then
IFS="$IFS";IFS="|"
set -- $(echo "$O" | awk -v mode=$MODE -v bwcx=$BWDx -F [,] '
BEGIN { sum = 0 }
function earfcn_to_band(channel, cmd, band) {
if (channel == "" || channel == "0") return "N/A"
cmd = "/usr/share/modeminfo/scripts/ch_to_band " mode " " channel
cmd | getline band
close(cmd)
return (band != "" ? band : "")
}
/SCC/{ scc = scc "+" earfcn_to_band($5); scc_ca += $6/5; bwca=bwcx+scc_ca }
END { print scc "|" bwca }
')
SCC=${1}; BWCA=${2}
IFS="$OIFS"; unset OIFS
fi
if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
LAC=$(printf %d 0x$LAC)
CID=$(printf %d 0x$CID)
fi
}
@@ -0,0 +1,7 @@
ATE0
AT+COPS=3,0; +COPS?
AT+CEREG=2; +CEREG?
AT+CGREG=2; +CGREG?; +CESQ
AT+GTCCINFO?; +GTCAINFO?
AT+GTSENRDTEMP=1
AT+GTPKGVER?; +CGMI?; +CGMM?; +CGMR?; +CIMI?; +ICCID; +CGSN?
@@ -0,0 +1,71 @@
# Meiglink modems
function modem_data(){
generic_data
# hwinfo
OIFS="$IFS"; IFS="|"
set -- $(echo "$O" | awk '
/^\+CGMI:/ {manuf = $2" "$3}; /^\+CGMM:/ {model = $2}; /^\+CGMR:/ {fw = $2}; /^\+TEMP:.*cpuss-usr/ {gsub("\"",""); split($2,t,","); temp = t[2]}
/^[0-9]{15}$/ {
if (!imsi) imsi = $0; else if (!imei) imei = $0
} /^ICCID:/ { iccid = $2; sub(/\r$/, "", iccid)
} END { print manuf "|" model "|" fw "|" imsi "|" imei "|" iccid "|" temp } ')
DEVICE="${1} ${2}"; FW=${3}; IMSI=${4}; IMEI=${5}; ICCID=${6}; CHIPTEMP=${7}
IFS="$OIFS"; unset OIFS
# signal info
OIFS="$IFS"; IFS="|"
set -- $(echo "$O" | awk -F'[\,]' '
/^\$QCSQ/ {split(substr($0, index($0,":")+1), a, ","); qcsq = a[1]; ecio = $2}
/^\+CSQ:/ {split($1,b,":\ "); csq = b[2]}
/^\^CELLINFO:/ {
split($1, p, ":"); mode = p[2]
if (mode == "LTE") {
lte_ca++
lac_h = sprintf("%X", $9); cid_h = sprintf("%X", $5); sinr = sprintf("%.0f", $17/5 - 20)
rfcn = $12; rssi = $14; rsrp = $15; rsrq = $16; pci = $6; bw = ($11==15 ? 3 : $11/5)
bwc_map[20] = 5; bwc_map[15] = 4; bwc_map[10] = 3; bwc_map[5] = 2; bwc_map[1.3] = 1
bwc = bwc_map[bw]
print mode "|" rfcn "|" lac_h "|" cid_h "|" rssi "|" sinr "|" rsrp "|" rsrq "|" \
pci "|" bw "|" bwc "|" qcsq "|" csq "|" lte_ca
} else if (mode ~ /WCDMA|UMTS/) {
lac_h = sprintf("%X", $6); cid_h = sprintf("%X", $7)
rfcn = $9; rssi = qcsq; sinr = ecio
print mode "|" rfcn "|" lac_h "|" cid_h "|" rssi "|" sinr
} else {
lac_h = sprintf("%X", $6); cid_h = sprintf("%X", $7)
rfcn = $9; rssi = qcsq
print mode "|" rfcn "|" lac_h "|" cid_h "|" rssi
}
exit
} END {if (!mode) print "NO_CARRIER"}')
MODE="${1}" EARFCN=${2}; LAC=${3}; CID=${4}; CSQ_RSSI=${5}
IFS="$OIFS"; unset OIFS
case $MODE in
*LTE*)
SINR=${6}; RSRP=${7}; RSRQ=${8}; PCI=${9}; BWC=${10}; BWDL=${11}; LTE_CA=${14}
CELL=$(printf %d 0x${CID: -2})
ENBx=$(echo $CID | awk '{print $1}' | sed -e 's/..$//' )
ENBID=$(printf %d 0x$ENBx)
LTE_CA=$(echo "$O" | awk '/\^CELLINFO: / {print $0}' | wc -l)
if [ $LTE_CA -gt 0 ]; then
OIFS="$IFS"; IFS="|"
LTE_CA=1; OIFS="$IFS"; IFS="|"
set -- $(echo "$O" | awk -v bwdl=${BWC:-0} -F [,]'
/^\^CELLINFO: "SCC"/{bands = bands "+" $7; sum+=$6/5; bwca=sum+bedl}
END{print bands "|" bwca}
')
BWCA=${1}; SCC=${2}
IFS="$OIFS"; unset OIFS BWC
fi
;;
WCDMA|UMTS) SINR=${6} ;;
esac
unset OIFS
if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ] ; then
LAC=$(printf "%d" 0x${LAC})
CID=$(printf "%d" 0x${CID})
fi
}
@@ -0,0 +1,6 @@
ATE0
AT+COPS=3,0; +COPS?; +CREG?; +CGREG=2; +CGREG?; +CEREG?; +CSQ
AT$QCSQ
AT^CELLINFO=1; ^CELLINFO=3
AT+TEMP
AT+CGMI; +CGMM; +CGMR; +CIMI; +ICCID; +CGSN
@@ -0,0 +1,99 @@
# MikroTik R11e-LTE, R11e-LTE6 modem (plat.ver."OpenWrt-18.06.7" router: MikroTik RBM33")
# NEED REWRITE FUNCTION for atinout compatible!!!
function modem_data() {
O=$(echo "$O" | grep -Ev '^$|^OK|^AT' | sort)
TECH=$(echo "$O" | awk -F[,] '/^\+COPS/ {print $4}')
FW=$(echo "$O" | awk '/^\+CGMR/{gsub("\"|\r","",$0); print $2}')
REGST=$(echo "$O" | awk -F[,] '/\+CREG/{print $2}')
EEMGSTATE=-1
case "$TECH" in
0*|1*) # GSM, GSM Compact
MODE="GSM"
EEMGSTATE=0
;;
2*) # UTRAN
MODE="UMTS"
EEMGSTATE=0
;;
3*) # GSM w/EGPRS
MODE="EDGE"
EEMGSTATE=0
;;
4*|5*) # UTRAN w/HSDPA, UTRAN w/HSUPA
MODE="HSDPA"
EEMGSTATE=1
;;
6*) # UTRAN w/HSDPA and HSUPA
MODE="HSUPA"
EEMGSTATE=1
;;
7*) # E-UTRAN
MODE="LTE"
EEMGSTATE=2
;;
8*) # UTRAN HSPA+
MODE="HSPA"
EEMGSTATE=2
;;
*)
MODE="--"
;;
esac
DEVx="$(echo "$O" | awk -F [:,] '/CGMI:|GMM:/{gsub("\"|\r","",$0);print substr($2,2);}')"
DEVICE=$(echo $DEVx)
IMEI=$(echo "$O" | awk -F [:,] '/\+CGSN:/{gsub(" ","", $2); print $2}')
# Need Chenges
IMSI=$(echo "$O" | awk -F [:,] '/\+CIMI/{gsub(" ","", $2); print $2}')
ICCID=$(echo "$O" | awk -F [:,] '/\+ICCID/{gsub(" ","", $2); print $2}')
CSQ_RSSI=$(echo "$O" | awk -F[':,'] '/^\+CESQ:/ {print $2}')
ECIO=$(echo "$O" | awk -F[':,'] '/^\+CESQ:/ {print $5}')
# If less than 11 -> error
if [ "x$CSQ_RSSI" != "x" ]; then
CSQ_RSSI=$(echo $CSQ_RSSI | awk '{if((110 - $1) > 11) print 110 - $1; else print "";}')
fi
if [ "x$ECIO" != "x" ]; then
ECIO=$(echo $ECIO | awk '($1 < 255) {print 25 - $1 * 0.5}')
fi
# LTE Engineering Mode
if [ $EEMGSTATE -eq 2 ]; then
EEMGINFO=$(echo "$O" | awk -F[':'] '/^\+EEMLTESVC:/ {print $2}')
if [ "x$EEMGINFO" != "x" ]; then
BW=$(echo $EEMGINFO | awk -F[','] '{print $8}')
BWDL=$(echo $EEMGINFO | awk -F[','] '{print $9}')
PCI=$(echo $EEMGINFO | awk -F [,] '{print $5}')
RSRP=$(echo $EEMGINFO | awk -F[','] '{print -140+$11}')
RSRQ=$(echo $EEMGINFO | awk -F[','] '{printf "%.0f\n", -19.5+$11/2}')
SINR=$(echo $EEMGINFO | awk -F[','] '{printf "%.0f\n", ($13/4+5)}')
COPS_MCC=$(echo $EEMGINFO | awk -F[','] '{print $1}')
COPS_MNC=$(echo $EEMGINFO | awk -F[','] '{print $3}')
LAC=$(echo "$O" | awk -F [,] '/^\+CREG/{print toupper($3)}')
CID=$(echo "$O" | awk -F [,] '/^\+CREG/{print toupper($4)}')
ENBx=$(echo $CID | sed -e 's/..$//')
ENBID=$(printf %d 0x$ENBx)
CELL=$(printf %d 0x${CID: -2})
EARFCN=$(echo $EEMGINFO | awk -F[','] '{print $6}')
fi
# UMTS Engineering Mode
elif [ $EEMGSTATE -eq 1 ]; then
COPS_NUM=$(echo "$O" | awk -F[":"] '/^\+EEMUMTSSV:/ {print $2}')
if [ "x$EEMGINFO" != "x" ]; then
COPS_MCC=$(echo $EEMGINFO | awk -F[','] '{print $11}')
COPS_MNC=$(echo $EEMGINFO | awk -F[','] '{print $12}')
fi
# GSM Engineering Mode
elif [ $EEMGSTATE -eq 0 ]; then
COPS_NUM=$(echo "$O" | awk -F[":"] '/^\+EEMGINFOSVC:/ {print $2}')
if [ "x$EEMGINFO" != "x" ]; then
COPS_MCC=$(echo $EEMGINFO | awk -F[','] '{print $1}')
COPS_MNC=$(echo $EEMGINFO | awk -F[','] '{print $2}')
fi
fi
if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
LAC=$(printf %d 0x$LAC)
CID=$(printf %d 0x$CID)
fi
COPS=$(awk -F[\;] '/'$COPS_NUM'/ {print $2}' $RES/mccmnc.dat)
if [ "x$COPS" = "x" ]; then
COPS="$COPS_MCC $COPS_MNC"
fi
}
@@ -0,0 +1,10 @@
ATE0
AT+COPS=3,0; +COPS?
AT+CREG=2; +CREG?
AT+CGREG=2; +CGREG?
AT+CEREG=2; +CEREG?
AT+CESQ
AT+EEMOPT=1
AT+EEMGINFO?
AT+CGMI; +CGMM; +CGMR; +CGSN; +CIMI
AT+ICCID
@@ -0,0 +1,52 @@
# Qualcomm Modems (FoxConn T77W678, Telit LN940, HP LT4220)
function modem_data(){
generic_data
# hwinfo and siminfo
OIFS="$IFS"; IFS="|"
set -- $(echo "$O" | awk -v fam="$FAMILY" '
($0 ~ fam){manuf =$0; getline model; getline fw}
/ICCID:/{split($0,i,":");gsub("\r",""); iccid=i[2]; getline imsi; getline imei}
/tsens_tz_sensor0:/{split($0,i,":");temp=i[2]}
END{print manuf "|" model "|" fw "|" iccid "|" imsi "|" imei "|" temp}
')
MANUF=${1}; MODEL=${2}; FW=${3}; ICCID=${4}; IMSI=${5} IMEI=${6}; CHIPTEMP=${7}
IFS="$OIFS"; unset OIFS
DEVICE="$MANUF $MODEL"
OIFS="$IFS"; IFS="|"
# signal
set -- $(echo "$O" | awk -v mode="$MODE" '
BEGIN { map[3]=1; map[5]=2; map[10]=3; map[15]=4; map[20]=5 }
mode ~ /LTE/ { # LTE mode
if (/\+CEREG/){gsub("\"",""); split($0,i,","); reg=i[2]; lac=i[3]; cid=i[5]}
if (/RFSTS:/){ getline; split($0,i,","); earfcn=i[2]; rssi=sprintf("%.0f",i[4]); rsrp=sprintf("%.0f",i[3])
sinr=sprintf("%.0f",i[16]/4+5); rsrq=sprintf("%.0f",i[5]); pci=i[11]
}
if (/SCC/){lte_ca++}
if (/PCC info/){bwc=sprintf("%.0f",$(NF-1)); bw=map[bwc]}
cell = sprintf("%d", "0x" substr(cid, length(cid) - 1, 2))
enbid = sprintf("%d", "0x" substr(cid, 1, length(cid) - 2))
}
mode !~ /LTE/ { # 3G mode
if (/\+CREG/){gsub("\"",""); split($0,i,","); reg=i[2]; lac=i[3]; cid=i[4]}
if (/RFSTS:/){ getline; split($0,i,","); earfcn=i[2]; rssi=sprintf("%.0f",i[6]); sinr=sprintf("%.0f",i[4])}
}
END { print reg "|" earfcn "|" lac "|" cid "|" rssi "|" sinr "|" rsrp "|" rsrq "|" pci "|" bw "|" bwc "|" lte_ca "|" enbid "|" cell}
')
EARFCN=${2}; LAC=${3}; CID=${4}; CSQ_RSSI=${5}; SINR=${6}; RSRP=${7}; RSRQ=${8}; PCI=${9}; BWDL=${10}; BWDx=${11}; LTE_CA=${12}; ENBID=${13}; CELL=${14}
IFS="$OIFS"; unset OIFS
# LTE CA calc
if [ $LTE_CA -ge 1 ]; then
OIFS="$IFS"; IFS="|"
set -- $(echo "$O" | awk -v bwc=${BWDx:-0} '
/^SCC\d info:/ {for(i=1; i<=NF; i++) { if($i ~ /LTE_B/) { gsub(/[^0-9]/, "", $i); scc = scc "+" $i}}
bwca_raw += sprintf("%.0f", $8); bwca=bwca_raw+bwc }
END { print scc "|" bwca }')
SCC=${1}; BWCA=${2}
IFS="$OIFS"; unset OIFS BWDx
fi
if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
LAC=$(printf %d 0x$LAC)
CID=$(printf %d 0x$CID)
fi
}
@@ -0,0 +1,10 @@
ATE0
AT+COPS=3,0; +COPS?
AT+CREG=2; +CREG?
AT+CGREG=2; +CGREG?
AT+CEREG=2; +CEREG?
AT+CSQ
AT^RFSTS?
AT^CA_INFO?
AT+CGMI; +CGMM; +CGMR; +ICCID; +CIMI; +CGSN
AT+TEMP
@@ -0,0 +1,78 @@
# Quectel modems
function modem_data(){
generic_data
O=$(echo "$O" | grep -Ev '^$|OK')
# hwinfo
OIFS="$IFS"; IFS="|"
set -- $(echo "$O" | awk -v fam="$FAMILY" '
BEGIN { IGNORECASE=1; temp_found = 0 }
!temp_found && /\+QTEMP:/ {
sub(/.*\+QTEMP:[^0-9]*/, "")
temp = $0+0
temp_found = 1
}
/ICCID:/ {
gsub(/"/, "", $0)
split($0, parts, /:[[:space:]]*/)
if (parts[2] != "") {
iccid = parts[2]
}
}
$0 ~ fam && manuf == "" {
manuf = $1
if ((getline line) > 0) {
model = line
if ((getline line) > 0) fw = line
if ((getline line) > 0) imsi = line
if ((getline line) > 0) imei = line
}
}
END {
if (!temp_found) temp = "N/A"
print manuf "|" model "|" fw "|" iccid "|" imsi "|" imei "|" temp
}')
MANUF=${1}; MDL=${2}; FW=${3} ICCID=${4}; IMSI=${5}; IMEI=${6} CHIPTEMP=${7}
IFS="$OIFS"; unset OIFS
DEVICE="$MANUF $MDL"
# signal info
OIFS="$IFS"; IFS="|"
set -- $(echo "$O" | awk -v mode="$MODE" -v model="$MDL" -F "," '
$0 ~ /^\+QENG/ {
if (mode == "") { mode = gsub("\"",""); mode=$3 }
if (mode ~ /LTE/) {
lac=$13; cid=$7; earfcn=$9; sinr=$(NF-1); rsrp=$(NF-4); rsrq=$(NF-3)
bw=$11; bwc=bw*5-5; pci=$8
if (model !~/EC200/){ # EC200 send incorrect RSSI value, use value from AT+CSQ
rssi=$(NF-2)
}
cell = sprintf("%d", "0x" substr(cid, length(cid) - 1, 2))
enbid = sprintf("%d", "0x" substr(cid, 1, length(cid) - 2))
}
else {
lac=$6; cid=$7; earfcn=$8; sinr=$13
if (model !~/EC200/){ # EC200 send incorrect RSSI value, use value from AT+CSQ
rssi=$11; sinr=$12
}
}
}
/^\+QCAINFO/{lte_ca++}
END { print lac "|" cid "|" earfcn "|" rssi "|" sinr "|" rsrp "|" rsrq "|" bw "|" bwc "|" pci "|" lte_ca "|" enbid "|" cell}
')
LAC=${1}; CID=${2}; EARFCN=${3}; [ "${4}" != "" ] && CSQ_RSSI=${4}; SINR=${5}; RSRP=${6} RSRQ=${7}
BWDL=${8}; BWDx=${9}; PCI=${10}; LTE_CA=${11}; ENBID=${12}; CELL=${13}
IFS="$OIFS"; unset OIFS
if [ $LTE_CA -ge 2 ]; then
OIFS="$IFS"; IFS="|"
set -- $(echo "$O" | awk -v bwdl=$BWDL -F [,] '/^\+QCAINFO.*"scc"/{for(i=1;i<=NF;i++) if($i~/BAND/){gsub(/[^0-9]/,"",$i); scc = scc"+"$i}
{bwcx+=$3/5; bwca=bwcx + (bwdl==1 ? 3 : bwdl*5 - 5)}
} END{print scc "|" bwca }')
SCC=${1}; BWCA=${2}
IFS="$OIFS"; unset OIFS
fi
if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
LAC=$(printf %d 0x$LAC)
CID=$(printf %d 0x$CID)
fi
}
@@ -0,0 +1,9 @@
ATE0
AT+COPS=3,0; +COPS?; +CREG?; +CGREG?; +CEREG?; +CSQ
AT+QENG="servingcell"
AT+QCAINFO
AT+QTEMP
AT+ICCID
AT+CGMI; +CGMM; +CGMR
AT+CIMI
AT+CGSN
@@ -0,0 +1,65 @@
modem_data(){
# hwdata
OIFS="$IFS"
IFS="|"
set -- $(echo "$O" | awk -v family=$FAMILY '
BEGIN{IGNORECASE=1} $0 ~ family {manuf=$0; getline model; getline fw}
/^ICCID:/{iccid=$2; getline imsi; getline imei}
/Temperature:/{temp=$5}
END { print manuf "|" model "|" fw "|" iccid "|" imsi "|" imei "|" temp}')
MANUF=${1}; MODEL=${2}; FW=${3}; ICCID=${4}; IMSI=${5}; IMEI=${6}; CHIPTEMP=${7}
IFS="$OIFS"
unset OIFS
DEVICE="$MANUF $MODEL"
# Sierra cell data
TECH=$(echo "$O" | awk -F[,\ ] '/^\*CNTI/ {print $3}' | sed 's|/|,|g')
OIFS="$IFS"
IFS="|"
set -- $(echo "$O" | awk -v tech=$TECH -v model=$MODEL '
BEGIN { map[3]=1; map[5]=2; map[10]=3; map[15]=4; map[20]=5 }
tech ~ "LTE" {
if (/^\+CEREG/ && model ~ /73|74/) {gsub("\"","");split($0,a,","); lac=a[3]; cid=a[5]}
if (/^\+CEREG/ && model !~ /73|74/) {gsub("\"","");split($0,a,","); lac=a[3]; cid=a[4]}
if (/LTE bw/) {bwc = $6; bw = map[bwc]}
if (/LTE Rx chan:/) { earfcn=$4 }
if (/LTE CA state:/) { ca = $4; lte_ca = (ca ~ /INACTIVE|NOT/) ? 0 : 1 }
if (/PCC RxM RSSI:/){rssi=$4; rsrp=$7}
if (/RSRQ/) {rsrq = sprintf("%.0f",$3); getline; sinr = sprintf("%.0f",$3);exit}
}
tech !~ "LTE" {
if (/^\+CGREG/) {gsub("\"","");split($0,a,","); lac=a[3]; cid=a[4]}
if (/channel:/) {earfcn=$3}
if (/QCSQ/) {split($0,a,",|:"); rssi=a[2]; sinr=a[3]}
}
END { print earfcn "|" lac "|" cid "|" rssi "|" sinr "|" rsrp "|" rsrq "|" bwc "|" bw "|" lte_ca}')
EARFCN=${1}; LAC=${2}; CID=${3}; CSQ_RSSI=${4}; SINR=${5}; RSRP=${6}; RSRQ=${7}; BWDx=${8}; BWDL=${9}; LTE_CA=${10}
unset OIFS
if [ "x$TECH" != "x" ]; then
MODE="$TECH"
case $MODE in
NONE) MODE=LTE ;;
esac
fi
if [ $MODE = "LTE" ]; then
ENBx=$(echo $CID | sed -e 's/..$//')
CELL=$(printf %d 0x${CID: -2})
ENBID=$(printf %d 0x$ENBx)
PCI=$(echo "$O" | awk -F [:,] '/QCRSRQ:/{print $2}')
if [ $LTE_CA -ge 1 ]; then
SCC=$(echo "$O" | awk -F [:] '/LTE Scell band/{gsub("B","");printf "%s", "+"$NF} END{print ""}')
[ $SCC ] || SCC=$(echo "$O" | awk '/LTE SCC[1-5] band:/{gsub("B", ""); printf "%s", "+"$NF} END{print ""}')
case $MODEL in
*73*|*74*) BWCA=$(echo "$O" | awk -v bwdx=$BWDx -F [:] '/LTE Scell bw:/{sum += $2} END{print sum + bwdx}') ;;
*) BWCA=$(echo "$O" | awk -v bwdx=$BWDx '/LTE SCC[1-9] bw/{sum += $5} END{print sum + bwdx}') ;;
esac
fi
fi
if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
LAC=$(printf %d 0x$LAC)
CID=$(printf %d 0x$CID)
fi
}
@@ -0,0 +1,11 @@
ATE0
AT+COPS=3,0;+COPS?
AT+CREG=2;+CREG?
AT+CGREG=2;+CGREG?
AT+CEREG=2;+CEREG?
AT+CSQ
AT*CNTI=0
AT!GSTATUS?
AT$QCRSRQ?
AT$QCSQ
AT+CGMI; +CGMM; +CGMR; +ICCID; +CIMI; +CGSN
@@ -0,0 +1,75 @@
# SimCom SIM7600E-H
modem_data(){
# get hardware info
set -- $(echo "$O" | awk -v fam="$FAMILY" '
BEGIN {cnt=0; OFS="\n"}
$0 ~ fam {cnt++; if(cnt==1) manuf=$0; if(cnt==2) model=$0}
/^\+CGMR:/ {split($0,a,":"); fw=a[2]; getline; if($0~/^[0-9]{15}$/) imsi=$0}
/^\+ICCID:/ {split($0,a,":"); iccid=a[2]; getline; if($0~/^[0-9]{15}$/) imei=$0}
/^\+CPMUTEMP/ {split($0,a," "); temp=a[2]}
/^\+CNSMOD/ {split($0, a, "[, ]"); tech = a[3]
modes[1] = "GSM"; modes[2] = "GPRS"; modes[3] = "EDGE"; modes[4] = "UMTS"; modes[5] = "HSDPA"
modes[6] = "HSUPA"; modes[7] = "HSPA"; modes[8] = "LTE"
tech_first = substr(tech, 1, 1)
mode = (tech_first in modes) ? modes[tech_first] : "--" }
END {print manuf, model, fw, iccid, imsi, imei, temp, tech, mode}')
DEVICE="${1} ${2} ${3}"; FW="${4}"; ICCID="${5}"; IMSI="${6}"; IMEI="${7}"; CHIPTEMP=${8}; TECH=${9}; MODE="${10}"
# get signal info
set -- $(echo "$O" | awk -F[,\ ] -v tech="$TECH" '
/^\+CPSI:/ && tech ~ /^8/ { # LTE Mode
earfcn = $9; csq_rssi = sprintf("%.0f", $14/10)
rsrp = sprintf("%.0f", $13/10)
rsrq = sprintf("%.0f", $12/10)
sinr = sprintf("%.0f", ($15*2)-20)
pci = $7; bwdl = $10; bwul = $11
} /^\+CPSI:/ && tech ~ /^[4-7]/ { # 3G Mode
earfcn = $8; sinr = sprintf("%.0f", (-$10 < -24) ? -24 : (-$10 > 0) ? 0 : -$10)
} /^\+CPSI:/ && tech ~ /^[1-3]/ { # 2G Mode
earfcn = $7
} /^\+CEREG:/ && tech ~ /^[4-8]/ { # LTE/3G Mode
lac = $4; cid = $5
} /^\+CREG:/ && tech ~ /^[1-3]/ { # 2G Mode
lac = $3; cid = $4
} END {print earfcn, lac, cid, csq_rssi, sinr, rsrp, rsrq, pci, bwdl, bwul}')
EARFCN=${1}; LAC=${2}; CID=${3}; CSQ_RSSI=${4}
case "$TECH" in
8*)
SINR=${5}; RSRP=${6}; RSRQ=${7}; PCI=${8}; BWDL=${9}
ENBx=$(echo $CID | sed -e 's/..$//')
CELL=$(printf %d 0x${CID: -2})
ENBID=$(printf %d 0x$ENBx)
LTE_CA=$(echo "$O" | grep -i CA_Scell | wc -l)
if [ $LTE_CA -gt 0 ]; then
LTE_CA=1
SCC=$(echo "$O" | awk -F'[,]' -v mode="$MODE" '
/CA_Scell/ && $3 > 1 {
cmd = "/usr/share/modeminfo/scripts/ch_to_band " mode " " $3
cmd | getline band
close(cmd)
printf "%s%s", (++n?"+":""), band }')
BWCA=$(echo "$O" | awk -F '[:,]' -v bwdl="$BWDL" '
BEGIN { ca_count = 0; bwca = 0
# Convert value to bandwith
bw_conv[1] = 3; bw_conv[2] = 5; bw_conv[3] = 10; bw_conv[4] = 15; bw_conv[5] = 20
main_bw = (bwdl in bw_conv) ? bw_conv[bwdl] : 0
} /CA_Scell/ { ca_count++; bw = $6
if (bw in bw_conv) {
bwca += bw_conv[bw] }
} END { has_ca = (ca_count > 0) ? 1 : 0; total_bw = has_ca ? (bwca + main_bw) : 0
print has_ca, total_bw }')
fi
;;
4*|5*|6*|7*) SINR=${5} ;;
esac
LAC_NUM=$(printf %d 0x$LAC)
CID_NUM=$(printf %d 0x$CID)
if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
LAC=$LAC_NUM
CID=$CID_NUM
fi
}
@@ -0,0 +1,8 @@
ATE0
AT+COPS=3,0; +COPS?
AT+CREG=2; +CREG?
AT+CGREG=2; +CGREG?
AT+CEREG=2; +CEREG?; +CSQ
AT+CNSMOD?; +CPSI?; +CPMUTEMP
AT+CMGRMI=4
AT+CGMI; +CGMM; +CGMR; +CIMI; +ICCID; +CGSN
@@ -0,0 +1,50 @@
# Expample parser file
# define function "modem_data"
# optionally include function "generic_data"
# finction generic data declare next variables:
# MODE="LTE" - form: AT+COPS: 0,1,"Provider GSM",7 last arg
# CSQ=24 - form: AT+CSQ: 24,99 second arg
# CSQ_RSSI - calculate form: CSQ/31*100 in dBm
# CSQ_PER - calculate form: CSQ*2-113 in dB
# COPS - form: AT+COPS: 0,1,"Provider GSM",7 trid arg
# LAC - form: AT+CREG: CREG: 2,1,"ABCD","ABCDEF0" trid arg
# TAC - form: AT+CREG: CREG: 2,1,"ABCD","ABCDEF0" four arg
# incoming other data define variable "O"
function modem_data() {
generic_gata
#parse next variables:
#hardware modem and sim information
MANUF="Example Manufacturer" # Modem Manufacrurer. E.g Huawei
MODEL="Example Model" # Modem model. E.g ME909
FW="Firmware modem version"
ICCID="12345678901234567890" # 20 digit Integrated Circuit Card Identifier
IMSI="123456789012345" # 15 digit International Mobile Subscriber Identity
IMEI="123456789012345" # 15 digit International Mobile Equipment Identity
CHIPTEMP="50" # Chip Themperature integer celsius
#for LTE modem signal
EARFCN=3200 # E-UTRA Absolute Radio Frequency Channel Number.In LTE
RSRP=-96 # Reference Signal Received Power in dBm
RSRQ=-11 # Reference Signal Received Quality in dB
SINR=13 # Signal to Interference + Noise Ratio in dB
BWDL=3 # Bandwith Download channel: 1 - 3MHz; 2 - 5MHz; 3 - 10MHz; 4 - 15MHz; 5 - 20MHz
PCI=345 # Physical Cell ID
#for LTE-A (LTE+) signal
SCC=+7+1 # Lte CA Dowmload bands
BWCA=60 # LTE CA Summ download Bandwith: BWDL+(SCC1+SCCN) in MHz
# Calc next data
CELL=$(printf %d 0x${CID: -2}) # a unique number identifying a specific cell tower (base station) in a mobile network
ENBID=$(printf %d 0x$ENBx) # a type of cellular base station used in LTE networks
# for 3G/UMTS signal
EARFCN # UTRA Absolute Radio Frequency Channel Number.In 3G/UMTS/WCDMA
SINR # Energy per Chip to Interference/Noise ratio in 3G networks
# for 2G/EDGE
EARFCN # Absolute Radio Frequency Channel Number in 2G/GSM
# calc next variables for decimal show LAC/TAC option
if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
LAC=$(printf %d 0x$LAC) # decimal LAC (ABCD) 43981
CID=$(printf %d 0x$CID) # decimal CID (ABCDEF0) 180150000
fi
}
@@ -0,0 +1,9 @@
# A custom at commants respone modem to parse
ATE0
AT+CSQ
AT+COPS=3,0; +COPS?
AT+CREG=2; +CREG?
AT+CGREG=2; +CGREG?
AT+CEREG?
AT+CGMI; +CGMM; +CGMR; +ICCID; +CGSN; +CIMI
# Proprietary commands for parse
@@ -0,0 +1,60 @@
# STYX modems
function modem_data(){
generic_data
# hwinfo
MANUF=$(echo "$O" | grep -i $FAMILY)
MODEL=$(echo "$O" | grep -A1 -i $FAMILY | tail -1)
DEVICE="$MANUF $MODEL"
FW=$(echo "$O" | grep -A2 -i $FAMILY | tail -1)
ICCID=$(echo "$O" | awk -F [:] '/ICCID:/{gsub("\r","");print $2}')
IMSI=$(echo "$O" | grep -A3 -i $FAMILY | tail -1)
IMEI=$(echo "$O" | grep -A1 -i $ICCID | tail -1)
# signal info
if [ "$MODE" = "LTE" ]; then
EARFCN=$(echo "$O" | awk -F: '/DL CHANNEL:/ {print $2}')
RSRP=$(echo "$O" | awk -F: '/RSRP:/ {print $2}')
SINR=$(echo "$O" | awk -F: '/SINR:/ {printf $2/5-20}')
CID=$(echo "$O" | awk -F: '/CELL ID:/ {print $2}')
LAC=$(echo "$O" | awk -F[,\ ] '/\+CREG:/{print $5}')
ENBx=$(echo $CID | sed -e 's/..$//')
CELL=$(printf %d 0x${CID: -2})
ENBID=$(printf %d 0x$ENBx)
RSRQ=$(echo "$O" | awk -F: '/RSRQ:/ {print $2}')
BWUL=$(echo "$O" | awk -F: '/UL CHANNEL:/ {print $2}')
BWDL=$(echo "$O" | awk -F: '/DL CHANNEL:/ {print $2}')
elif [ "$MODE" = "WCDMA" ]; then
LAC=$(echo "$O" | awk -F[,\ ] '/\+CREG:/{print $5}')
CID=$(echo "$O" | awk -F: '/CELL ID:/ {print $2}')
EARFCN=$(echo "$O" | awk -F: '/DL CHANNEL:/ {print $2}')
ECIO=$(echo "$O" | awk -F: '/ECIO:/ {print $2}')
SINR=$ECIO
elif [ "$MODE" = "HDR" ]; then
LAC=$(echo "$O" | awk -F[,\ ] '/\+CREG:/{print $5}')
CID=$(echo "$O" | awk -F: '/SECTOR ID:/ {print $2}')
SINR=$(echo "$O" | awk -F: '/SINR:/ {printf $2/5-20}')
elif [ "$MODE" = "TDSCDMA" ]; then
LAC=$(echo "$O" | awk -F[,\ ] '/\+CREG:/{print $5}')
CID=$(echo "$O" | awk -F: '/CELL ID:/ {print $2}')
elif [ "$MODE" = "GSM" ]; then
LAC=$(echo "$O" | awk -F[,\ ] '/\+CREG:/{print $5}')
CID=$(echo "$O" | awk -F: '/CELL ID:/ {print $2}')
ECIO=$(echo "$O" | awk -F: '/ECIO:/ {print $2}')
SINR=$ECIO
else
LAC=$(echo "$O" | awk -F[,\ ] '/\+CREG:/{print $5}')
CID=$(echo "$O" | awk -F: '/BASIC ID:/ {print $2}')
ECIO=$(echo "$O" | awk -F: '/ECIO:/ {print $2}')
SINR=$ECIO
fi
# TEMP -> according to documentation rev.1.0
# the device does not provide temperature information.
LAC_NUM=$(printf %d 0x$LAC)
CID_NUM=$(printf %d 0x$CID)
if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
LAC=$LAC_NUM
CID=$CID_NUM
fi
}
@@ -0,0 +1,4 @@
ATE0
AT+COPS=3,0; +COPS?; +CREG=2; +CREG?; +CGREG?; +CEREG?; +CSQ
AT+PLMCELLINF?
AT+CGMI; +CGMM; +CGMR; +CIMI; +ICCID; +CGSN
@@ -0,0 +1,64 @@
modem_data(){
# hwinfo
O=$(echo "$O" | grep -Ev '^OK|^$|^NO|^ERR')
OIFS="$IFS"; IFS="|"
set -- $(echo "$O" | awk '
/^\+CEREG/{getline manuf; getline model; getline fw}
/ICCID/{iccid=$2;getline imei; getline imsi}
/^TSENS|xo_therm_buf:/{gsub("C", ""); temp=$2}
END {print manuf "|" model "|" fw "|" iccid "|" imei "|" imsi "|" temp}
')
MANUF=${1}; MODEL=${2}; FW=${3}; ICCID=${4}; IMEI=${5}; IMSI=${6}; CHIPTEMP=${7}
IFS=$OIFS; unset OIFS
DEVICE="$MANUF $MODEL"
# signal info
generic_data
OIFS="$IFS"; IFS="|"
set -- $(echo "$O" | awk -v mode="$MODE" '
BEGIN { map[3]=1; map[5]=2; map[10]=3; map[15]=4; map[20]=5 }
mode ~ /LTE/ { # LTE mode
if (/\+CEREG/) { gsub("\"",""); split($0,a,","); lac=a[3]; cid=a[4]}
if (/pcell:/) { f=1
for (i=1; i<=NF; i++) {
if ($i ~ /lte_band_width:/) { split($i, b, ":"); bwc_raw = b[2]; sub("MHz", "", bwc_raw)
bwc = sprintf("%.0f", bwc_raw);bw = map[bwc]
}
}; next }
if (/^scell:/) { f=0; next }
if (f && /channel:/) { split($0,a," "); earfcn=substr(a[1],9)+0; pci=substr(a[2],5)+0 }
if (f && /lte_rsrp:/) { split($0,a,","); rsrp=sprintf("%.0f", substr(a[1],10)+0); rsrq=sprintf("%.0f", substr(a[2],6)+0)}
if (f && /lte_snr:/) { split($0,a,","); sinr=sprintf("%.0f", substr(a[2],10)+0) }
if (/^SCC[0-9]+ info:/) { lte_ca++ }
if (/\+$QCSQ/) { split($0,a,","); rssi=a[5] }
}
mode !~ /LTE/{ # 3G mode
if (/\+CREG/) { gsub("\"",""); split($0,a,","); lac=a[3]; cid=a[4]}
if (/channel:/) {split($0,a,":"); earfcn=a[2]}
if (/\+$QCSQ/) { split($0,a,","); rssi=a[5] }
if (/cell1:/) { split($0,a,","); sinr=sprintf("%.0f", substr(a[3],6)) }
}
END { print earfcn "|" lac "|" cid "|" rssi "|" sinr "|" rsrp "|" rsrq "|" pci "|" bw "|" bwc "|" lte_ca }
')
EARFCN=${1}; LAC=${2}; CID=${3}; RSSI=${4}; SINR=${5}; RSRP=${6}; RSRQ=${7}; PCI=${8}; BWDL=${9}; BWDx=${10}; LTE_CA=${11}
IFS=$OIFS; unset OIFS
if [ "$MODE" = "LTE" ]; then
ENBx=$(echo $CID | sed -e 's/..$//')
CELL=$(printf %d 0x${CID: -2})
ENBID=$(printf %d 0x$ENBx)
# CA calc
if [ $LTE_CA -ge 1 ]; then
OIFS="$IFS"; IFS="|"
set -- $(echo "$O" | awk -v bwc=${BWDx:-0} '
/^SCC\d info:/ {for(i=1; i<=NF; i++) { if($i ~ /LTE_B/) { gsub(/[^0-9]/, "", $i); scc = scc "+" $i}}
bwca_raw += sprintf("%.0f", $8); bwca=bwca_raw+bwc}
END { print scc "|" bwca }')
IFS="$OIFS"; unset BWDx OIFS
SCC=${1}; BWCA=${2}
fi
fi
if [ $(uci -q get modeminfo.@general[0].decimail) -eq 1 ]; then
LAC=$(printf %d 0x$LAC)
CID=$(printf %d 0x$CID)
fi
}
@@ -0,0 +1,12 @@
ATE0
AT+COPS=3,0; +COPS?
AT+CSQ
AT+CREG=2; +CREG?
AT+CGREG=2; +CGREG?
AT+CEREG=2; +CEREG?
AT+CGMI; +CGMM; +CGMR
AT^DEBUG?
AT+ICCID; +CGSN; +CIMI
AT$QCSQ
AT^TEMP?
AT^CA_INFO?
@@ -0,0 +1,58 @@
function modem_data(){
generic_data
DATA=$(echo "$O" | grep -Ev '^$|^OK|^AT' | sort)
MANUF=$(echo "$DATA" | awk '/CGMI/{print $2}')
MODEL=$(echo "$DATA" | awk '/CGMM/{print $2}')
FW=$(echo "$DATA" | awk '/CGMR/{print $2}')
DEVICE="$MANUF $MODEL"
TECH=$(echo "$DATA" | awk -F [,] '/\+COPS/{print $(NF-1)}')
ICCID=$(echo "$DATA" | awk '/ICCID:/{print $2}')
IMSI=$(echo "$DATA" | awk '/CIMI/{print $2}')
IMEI=$(echo "$DATA" | awk '/CGSN/{print $2}')
REGST=$(echo "$DATA" | awk -F[,] '/\'$CREG'/ {print $2}')
CHIPTEMP=$(echo "$DATA" | awk '/\+GETPATEMP/{printf "%.0f\n", ($2/100)}')
EARFCN=$(echo "$DATA" | awk -F [:,] '/\+ZEMSCIQ/{print $9}')
case $TECH in
0|1) MODE=GSM ;;
2) MODE=WCDMA ;;
3) MODE=EDGE ;;
4) MODE=HSDPA ;;
5) MODE=HSUPA ;;
6) MODE=HSDPA,HSUPA ;;
7) MODE=LTE ;;
8) MODE=HSPA+ ;;
esac
case $TECH in
7)
PCI=$(echo "$DATA" | awk -F [:,] '/\+ZEMSCIQ/{print $8}')
BWDL=$(echo "$DATA" | awk -F[,] '/\+ZEMSCIQ/{print $13}')
LAC=$(echo "$DATA" | awk -F [:,] '/\+CEREG/{gsub("\"","");print $4}')
CID=$(echo "$DATA" | awk -F [:,] '/\+CEREG/{gsub("\"","");print $5}')
ENBx=$(echo $CID | sed -e 's/..$//')
ENBID=$(printf %d 0x$ENBx)
CELL=$(printf %d 0x${CID: -2})
CSQ_RSSI=$(echo "$DATA" | awk -F [:,] '/\+ZRSSI/{print $2}')
RSRQ=$(echo "$DATA" | awk -F [:,] '/\+ZEMSCIQ/{printf "%.0f\n", ($12/2-20)}')
RSRP=$(echo "$DATA" | awk -F [:,] '/\+ZEMSCIQ/{print ($11-140)}')
SINR=$(echo "$DATA" | awk -F [:,] '/\+ZSINR/{printf "%.0f\n", $2}')
CHIPTEMP=$((85-$CHIPTEMP))
;;
2|4|5|6|8)
#LAC=$(echo "$DATA" | awk -F [:,] '/\+CGREG/{gsub("\"","");print $4}')
#CID=$(echo "$DATA" | awk -F [:,] '/\+CGREG/{gsub("\"","");print $5}')
SINR=$(echo "$DATA" | awk -F [:,] '/\+ZEMSCIQ/{printf "%.0f\n", (($NF/2)-20)}')
;;
*)
LAC=$(echo "$DATA" | awk -F [:,] '/\+CGREG/{gsub("\"","");print $4}')
CID=$(echo "$DATA" | awk -F [:,] '/\+CGREG/{gsub("\"","");print $5}')
EARFCN=$(echo "$DATA" | awk -F [:,] '/\+ZEMSCIQ/{print $9}')
;;
esac
if [ $(uci -q get modeminfo.@general[0].decimail) -eq 1 ]; then
LAC=$(printf %d 0x$LAC)
CID=$(printf %d 0x$CID)
fi
}
@@ -0,0 +1,20 @@
ATE1
AT+COPS=3,0
AT+COPS?
AT+CREG=2
AT+CGREG=2
AT+CEREG=2
AT+CREG?
AT+CGREG?
AT+CEREG?
AT+CSQ
AT+ZRSSI
AT+ZSINR
AT+ZEMSCIQ=1
AT+CGMI
AT+CGMM
AT+CGMR
AT+CIMI
AT+ICCID
AT+CGSN
AT+GETPATEMP?
@@ -0,0 +1,54 @@
function modem_data(){
DATA=$(echo "$O" | grep -Ev '^OK')
MANUF=$(echo "$DATA" | awk 'c&&! --c;/ICCID/{c=1}')
MODEL=$(echo "$DATA" | awk 'c&&! --c;/ICCID/{c=2}')
FW=$(echo "$DATA" | awk 'c&&! --c;/ICCID/{c=3}')
DEVICE="$MANUF $MODEL"
TECH=$(echo "$DATA" | awk -F [,] '/\+COPS/{print $NF}')
ICCID=$(echo "$DATA" | awk '/ICCID/{print $2}')
IMSI=$(echo "$DATA" | awk 'c&&! --c;/ICCID/{c=5}')
IMEI=$(echo "$DATA" | awk 'c&&! --c;/ICCID/{c=4}')
# ToDO
#CHIPTEMP=$(echo "$DATA" | awk '/\+ZCHIPTEMP/{print $2}')
case $TECH in
0|1) MODE=GSM ;;
2) MODE=WCDMA ;;
3) MODE=EDGE ;;
4) MODE=HSDPA ;;
5) MODE=HSUPA ;;
6) MODE=HSDPA,HSUPA ;;
7) MODE=LTE ;;
8) MODE=DC-HSPA+ ;;
esac
case $TECH in
7)
PCI=$(echo "$DATA" | awk -F [:,] '/\+ZCDS/{print $10}')
EEMGINFO=$(echo "$O" | awk -F[':'] '/^\+EEMLTESVC:/ {print $2}')
EARFCN=$(echo $EEMGINFO | awk -F [,] '{print $6}')
LAC=$(echo $EEMGINFO | awk -F [,] '{printf "%x\n", toupper($4)}')
CID=$(echo $EEMGINFO | awk -F [,] '{printf "%x\n", toupper($21)}')
ENBx=$(echo $CID | sed -e 's/..$//')
ENBID=$(printf %d 0x$ENBx)
CELL=$(printf %d 0x${CID: -2})
PCI=$(echo $EEMGINFO | awk -F [,] '{print $5}')
RSRQ=$(echo $EEMGINFO | awk -F[,] '{printf "%.0f\n", -19.5+$11/2}')
RSRP=$(echo $EEMGINFO | awk -F[,] '{print -140+$10'})
SINR=$(echo $EEMGINFO | awk -F[','] '{printf "%.0f\n", $12/4+5}')
BWDL=$(echo $EEMGINFO | awk -F[','] '{print $9}')
;;
2|4|5|6|8)
EEMGINFO=$(echo "$O" | awk -F[':'] '/^\+EEMUMTSSVC/ {print $2}')
EARFCN=$(echo $EEMGINFO | awk -F [,] '{print $20}')
SINR=$(echo $EEMGINFO | awk -F [,] '{printf "%.0f\n", -24+$6/2}')
LAC=$(echo $EEMGINFO | awk -F [,] '{printf "%x\n", toupper($16)}')
CID=$(echo $EEMGINFO | awk -F [,] '{printf "%x\n", toupper($17)}')
;;
esac
if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
LAC=$(printf %d 0x$LAC)
CID=$(printf %d 0x$CID)
fi
}
@@ -0,0 +1,5 @@
ATE0
AT+COPS=3,0; +COPS?; +CREG?; +CGREG?; +CGREG?; +CEREG?; +CSQ
AT+EEMGINFO?
AT+CHIPTEMP?
AT+ICCID; +CGMI; +CGMM; +CGMR; +CIMI ;+CGSN
@@ -0,0 +1,56 @@
function modem_data(){
generic_data
DATA=$(echo "$O" | grep -Ev '^$|^OK' | sort)
MANUF=$(echo "$DATA" | awk 'c&&! --c;/ICCID/{c=2}')
MODEL=$(echo "$DATA" | awk 'c&&! --c;/ICCID/{c=1}')
FW=$(echo "$DATA" | awk 'c&&! --c;/ZRSSI/{c=3}')
DEVICE="$MANUF $MODEL"
TECH=$(echo "$DATA" | awk -F [,] '/\+COPS/{print $NF}')
ICCID=$(echo "$DATA" | awk '/ICCID:/{print $2}')
IMSI=$(echo "$DATA" | awk 'c&&! --c;/ZRSSI/{c=1}')
IMEI=$(echo "$DATA" | awk 'c&&! --c;/ZRSSI/{c=2}')
case $TECH in
0|1) MODE=GSM ;;
2) MODE=WCDMA ;;
3) MODE=EDGE ;;
4) MODE=HSDPA ;;
5) MODE=HSUPA ;;
6) MODE=HSDPA,HSUPA ;;
7) MODE=LTE ;;
8) MODE=DC-HSPA+ ;;
esac
case $TECH in
7)
PCI=$(echo "$DATA" | awk -F [:,] '/\+ZCELLINFO/{print $3}')
EARFCN=$(echo "$DATA" | awk -F [:,] '/\+ZCELLINFO/{print $5}')
LAC=$(echo "$DATA" | awk -F [:,] '/\+CEREG/{gsub("\"","");print $4}')
CID=$(echo "$DATA" | awk -F [:,] '/\+CEREG/{gsub("\"","");print $6}')
ENBx=$(echo $CID | sed -e 's/..$//')
ENBID=$(printf %d 0x$ENBx)
CELL=$(printf %d 0x${CID: -2})
CSQ_RSSI=$(echo "$DATA" | awk -F [:,] '/\+ZRSSI/{print $4}')
RSRQ=$(echo "$DATA" | awk -F [:,] '/\+ZRSSI/{print $3}')
RSRP=$(echo "$DATA" | awk -F [:,] '/\+ZRSSI/{print $2}')
SINR=$(echo "$DATA" | awk -F [:,] '/\+ZRSSI/{printf "%.0f\n", $5}')
;;
2|4|5|6|8)
LAC=$(echo "$DATA" | awk -F [:,] '/\+CGREG/{gsub("\"","");print $4}')
CID=$(echo "$DATA" | awk -F [:,] '/\+CGREG/{gsub("\"","");print $5}')
EARFCN=$(echo "$DATA" | awk -F [:,] '/\+ZCELLINFO/{print $4}')
SINR=$(echo "$DATA" | awk -F [:,] '/\+ZRSSI/{printf "%.0f\n", $3}')
;;
0|1|3)
CSQ_RSSI=$(echo "$DATA" | awk -F [:,] '/\+ZRSSI/{print $2}')
LAC=$(echo "$DATA" | awk -F [:,] '/\+CGREG/{gsub("\"","");print $4}')
CID=$(echo "$DATA" | awk -F [:,] '/\+CGREG/{gsub("\"","");print $5}')
EARFCN=$(echo "$DATA" | awk -F [:,] '/\+ZCELLINFO/{print $4}')
;;
esac
if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
LAC=$(printf %d 0x$LAC)
CID=$(printf %d 0x$CID)
fi
}
@@ -0,0 +1,7 @@
ATE0
AT+COPS=3,0; +COPS?
AT+CREG=2; +CREG?
AT+CGREG=2; +CGREG?
AT+CEREG=2; +CEREG?
AT+CSQ; +ZPAS?; +ZRSSI; +ZCELLINFO?
AT+CGMI; +CGMM; +CGMR; +CIMI; +ICCID; +CGSN
+52
View File
@@ -0,0 +1,52 @@
#!/usr/bin/awk -f
function find_band(value, bands) {
for (i in bands) {
split(bands[i], parts, /[-:]/)
if (value >= parts[1] && value <= parts[2]) {
return parts[3]
}
}
return ""
}
BEGIN {
if (ARGC < 3) {
print "Usage: " ARGV[0] " <MODE> <CHANNEL>"
exit 1
}
mode = ARGV[1]
value = ARGV[2]
ARGC = 1
# LTE Bands
lte_bands[0] = "0-599:1"
lte_bands[1] = "600-1199:2"
lte_bands[2] = "1200-1949:3"
lte_bands[3] = "1950-2399:4"
lte_bands[4] = "2400-2469:5"
lte_bands[5] = "2750-3449:7"
lte_bands[6] = "3450-3799:8"
lte_bands[7] = "6150-6449:20"
lte_bands[8] = "9210-9659:28"
lte_bands[9] = "9870-9919:31"
lte_bands[10] = "37750-38249:38"
lte_bands[11] = "38650-39649:40"
lte_bands[12] = "39650-41589:41"
# Other Bands
other_bands[0] = "1-124:GSM900"
other_bands[1] = "512-885:DCS1800"
other_bands[2] = "955-1023:DCS900"
other_bands[3] = "2937-3088:UMTS900"
other_bands[4] = "10562-10838:IMT2100"
if (mode ~ /^LTE/) {
result = find_band(value, lte_bands)
print (result != "" ? result : 0)
} else {
result = find_band(value, other_bands)
print (result != "" ? result : "")
}
}
@@ -0,0 +1,174 @@
# (c) 2010-2016 Cezary Jackiewicz <cezary@eko.one.pl>
# (c) 2020-2025 modified by Konstantine Shevlyakov <shevlakov@132lan.ru>
# (c) 2021-2025 modified by Vladislav Kadulin <spanky@yandex.ru>
RES="/usr/share/modeminfo"
#GSCRIPT="$RES/scripts/${FAMILY}.txt"
function get_device_info() {
DEVPORT=$(uci -q get modeminfo.@modeminfo[${s}].device)
case $DEVPORT in
!*tty*) get_port ;;
esac
modem_family
GSCRIPT="$RES/scripts/${FAMILY}.at"
O=$(atinout $GSCRIPT $DEVPORT - |grep -v '^$')
}
function get_port() {
devices="$(ls /dev/ttyUSB* /dev/ttyACM* /dev/ttyHS* 2>/dev/null | sort -r)"
for d in $devices; do
DEVPORT=$d gcom -s $RES/scripts/probeport.gcom > /dev/null 2>&1
if [ $? = 0 ]; then
uci set modeminfo.@modeminfo[${s}].device="$d"
uci commit modeminfo
break
fi
done
DEVPORT=$(uci -q get modeminfo.@modeminfo[${s}].device)
O=$(atinout $GSCRIPT $DEVPORT - |grep -v '^$')
}
function modem_family() {
FAMILY=$(uci -q get modeminfo.@modeminfo[${s}].device | awk -F/ -v res="$RES" '
function read_file(path) {
value = ""
if ((getline value < path) > 0) {
close(path)
return value
}
return ""
}
{
comport = $NF
if (comport ~ /ttyUSB|ttyHS/) {
device_path = "/sys/class/tty/" comport "/device/../.."
} else if (comport ~ /ttyACM/) {
device_path = "/sys/class/tty/" comport "/device/.."
} else {
print "GENERIC"
exit
}
vid = read_file(device_path "/idVendor")
pid = read_file(device_path "/idProduct")
if (vid == "" || pid == "") {
print "GENERIC"
exit
}
vidpid = vid pid
modem_list = res "/modem.list"
# Read modem.list file
while ((getline line < modem_list) > 0) {
if (line ~ /^#/ || line == "") continue
split(line, parts, ";")
if (parts[1] == vidpid) {
close(modem_list)
print toupper(parts[2])
exit
}
}
close(modem_list)
print "GENERIC"
}
')
}
# get CSQ
function get_csq(){
eval $(echo "$O" | awk -F[:,] '
/^\+CSQ/ {
csq = $2
if (csq == "" || csq < 0 || csq > 31) {
print "CSQ=-1; CSQ_PER=0; CSQ_COL=\"black\"; CSQ_RSSI=0"
exit
}
# Percentage calc
csq_per = int(csq * 100 / 31)
# Color
if (csq >= 20) csq_col = "green"
else if (csq >= 15) csq_col = "orange"
else if (csq >= 10) csq_col = "red"
else csq_col = "red"
# RSSI calc
csq_rssi = 2 * csq - 113
printf "CSQ=%d; CSQ_PER=%d; CSQ_COL=\"%s\"; CSQ_RSSI=%d", csq, csq_per, csq_col, csq_rssi
exit
}
END {
if (!csq) print "CSQ=-1; CSQ_PER=0; CSQ_COL=\"black\"; CSQ_RSSI=0"
}
')
}
# Get MCC or MNC
function get_cops() {
COPS=$(echo "$O" | awk -F[\"] '/^\+COPS:\s?.,[0-9]+/ {print $2}' | awk '{for(i=NF;i>=1;i--){w=tolower($i);if(!s[w]++)r=r?$i" "r:$i} print r}')
}
# Get Registration data
function get_reg_data(){
REGST=$(echo "$O" | awk -F',' '/\+CREG|\+CGREG|\+CEREG/ {print $2; exit}')
}
function generic_data(){
MODE=$(echo "$O" | awk -F, '
/^\+COPS/ {
modes["2"] = "UMTS"
modes["0"] = modes["3"] = "EDGE"
modes["4"] = "HSDPA"
modes["5"] = "HSUPA"
modes["6"] = "HSPA"
modes["7"] = modes["13"] = "LTE"
prefix = substr($4, 1, 1)
print (prefix in modes ? modes[prefix] : "--")
}')
}
# name device via mmcli utility
mmcli_name(){
MMCLI=$(uci -q get modeminfo.@modeminfo[${s}].mmcli_name)
if [ "$MMCLI" = "1" ]; then
if [ -x /usr/bin/mmcli ]; then
MODEM=$(mmcli -L | awk '{print $1}' | awk -F [/] '{print $NF}')
for mm in $MODEM; do
MMCLIMEI=$(mmcli -m $mm -J | jsonfilter -e '@["modem"].*["imei"]')
IMEI=$(echo $IMEI | tr -d ' ')
if [ "$IMEI" = "$MMCLIMEI" ]; then
MANUF=$(mmcli -m $mm -J | jsonfilter -e '@["modem"].*["manufacturer"]' | awk '{gsub("\r", ""); print $0}')
MODEL=$(mmcli -m $mm -J | jsonfilter -e '@["modem"].*["model"]' | awk '{gsub("\r", ""); print $0}')
if [ -n "$(echo "$MODEL" | grep "${MANUF}")" ]; then
DEVICE="$MODEL"
else
DEVICE="$MANUF $MODEL"
fi
fi
done
fi
fi
}
function get_data_in(){
modem_family
get_reg_data
get_cops
get_csq
if [ -f "$RES/scripts/${FAMILY}" ]; then
. $RES/scripts/$FAMILY
modem_data
else
generic_data
fi
mmcli_name
}
@@ -0,0 +1,14 @@
let $d = $env("DEVPORT")
if $d = "" goto timeout
open com $d
set com 57600n81
set senddelay 0.05
waitquiet 2 0.5
send "AT^m"
waitfor 2 "OK"
if % = -1 goto timeout
exit 0
:timeout
exit 1
+22
View File
@@ -0,0 +1,22 @@
#!/bin/sh
# Simple SNMP Script for modeminfo
# Exapmle configuration OpenWrt snmpd package
# file: /etc/config/snmpd
# config exec
# option name modem # Example name
# option prog /usr/share/snmpmodem.sh # This script
# option args 0 # Modem in system
# option miboid 1.3.6.1.2.1.25.1.9 # Example OID
if [ ! $1 ]; then
exit 0
fi
modeminfo | jsonfilter -e "@['modem'][$1]['device']" \
-e "@['modem'][$1]['cops']" \
-e "@['modem'][$1]['rssi']" \
-e "@['modem'][$1]['rsrp']" \
-e "@['modem'][$1]['rsrq']" \
-e "@['modem'][$1]['sinr']"