mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-10-31 05:45:13 +08:00
🌴 Sync 2026-03-05 23:51:42
This commit is contained in:
1 parent
0d155c70be
commit
32600acc60
14258 files changed
+3954570
No files matched your search
Executable
+6
@@ -0,0 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /usr/share/libubox/jshn.sh
|
||||
|
||||
json_load "$(/usr/share/modeminfo/modeminfo)"
|
||||
json_dump
|
||||
+58
@@ -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
|
||||
Executable
+116
@@ -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
@@ -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
|
||||
Executable
+22
@@ -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']"
|
||||
|
||||
Reference in new issue
Block a user