2.8 haas506开发教程-高级组件库-mqtt

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模块,实现了连接阿里云物联网平台,并使用在线调试成功点亮/熄灭小灯。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值