haas506开发教程-高级组件库-mqtt
- 1.通过mqtt连接阿里云物联网平台
- 2.操作步骤
- 3. Class-mqtt
- 4.总结
1.通过mqtt连接阿里云物联网平台
- 案例说明
使用mqtt连接阿里云物联网平台,使用云服务,点亮/熄灭小灯 - main.py
# -*- coding: UTF-8 -*-
import mqtt
import ujson
import utime as time
import _thread
import network
from driver import GPIO
# 初始化GPIO
d2_led = GPIO()
cloud_led = GPIO()
d2_led.open("d2_led")
cloud_led.open("cloud_led")
#服务质量
qos = 1
#topic
_get_topic = "/sys/{}/{}/thing/service/property/set"
_update_topic = "/sys/{}/{}/thing/event/property/post"
#联网状态标志
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==False:
cloud_led.write(0)
if g_connect_status:
print('network register successed')
#连上网之后,点亮cloud_led
cloud_led.write(1)
break
time.sleep_ms(20)
return 0
# 定义subcribe的回调函数
def on_subcribe(topic,payload):
global client
global update_topic
print("on_subcribe: topic is:" + topic)
print("on_subcribe: payload is:" + payload)
#平台下发的信息
cloudmsg = ujson.loads(payload)
if "method" in cloudmsg:
if 'property.set' in cloudmsg['method']:
params = cloudmsg['params']
if 'd2_led' in params:
#如果平台下发点亮/熄灭小灯的指令,相应的改变小灯所在的gpio口的电平值,
#实现点亮/熄灭小灯
if params["d2_led"] == 1:
d2_led.write(1)
if params["d2_led"] == 0:
d2_led.write(0)
print('param_msg {}'.format(params))
client.publish(update_topic,update_data(),qos)
else :
pass
def mqttloop_func(delay, id):
global client
global mqtt_state
while True:
time.sleep_ms(delay)
print('Running thread %d'%id)
ret = client.loop(1000)
print('client ret ={}'.format(ret))
if ret < 0:
cloud_led.write(0)
print('------------------mqtt disconnect!')
client.disconnect()
mqtt_reconnect()
else:
pass
def mqtt_reconnect():
global client
global mqtt_state
global update_topic
#三元组
productKey = "a1S4vyFFMdL"
deviceName = "867082058707142"
deviceSecret = "7567432854953fc9b71f4fbcf4b25650"
REGION_ID="cn-shanghai"
#下面的3个参数是用阿里云设备的三元组通过软件生成的
username = "867082058707142&a1S4vyFFMdL"
clientId = "Test123456|securemode=3,timestamp=1234567890,signmethod=hmacsha1|"
#明文:clientIdTest123456deviceName867082058707142productKeya1S4vyFFMdLtimestamp1234567890
password = "b48b20fdb4a2800943c325e62b72cfc50f6d234c"
# ${productKey}.iot-as-mqtt.${regionId}.aliyuncs.com:1883
mqttaddr = productKey +".iot-as-mqtt."+REGION_ID+".aliyuncs.com"
serverport = 1883
hearttime = 40
#订阅/发布的topic
get_topic = _get_topic.format(productKey,deviceName)
update_topic = _update_topic.format(productKey,deviceName)
client = mqtt.client(clientId)
client.on_subcribe(on_subcribe)
# 设置用户名和密码
client.username_pw_set(username,password)
# 建立mqtt连接
ret = client.connect(mqttaddr,serverport,hearttime)
if ret == 0:
mqtt_state = 1
# 订阅服务
client.subscribe(get_topic,qos)
# 发布服务
client.publish(update_topic,update_data(),qos)
def mqtt_connect():
mqtt_reconnect()
#创建mqtt接收数据任务,1s一次
_thread.start_new_thread(mqttloop_func,(1000, 1))
def update_data():
d2_led_state=d2_led.read()
print("----------------d2_led state:",d2_led_state)
d={}
d["d2_led"]=d2_led_state
send_data = {
"id":"1",
"version":"1.0",
"params":d,
"sys":{"ack":1}
}
#上报 格式 可以参考这句话
#{"id":"2","version":"1.0","params":{"LBS": "(120.7396227,31.2741778)"},"sys":{"ack":1}}
MSG = ujson.dumps(send_data)
return MSG
def main():
print('main enter')
#联网
ret = connect_network()
if ret == 0:
#mqtt连接
mqtt_connect()
else:
print('network-connection failed')
if __name__ == '__main__':
main()
- board.json
{
"name": "haas506",
"version": "1.0.0",
"io": {
"ADC0": {
"type": "ADC",
"port": 0,
"sampling": 12000000
},
"mpu6050": {
"type": "I2C",
"port": 1,
"addrWidth": 7,
"freq": 400000,
"mode": "master",
"devAddr": 105
},
"KEY1": {
"type": "GPIO",
"port": 44,
"dir": "irq",
"pull": "pullup",
"intMode": "rising"
},
"work_led": {
"type": "GPIO",
"port": 0,
"dir": "output",
"pull": "pulldown"
},
"net_led": {
"type": "GPIO",
"port": 7,
"dir": "output",
"pull": "pulldown"
},
"cloud_led": {
"type": "GPIO",
"port": 9,
"dir": "output",
"pull": "pulldown"
},
"d2_led": {
"type": "GPIO",
"port": 6,
"dir": "output",
"pull": "pulldown"
},
"d3_led": {
"type": "GPIO",
"port": 8,
"dir": "output",
"pull": "pulldown"
},
"SPI0": {
"type": "SPI",
"port": 0,
"mode": "master",
"freq": 2000000
},
"serial1":{
"type":"UART",
"port":0,
"dataWidth":8,
"baudRate":115200,
"stopBits":1,
"flowControl":"disable",
"parity":"none"
},
"serial2":{
"type":"UART",
"port":1,
"dataWidth":8,
"baudRate":115200,
"stopBits":1,
"flowControl":"disable",
"parity":"none"
},
"serial3":{
"type":"UART",
"port":2,
"dataWidth":8,
"baudRate":115200,
"stopBits":1,
"flowControl":"disable",
"parity":"none"
}
},
"debugLevel": "DEBUG",
"repl":"disable"
}
2.操作步骤
(1)在阿里云物联网平台创建产品
填写产品名称、选择自定义品类,选择直连设备,选择联网方式-蜂窝,数据格式-ICA,点击确认。
(2)编辑自定义功能
点击所建立的产品:选择查看、点击功能定义和选择编辑草稿
添加自定义功能:属性、功能名称、标识符、数据类型、布尔值、读写类型
发布上线
(3)添加设备
在产品下,添加一个设备:选择产品名、填写DeviceName(自定义,最好将设备的IMEI作为该名称)
(4)mqtt参数设置
- 参数格式
clientid = “Test123456|securemode=3,timestamp=1234567890,signmethod=hmacsha1|”
username=deviceName&productKey
password=hashValue
REGION_ID=“cn-shanghai”
{productKey}.iot-as-mqtt.{regionId}.aliyuncs.com:1883 - 用户名,mqtt地址
username = “867082058707142&a1S4vyFFMdL”
mqttaddr = productKey +”.iot-as-mqtt.”+REGION_ID+”.aliyuncs.com”
serverport = 1883 - 用户密码获取
根据clienId生成明文:clientIdTest123456deviceName867082058707142productKeya1S4vyFFMdLtimestamp1234567890
明文填入:clientIdTest123456deviceName867082058707142productKeya1S4vyFFMdLtimestamp1234567890
密钥填入:deciceSecret
选择加密模式:hmacsha1
password = “b48b20fdb4a2800943c325e62b72cfc50f6d234c”
算法加密地址: http://iot-face.oss-cn-shanghai.aliyuncs.com/tools.htm
(5)烧录程序
(6)查看设备的物模型
(7)在线调试
点亮小灯
查看物模型的小灯状态
熄灭小灯
查看物模型的小灯状态
3. Class-mqtt
mqtt client on_subcribe 设置MQTT订阅回调函数 username_pw_set 设置用户名和密码 connect MQTT连接 subcribe MQTT订阅的主题 publish MQTT发布主题 loop 设置MQTT等待时间 disconnect 断开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成功,其他失败
4.总结
本节介绍了如何使用haas506高级组件库的mqtt模块,实现了连接阿里云物联网平台,并使用在线调试成功点亮/熄灭小灯。