Лениво мне заходить на роутер чтобы посмотреть статистику, будем смотреть через 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 будет отображатся статистика
ну и в базу будет записываться статистика