pdf-icon

UIFlow Guide

UIFlow 1.0 Blockly

Event

Unit

UIFlow 1.0 Project

DTU NB IoT

案例程序

该程序通过NB-IoT DTU连接到MQTT服务器,订阅主题SubTopic,并在收到消息时打印主题和消息内容。按下按钮A时,随机生成一个整数并发布到主题PubTopic

from m5stack import *
from m5ui import *
from uiflow import *
from base.DTU_NB import DTU_NB

nb_topic = None
nb_msg = None
Rand = None

import random

def nbiot_mqtt_cb(nb_mq_topic, nb_mq_payload):
  global nb_topic, nb_msg, Rand
  nb_topic = nb_mq_topic
  nb_msg = nb_mq_payload
  print(nb_topic)
  print(nb_msg)
  pass

def buttonA_wasPressed():
  global nb_topic, nb_msg, Rand
  dtu_nb.mqtt_publish('PubTopic', str(Rand), 0)
  pass
btnA.wasPressed(buttonA_wasPressed)

dtu_nb = DTU_NB()
dtu_nb.mqtt_to_connect('mqtt.m5stack.com', 1883, 'm5mqtt9', '', '', 120)
print(dtu_nb.mqtt_check_connection())
print(dtu_nb.mqtt_subscribe('SubTopic', nbiot_mqtt_cb, 0))
while True:
  if (dtu_nb.mqtt_check_connection()) != None:
    Rand = random.randint(100000, 999999)
    dtu_nb.mqtt_poll()
  wait_ms(2)

功能说明

dtu_nb = DTU_NB()
  • 初始化 NB-IoT DTU 模块。
modbus = dtu_nb.modbus_init(23, 33, 115200, 1, 1)
  • 设置串口通信的 TX(发送引脚)、RX(接收引脚),波特率为 115200,模式为主设备(Master),以及从设备地址(Slave Addr)。
modbus.function_init(1, 0, 0)
  • 初始化 Modbus 功能码,用于读取线圈状态,指定起始地址和读取数量。
modbus._mdbus_uart.any()
  • 保持缓存,可能用于存储数据或其他信息。
dtu_nb.get_gprs_network_registration()
  • 检查 GPRS 网络注册状态,确保设备已连接至网络。
dtu_nb.get_network_registration()
  • 检查网络注册状态,确认设备是否已注册到网络。
dtu_nb.get_single_quality()
  • 检查信号质量,以评估设备的信号强度。
dtu_nb.check_status()
  • 检查模块状态,确保模块正常工作。
dtu_nb.coap_to_connect('120.77.157.90', 5683)
  • 使用 CoAP 协议连接到指定的 IP 地址和端口(此例中 IP 地址为 120.77.157.90,端口为 5683)。
dtu_nb.coap_destroy()
  • 销毁 CoAP 连接,用于关闭或重置 CoAP 会话。
dtu_nb.coap_get('/m5stack-get')
  • 发送 CoAP GET 请求到指定的 URL(如 /m5stack-get),并且指定安全性(此处为 None)。
dtu_nb.coap_post('/m5stack-post', '', content_format=0)
  • 发送 CoAP POST 请求到指定的 URL(如 /m5stack-post),附带有效负载(payload),内容格式为 TEXT_PLAIN,安全性为 None。
dtu_nb.coap_put('/m5stack-put', '', content_format=0)
  • 发送 CoAP PUT 请求到指定的 URL(如 /m5stack-put),附带有效负载(payload),内容格式为 TEXT_PLAIN,安全性为 None。
1-6,15-16
  • 读取或设置 Modbus 功能码,在该例中,选择了 READ_COILS_STATUS 作为功能码。
modbus.find_address
  • 获取从机的地址。
modbus.find_function
  • 获取当前功能码。
modbus.find_quantity
  • 用于获取当前的数量,可能用于读取从机的数据数量。
modbus.receive_req_create_pdu()
  • 接收ADU(Application Data Unit)请求,通常用于Modbus协议中的数据通信。
modbus.create_slave_response(1)
  • 发送ADU响应缓冲区中的数据,缓冲区大小为1。
modbus.update_process(1, 0, 0, [0, 0, 0])
  • 更新Modbus的功能,当前设置为READ_COILS_STATUS,可以指定起始地址、数量和更新的值,并创建一个包含数值的列表。
dtu_nb.mqtt_check_connection()
  • 检查MQTT的连接状态,确保与MQTT服务器的连接是否正常。
dtu_nb.mqtt_to_connect('mqtt.m5stack.com', 1883, '', '', '', 120)
  • 连接MQTT服务器,指定服务器地址(如mqtt.m5stack.com),端口(默认是1883),并且可以设置客户端ID、用户名、密码和保持连接时间(keepalive,单位为秒)。
dtu_nb.mqtt_disconnect()
  • 断开MQTT连接,与服务器断开连接。
dtu_nb.mqtt_poll()
  • 轮询下行消息,用于检查从MQTT服务器发送来的下行数据消息。
dtu_nb.mqtt_publish('', '', 0)
  • 发布主题消息到MQTT服务器,用户可以指定要发布的主题、消息的内容(payload),以及消息传递质量服务等级(QoS)。
dtu_nb.mqtt_subscribe('', nbiot_mqtt_cb, 0)
  • 订阅指定主题,用户可以选择订阅的主题名称以及消息传递质量服务等级(QoS)。
def nbiot_mqtt_cb(nb_mq_topic, nb_mq_payload):
  global nb_topic, nb_msg
  nb_topic = nb_mq_topic
  nb_msg = nb_mq_payload
  pass
  • 设置订阅的回调函数,当指定的主题收到消息时,会执行相应的处理,消息内容可以通过变量(如nb_msg)获取。
dtu_nb.mqtt_unsubscribe('')
  • 取消订阅指定主题。
dtu_nb.poweroff()
  • 关闭模块电源,用于节省能量或在不需要时关闭模块。
modbus._mdbus_uart.read()
  • 读取所有模块中的相关信息或数据。
modbus._mdbus_uart.readline()
  • 读取一行数据。
modbus._mdbus_uart.read(10)
  • 读取指定数量的字符(如读取10个字符)。
modbus.read_coils(1, 1, 0)
  • 读取线圈状态,指定从站地址、起始地址和线圈数量。
modbus.read_discrete_inputs(1, 1, 0)
  • 读取离散输入,指定从站地址、起始地址和输入数量。
modbus.read_holding_registers(1, 1, 0, True)
  • 读取保持寄存器,指定从站地址、起始地址、寄存器数量和数据是否为有符号数。
modbus.read_input_registers(1, 1, 0, True)
  • 读取输入寄存器,指定从站地址、起始地址、寄存器数量和数据是否为有符号数。
dtu_nb.reset()
  • 重置模块,执行模块的复位操作。
dtu_nb.set_command_echo_mode(0)
  • 设置命令回显模式(如开启或关闭回显)。
modbus._mdbus_uart.write('')
  • 在UART中写入指定内容。
modbus._mdbus_uart.write(''+"\r\n")
  • 在UART中写入一行内容。
modbus.write_multiple_coils(1, 1, 0)
  • 写入多个线圈,指定从站地址、起始地址和输出值。
modbus.write_multiple_registers(1, 1, 0, True)
  • 写入多个寄存器,指定从站地址、起始地址、寄存器值,并可以设置为有符号数或无符号数。
modbus._mdbus_uart.write(bytes([0, 0, 0]))
  • 在UART中写入原始数据,使用列表形式指定要写入的数值。
modbus.write_single_coil(1, 1, 0)
  • 写入单个线圈,指定从站地址、输出地址和输出值。
modbus.write_single_register(1, 1, 0, True)
  • 写入单个寄存器,指定从站地址、寄存器地址、寄存器值,并可以设置为有符号数或无符号数。
On This Page