Мониторим данные с 3g/LTE роутера или модема

Лениво мне заходить на роутер чтобы посмотреть статистику, будем смотреть через Node-red

Проект тут. Поддерживаемое оборудование:

3G/LTE роутеры: Huawei B310s-22, B315s-22, B525s-23a, B525s-65a, B715s-23c, B528s, B535-232, B628-265, B818-263, E5186s-22a, E5576-320, E5577Cs-321 SoyeaLink B535-333
3G/LTE USB стики: (только в режиме «HiLink», не поддерживается режим serial mode) Huawei E3131, E3372, E3531
5G роутеры: Huawei 5G CPE Pro 2 (H122-373), 5G CPE Pro (H112-372)

Устанавливаем python3

sudo apt install -y python3 python3-pip

устанавливаем huawei-lte-api

pip3 install huawei-lte-api

делаем скрипт например с названием modem.py со следующим содержимым:

pause = 5 # периодичность отсылки данных
broker = 'localhost'
port = 1883
topic = "lte"
retain = True
# username = 'emqx'
# password = 'public'
lte_ip = "192.168.20.1"
lte_user = "admin"
lte_pass = "admin"

import random
import time
from huawei_lte_api.Client import Client
from huawei_lte_api.Connection import Connection
from paho.mqtt import client as mqtt_client

client_id = f'publish-{random.randint(0, 1000)}'

def connect_mqtt():
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(client_id)
# client.username_pw_set(username, password)
client.on_connect = on_connect
client.connect(broker, port)
return client

def publish(client):
msg_count = 1
while True:
with Connection("http://"+lte_user+":"+lte_pass+"@"+lte_ip+"/") as connection:
lteclient = Client(connection)
data3 = lteclient.device.signal()
data = lteclient.monitoring.traffic_statistics()
data2 = lteclient.monitoring.month_statistics()

msg = f"{data['CurrentUpload']}"
result = client.publish(topic+"/CurrentUpload", msg, qos=1, retain=retain)
msg = f"{data['CurrentDownload']}"
result = client.publish(topic+"/CurrentDownload", msg, qos=1, retain=retain)
msg = f"{data['TotalUpload']}"
result = client.publish(topic+"/TotalUpload", msg, qos=1, retain=retain)
msg = f"{data['TotalDownload']}"
result = client.publish(topic+"/TotalDownload", msg, qos=1, retain=retain)
msg = f"{data['CurrentConnectTime']}"
result = client.publish(topic+"/CurrentConnectTime", msg, qos=1, retain=retain)
msg = f"{data['CurrentDownloadRate']}"
result = client.publish(topic+"/CurrentDownloadRate", msg, qos=1, retain=retain)
msg = f"{data['CurrentUploadRate']}"
result = client.publish(topic+"/CurrentUploadRate", msg, qos=1, retain=retain)
msg = f"{data['TotalConnectTime']}"
result = client.publish(topic+"/TotalConnectTime", msg, qos=1, retain=retain)
msg = f"{data2['CurrentMonthDownload']}"
result = client.publish(topic+"/CurrentMonthDownload", msg, qos=1, retain=retain)
msg = f"{data2['CurrentMonthUpload']}"
result = client.publish(topic+"/CurrentMonthUpload", msg, qos=1, retain=retain)
msg = f"{data2['roam_month_download']}"
result = client.publish(topic+"/roam_month_download", msg, qos=1, retain=retain)
msg = f"{data2['roam_month_upload']}"
result = client.publish(topic+"/roam_month_upload", msg, qos=1, retain=retain)
msg = f"{data2['unroam_month_download']}"
result = client.publish(topic+"/unroam_month_download", msg, qos=1, retain=retain)
msg = f"{data2['unroam_month_upload']}"
result = client.publish(topic+"/unroam_month_upload", msg, qos=1, retain=retain)
msg = f"{data2['MonthDuration']}"
result = client.publish(topic+"/MonthDuration", msg, qos=1, retain=retain)
msg = f"{data2['MonthLastClearTime']}"
result = client.publish(topic+"/MonthLastClearTime", msg, qos=1, retain=retain)
msg = f"{data2['CurrentDayUsed']}"
result = client.publish(topic+"/CurrentDayUsed", msg, qos=1, retain=retain)
msg = f"{data2['CurrentDayDuration']}"
result = client.publish(topic+"/CurrentDayDuration", msg, qos=1, retain=retain)
msg = f"{data3['rsrq']}"
result = client.publish(topic+"/rsrq", msg, qos=1, retain=True)
msg = f"{data3['rsrp']}"
result = client.publish(topic+"/rsrp", msg, qos=1, retain=True)
msg = f"{data3['rssi']}"
result = client.publish(topic+"/rssi", msg, qos=1, retain=True)
msg = f"{data3['sinr']}"
result = client.publish(topic+"/sinr", msg, qos=1, retain=True)

status = result[0]
if status == 0:
print(f"Send message")
else:
print(f"Failed to send message")
time.sleep(pause)

def run():
client = connect_mqtt()
client.loop_start()
publish(client)
client.loop_stop()

if __name__ == '__main__':
run()

в начале подставляем свои значения mqtt сервера и параметры роутера, если mqtt сервер имеет пароль то надо раскомментировать строки с именем пользователя и паролем и строку client.username_pw_set(username, password)

добавляем запуск проверяем работу запустив скрипт (путь к скрипту замените на свой)

/usr/bin/python3 /opt/modem/modem.py

если всё хорошо то Вы увидите вывод:

Connected to MQTT Broker!
Send message
Send message

и так до бесконечности, прерываем программу ctrl+c и добавляем в cron строку

@reboot /usr/bin/python3 /opt/modem/modem.py

или в /etc/rc.local строку перед строкой exit 0

/usr/bin/python3 /opt/modem/modem.py &&

перезапускаем и смотрим идут ли данные в mqtt например через mqtt Explorer

если всё хорошо то в node-red обрабатываем эти данные, в приведенном ниже потоке Node-red используются палитры node-red-contrib-ui-level и node-red-contrib-mysql-config

загружаем в Node-red поток если используете базу данных то создайте таблицу

CREATE TABLE `sensor` (
`id` int(11) NOT NULL,
`datetime` timestamp NOT NULL DEFAULT current_timestamp(),
`sensor` text NOT NULL,
`data` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

и данные будут записываться в таблицу и в dashboard Node-red будет отображатся статистика

ну и в базу будет записываться статистика

Мониторим данные с 3g/LTE роутера или модема

Навигация по записям