热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:EC600QuecPython接入第三方MQTT服务器,以阿里云物联网平台为例,可替换为自己创建的MQTT服务器

篇首语:本文由编程笔记#小编为大家整理,主要介绍了EC600QuecPython接入第三方MQTT服务器,以阿里云物联网平台为例,可替换为自己创建的MQTT服务器相关的知识,希望对你有一定的

篇首语:本文由编程笔记#小编为大家整理,主要介绍了EC600 QuecPython接入第三方MQTT服务器, 以阿里云物联网平台为例,可替换为自己创建的MQTT服务器相关的知识,希望对你有一定的参考价值。






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

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

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



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

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


  • EC600 umqtt 使用帮助:QuecPython - 在线API文档
  • 本篇demo使用的测试设备账号、以及密码的合成方式:网络调试助手接入阿里云MQTT物联网平台,逐字节讲解各字段合成方式
  • 阿里云物联网平台的设备添加:阿里云物联网平台注册、添加产品、设备

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




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,则会上电自运行,只能通过重刷固件解决)





推荐阅读
  • 代码如下:#coding:utf-8importosimportsysdefcut_and_paste_file(source,destination):”’sourc ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 详解 Python 的二元算术运算,为什么说减法只是语法糖?[Python常见问题]
    原题|UnravellingbinaryarithmeticoperationsinPython作者|BrettCannon译者|豌豆花下猫(“Python猫 ... [详细]
  • 开发笔记:python协程的理解
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了python协程的理解相关的知识,希望对你有一定的参考价值。一、介绍什么是并发?并发的本质就是 ... [详细]
  • Python语言简介、环境搭建、PyCharm的安装和配置
    一、Python语言简介1.1Python语言的基本概念官方对Python语言的介绍如下:Python是一款易于学习且功能强大的编程语言。它具有高效率的数据结构,能够简单又有效地实 ... [详细]
  • 丛api的python的简单介绍
    本文目录一览:1、如何使用python利用api获取天气预报 ... [详细]
  • 基于Springboot实现Mqtt
    转载:基于Springboot实现MqttJava端开发:pom.xml: ... [详细]
  • 前言无论使用哪种语言,我们都需要关注性能优化,提高执行效率。选择脚本语言需要持久的速度。在某种程度上,这句话说明了Python作为一种脚 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
author-avatar
Wx丶华少
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有