EC600 QuecPython接入第三方MQTT服务器, 以阿里云物联网平台为例,可替换为自己创建的MQTT服务器

EC600 QuecPython 自带Aliyun腾讯云物联网平台的接入库,但重口难调,产品项目中更多的是接入自己搭建的第三方服务器。

MQTT协议接入不同的服务器,最大的区别在于connect报文。

connect报文的载荷中,包含了设备的登录账号,而每个平台都有自己的设备管理方式,也就造成编码方式的不一致。不过好在MQTT也规定了 clientId、userName、passWord 这几个关键载荷,用户只要保证这几个部分与平台匹配即可连接。


使用 EC600 QuecPython 接入第三方MQTT服务器,需要使用 umqtt 模块。

这里为方便测试,使用阿里云账号,不过不用 aliyun 的MQTT接入库,直接用 umqtt 模块。

上述的设备账号会一直保留,方便测试,各位可放心使用。


EC600 MQTT脚本


接入第三方MQTT服务器,需要根据自己的设备及服务器,自行计算并替换:clientId、userName、passWord、brokerUrl 以及 topic。(阿里云的 clientI、userName、passWord 计算方式见上述链接)

Demo代码:

from machine import Pin
import log
import checkNet
from umqtt import MQTTClient


# 使用提前计算好的密码,可以登录连接。hamc库暂时使用有问题,待官方的固件库更新
# 使用umqtt库接入阿里云物联网平台,模拟接入第三方MQTT服务器进行测试
clientId = 'co_0001|securemode=3,signmethod=hmacsha1|'
userName ='co_0001&a1wFylTxYeD'
passWord = 'e782b5e55b37655c27812a60c307b0a7575d8f6d'
brokerUrl = 'a1wFylTxYeD.iot-as-mqtt.cn-shanghai.aliyuncs.com'
topic_post = b'/sys/a1wFylTxYeD/co_0001/thing/event/property/post'
topic_set = b'/sys/a1wFylTxYeD/co_0001/thing/service/property/set'


PROJECT_NAME = "MQTT_example"
PROJECT_VERSION = "1.0.0"

# 检查网络状态,创建checkNet对象
checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION)
# 设置日志输出级别,仅输出等级高于INFO的日志结果
log.basicConfig(level=log.INFO)
log = log.getLogger("MQTT")

state = 0

# V1.2 Demo板上的led - D6
blink = False
led = Pin(Pin.GPIO24, Pin.OUT, Pin.PULL_DISABLE, 0)

# 设置MQTT接收消息回调
def sub_cb(topic, msg):
    global state
    log.info("Subscribe Recv: Topic={},Msg={}".format(topic.decode(), msg.decode()))
    state = 1

    # 收到下发的消息时,LED亮灭状态会发生变化
    global blink
    blink = bool(1-blink)
    led.write(blink)

if __name__ == '__main__':
    # 上电运行后调试输出 项目名称、项目版本号、固件版本号、开机原因、SIM卡状态
    checknet.poweron_print_once()
    print('Hardware PowerON!')
    # 开机后LED亮起,指示状态。
    led.write(1)

    # 阻塞等待网络就绪,超时等待30s
    stagecode, subcode = checknet.wait_network_connected(30)
    if stagecode == 3 and subcode == 1:
        # 网络准备就绪,开始执行用户代码
        log.info('Network connection successful! Then connect to Aliyun MQTT')
        # 指示LED灭掉,提示网络连接正常。
        led.write(0)

        print('username:', userName)
        print('password:', passWord)
        # 创建一个mqtt实例
        c = MQTTClient(
            client_id=clientId,
            server=brokerUrl,
            port=1883,
            user=userName,
            password=passWord,
            keepalive=60)
        # 设置消息回调
        c.set_callback(sub_cb)
        # 建立连接
        try:
            c.connect()
        except Exception as e:
            print('!!!,e=%s' % e)

        # 正常连接后,输出消息
        log.info('Aliyun MQTT connected , Then subscribe topic')
        # 订阅主题
        c.subscribe(topic_post)
        log.info('subscribe topic: %s' % topic_post)
        c.subscribe(topic_set)
        log.info('subscribe topic: %s' % topic_set)
        # 发布消息
        c.publish(topic_post, 'test publish')
        log.info('Publish topic: %s, Msg: %s' % (topic_post, 'test publish'))

        log.info('listen')
        while True:
            c.wait_msg()  # 阻塞函数,监听消息

    else:
        log.info('Network connection failed! stagecode = {}, subcode = {}'.format(stagecode, subcode))

运行现象


SIM插入、4G网络正常,正常运行的现象。

log会显示正常连接、订阅topic 和 publish。最后在 publish 一条消息后,一直处于监听状态。
在这里插入图片描述

  • 连接后能在管理页面看到设备在线。
    在这里插入图片描述
  • 测试下发控制消息
    在这里插入图片描述
  • 观察 V1.2 Demo板上的led - D6,收到下发的消息时的同时,LED亮灭状态也会发生变化。(led亮灭是脚本中自己加入的代码)
    在这里插入图片描述

注意事项

  • hmac 暂时有问题,需要等待固件更新,才可以让设备自行合成 passWord。
  • 接入第三方MQTT服务器,需要自行计算clientId、userName、passWord、brokerUrl 以及 topic,并替换。
  • umqtt的异常提醒很坑,如设备账号填错,会报错 bytes index out of range。而非重新连接。
  • 代码中如有 while,会导致与上位机的通信阻塞。重新下载脚本时,需要断开连接、复位、再重新连接。(如带有while 的脚本文件名为 main.py,则会上电自运行,只能通过重刷固件解决)
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值