haas506 2.0开发教程-高级组件库-mqtt
最新案例教程点击下方链接跳转,CSDN已停止更新
点
击
跳
转
信号强度上传阿里云
案例说明:
- 通过mqtt连接阿里云后上传信号强度至物联网平台。
- 基于TCP的MQTT连接阿里云物联网平台,MQTT协议接入
- 阿里云物联网连接方式之一。(这种方式比较复杂,需要填入的参数较多)
(1)创建产品
- 使用物联网平台接入设备前,您需在物联网平台控制台创建产品和对应设备,获取设备证书(ProductKey和DeviceName)。
- 产品相当于一类设备的集合,同一产品下的设备具有相同的功能。您可以根据产品批量管理设备,如定义物模型、自定义Topic等。
- 您的每个实际设备需对应一个物联网平台设备。将物联网平台颁发的设备证书(ProductKey和DeviceName)烧录到设备上,用于设备连接物联网平台的身份验证。
操作步骤:
(1)在阿里云物联网平台创建产品
填写产品名称、选择自定义品类,选择直连设备,选择联网方式-蜂窝,数据格式-ICA,点击确认。
(2)编辑自定义功能
点击所建立的产品:选择查看、点击功能定义和选择编辑草稿
添加自定义功能:
- 物联网平台支持为产品定义物模型,将实际产品抽象成由属性、服务、事件所组成的数据模型,便于云端管理和数据交互。产品创建完成后,您可以为它定义物模型,产品下的设备将自动继承物模型内容。
- 填入属性、功能名称、标识符、数据类型、取值范围、读写类型,填写完拖到下方点击确定。
发布上线
(3)添加设备
在产品下,添加一个设备:选择产品名、填写DeviceName(自定义,最好将设备的IMEI作为该名称)
(4)获取三元组,以及mqtt参数。将数据填入代码中。
(2)代码
- 将三元组,mqtt参数填入程序指定位置。
- 2.2版本获取IMEI号接口有更新,需要更改以下内容(Ctrl+F 查找net)
#2.2版本改为
#from modem import net
...
# 上传数据
#2.2版本改为
#csq=net.getCsq()
- main.py
import utime as time
import net
#2.2版本改为
#from modem import net
import modem
import app_server_mqtt
import app_network
def main():
#填入三元组与MQTT参数
clientId="a1JuD7ay6Pj.861755054458994|securemode=2,signmethod=hmacsha256,timestamp=1652423486347|"
userName="861755054458994&a1JuD7ay6Pj"
password="e1ba32c57d0eac71c8c8352c50899ba184801fb68fdd38856a00edfa478ac740"
mqttHostUrl="a1JuD7ay6Pj.iot-as-mqtt.cn-shanghai.aliyuncs.com"
port=1883
productKey = 'a1JuD7ay6Pj'
deviceName = '861755054458994'
heartBeat=60
get_topic="/sys/{}/{}/thing/service/property/set".format(productKey,deviceName)
post_topic="/sys/{}/{}/thing/event/property/post".format(productKey,deviceName)
qos=1
# 连接网络
app_network.connect_network()
app_server_mqtt.mqtt_connect(clientId,userName,password,mqttHostUrl,port,heartBeat,get_topic,post_topic,qos)
# 上传数据
#2.2版本改为
#csq=net.getCsq()
csq=net.csqQueryPoll()
app_server_mqtt.update("CSQ",csq)
if __name__ == '__main__':
main()
time.sleep(2)
print('----------------------------------------------')
- app_network.py
import network
import utime as time
#联网状态标志
g_connect_status = False
def on_4g_cb(args):
global g_connect_status
pdp = args[0]
netwk_sta = args[1]
if netwk_sta == 1:
g_connect_status = True
else:
g_connect_status = False
def connect_network():
global Net,on_4g_cb,g_connect_status
Net = network.NetWorkClient()
g_register_network = False
if Net._stagecode is not None and Net._stagecode == 3 and Net._subcode == 1:
g_register_network = True
else:
g_register_network = False
if g_register_network:
Net.on(1,on_4g_cb)
Net.connect(None)
else:
print('network register failed')
while True:
if g_connect_status:
print('network register successed')
break
time.sleep_ms(20)
- app_server_mqtt.py
# -*- coding: UTF-8 -*-
import mqtt
import ujson
import utime as time
import _thread
# 定义subcribe的回调函数
def on_subcribe(topic,payload):
global client
global g_qos,g_post_topic
global zzio606Obj
print("on_subcribe: topic is:" + topic)
print("on_subcribe: payload is:" + payload)
def mqttloop_func(delay, id):
global client
global mqtt_state
global g_clientId,g_userName,g_password,g_mqttHostUrl ,g_port,g_heartBeat,g_get_topic,g_qos,g_post_topic
while True:
time.sleep_ms(delay)
# print('Running thread %d'%id)
# print("mqtt_state:",mqtt_state)
ret = client.loop(1000)
# print('client ret ={}'.format(ret))
if ret < 0:
print('------------------mqtt disconnect!')
update("OnlineState",0)
client.disconnect()
mqtt_reconnect(g_clientId,g_userName,g_password,g_mqttHostUrl ,g_port,g_heartBeat,g_get_topic,g_post_topic,g_qos)
else:
pass
def mqtt_reconnect(clientId,userName,password,mqttHostUrl,port,heartBeat,get_topic,post_topic,qos):
global client
global mqtt_state
global g_clientId,g_userName,g_password,g_mqttHostUrl ,g_port,g_heartBeat,g_get_topic,g_post_topic,g_qos
global zzio606Obj
g_clientId=clientId
g_userName=userName
g_password=password
g_mqttHostUrl=mqttHostUrl
g_port=port
g_heartBeat=heartBeat
g_get_topic=get_topic
g_post_topic=post_topic
g_qos=qos
client = mqtt.client(g_clientId)
client.on_subcribe(on_subcribe)
# 设置用户名和密码
client.username_pw_set(g_userName,g_password)
# 建立mqtt连接
ret = client.connect(g_mqttHostUrl,g_port,g_heartBeat)
if ret == 0:
mqtt_state = 1
update("OnlineState",1)
# 订阅服务
client.subscribe(g_get_topic,g_qos)
def mqtt_connect(clientId,userName,password,mqttHostUrl,port,heartBeat,get_topic,post_topic,qos):
mqtt_reconnect(clientId,userName,password,mqttHostUrl,port,heartBeat,get_topic,post_topic,qos)
#创建mqtt接收数据任务,1s一次
_thread.start_new_thread(mqttloop_func,(1000, 1))
def update(key,value):
data={}
data[key]=value
#上报 格式 可以参考这句话
#{"id":"2","version":"1.0","params":{"LBS": "(120.7396227,31.2741778)"},"sys":{"ack":1}}
send_data = {
"id":"1",
"version":"1.0",
"params":data,
"sys":{"ack":1}
}
MSG = ujson.dumps(send_data)
# 发布服务
client.publish(g_post_topic,MSG,g_qos)
- board.json
{
"version": "2.0.0",
"io": {
"LED11": {
"type": "GPIO",
"port": 36,
"dir": "output",
"pull": "pullup"
},
"modbus_485_4800":{
"type": "MODBUS",
"mode": 0,
"port": 2,
"baudrate": 4800,
"priority": 0,
"timeout": 200
},
"modbus_485_9600": {
"type": "MODBUS",
"mode": 0,
"port": 2,
"baudrate": 9600,
"priority": 0,
"timeout": 200
},
"serial1":{
"type":"UART",
"port":0,
"dataWidth":8,
"baudRate":9600,
"stopBits":1,
"flowControl":"disable",
"parity":"none"
},
"serial2":{
"type":"UART",
"port":1,
"dataWidth":8,
"baudRate":4800,
"stopBits":1,
"flowControl":"disable",
"parity":"none"
},
"serial3":{
"type":"UART",
"port":2,
"dataWidth":8,
"baudRate":9600,
"stopBits":1,
"flowControl":"disable",
"parity":"none"
}
},
"debugLevel": "ERROR",
"repl": "enable",
"replPort": 0
}
(3)在线调试
(1)烧录程序
(2)查看设备的物模型
2. Class-mqtt
mqtt.client
on_subcribe | username_pw_set | connect | subcribe | publish | loop | disconnect |
---|---|---|---|---|---|---|
设置MQTT订阅回调函数 | 设置用户名和密码 | MQTT连接 | MQTT订阅的主题 | MQTT发布主题 | 设置MQTT等待时间 | 断开MQTT连接 |
实例化:mq=mqtt.client(clientId)
参数:按照”xxxx|securemode=3,timestamp=1234567890,signmethod=hmacsha1|”格式填写,’xxxx’和timestamp可以任意填写
mq.on_subcribe(callback)
作用:设置MQTT订阅回调函数
参数:callback-订阅的回调函数,回调函数中可以接收云平台下发的指令,并实现相应的功能
返回:0成功,其他失败
mq.username_pw_set(username,password)
作用:设置用户名和密码
参数:username-用户名;password-密码
返回:0成功,其他失败
mq.connect(host,port,interval)
作用:MQTT连接
参数:host-连接的主机;port-连接的端口号;interval-重试周期,单位为毫秒
返回:0成功,其他失败
mq.subcribe(subtopic,qos)
作用:MQTT订阅的主题
参数:subtopic-MQTT订阅的主题;qos-服务质量
返回:0成功,其他失败
mq.publish(topic,payload,qos)
作用:MQTT发布主题
参数:topic-MQTT发布的主题;payload-MQTT发布的消息;qos-服务质量
返回:0成功,其他失败
mq.loop(timeout)
作用:设置MQTT等待时间
参数:timeout-等待时间,单位是毫秒
返回:0成功,其他失败
mq.disconnect()
作用:断开MQTT连接
返回:0成功,其他失败
3.总结
本节介绍了如何使用haas506高级组件库的mqtt模块,实现了连接阿里云物联网平台,并上传信号强度给平台物模型。