概要

Python 使用 paho.mqtt 库,利用阿里云物联网平台的设备证书:productKey、deviceName、deviceSecret,自动合成 userName、passWord。以MQTT通信协议接入阿里云物联网平台,并模拟智能开关设备上报开关消息。

非常适合作为MQTT物联网设备的客户端模拟。在此Demo基础上可非常方便进行二次开发。

MQTT.fx做客户端固然方便,但如果想对流程或任务进行定制、让其模拟物联网设备的功能、或者多开自动化脚本,应该没什么比Python更方便了吧。


Python脚本使用说明

  • MQTT接入阿里云物联网平台Demo,使用一机一密的方式。
  • 我的代码运行环境为PyCharm,运行时,需安装 paho.mqtt。
  • 在 PyCharm 的 File - Settings - Projectxxx - Python Interpreter 中,搜索并安装 paho.mqtt。
  • Demo中需要根据个人设备进行改动的仅5项:productKeydeviceNamedeviceSecretregionIdmodelName
  • 代码运行后,会使用设备证书的信息,自动连接阿里云物联网平台。并以5s为间隔,自动上报开关的状态消息。
  • 在阿里云在线调试界面,下发消息,可在客户端收到对应的json报文。

阿里云设备注册 的过程,请参照链接:阿里云MQTT物联网设备注册


Demo源码(IDE推荐用 PyCharm)

  • Demo中需要根据个人设备进行改动的仅5项:productKeydeviceNamedeviceSecretregionIdmodelName。一定要保证这5项与个人注册的设备相匹配。
import hmac
from hashlib import sha1
import time
from paho.mqtt.client import MQTT_LOG_INFO, MQTT_LOG_NOTICE, MQTT_LOG_WARNING, MQTT_LOG_ERR, MQTT_LOG_DEBUG
from paho.mqtt import client as mqtt
import json
import random
import threading'''
# 原文链接 - 我的博客,更多内容可查看我的主页。
# MQTT接入阿里云物联网平台Demo,使用一机一密的方式
# 运行时,需安装 paho.mqtt
# 在PyCharm 的 File - Settings - Projectxxx - Python Interpreter 中,搜索并安装 paho.mqtt
# 需要根据个人设备进行改动的仅5项:productKey、deviceName、deviceSecret、regionId、modelName
'''# 设备证书(ProductKey、DeviceName和DeviceSecret),三元组
productKey = 'a1wFylTxYeD'
deviceName = 'co_0001'
deviceSecret = '7ab0c4b3532b5783df5fdc58a2895d7a'# ClientId Username和 Password 签名模式下的设置方法,参考文档 https://help.aliyun.com/document_detail/73742.html?spm=a2c4g.11186623.6.614.c92e3d45d80aqG
# MQTT - 合成connect报文中使用的 ClientID、Username、Password
mqttClientId = deviceName + '|securemode=3,signmethod=hmacsha1|'
mqttUsername = deviceName + '&' + productKey
content = 'clientId' + deviceName + 'deviceName' + deviceName + 'productKey' + productKey
mqttPassword = hmac.new(deviceSecret.encode(), content.encode(), sha1).hexdigest()# 接入的服务器地址
regionId = 'cn-shanghai'
# MQTT 接入点域名
brokerUrl = productKey + '.iot-as-mqtt.' + regionId + '.aliyuncs.com'# Topic,post,客户端向服务器上报消息
topic_post = '/sys/' + productKey + '/' + deviceName + '/thing/event/property/post'
# Topic,set,服务器向客户端下发消息
topic_set = '/sys/' + productKey + '/' + deviceName + '/thing/service/property/set'# 物模型名称的前缀(去除后缀的数字)
modelName = 'PowerSwitch_'# 下发的设置报文示例:{"method":"thing.service.property.set","id":"1227667605","params":{"PowerSwitch_1":1},"version":"1.0.0"}
# json合成上报开关状态的报文
def json_switch_set(num, status):switch_info = {}switch_data = json.loads(json.dumps(switch_info))switch_data['method'] = '/thing/event/property/post'switch_data['id'] = random.randint(100000000,999999999) # 随机数即可,用于让服务器区分开报文switch_status = {modelName + num : status}switch_data['params'] = switch_statusreturn json.dumps(switch_data, ensure_ascii=False)# 开关的状态,0/1
onoff = 0# 建立mqtt连接对象
client = mqtt.Client(mqttClientId, protocol=mqtt.MQTTv311, clean_session=True)def on_log(client, userdata, level, buf):if level == MQTT_LOG_INFO:head = 'INFO'elif level == MQTT_LOG_NOTICE:head = 'NOTICE'elif level == MQTT_LOG_WARNING:head = 'WARN'elif level == MQTT_LOG_ERR:head = 'ERR'elif level == MQTT_LOG_DEBUG:head = 'DEBUG'else:head = levelprint('%s: %s' % (head, buf))
# MQTT成功连接到服务器的回调处理函数
def on_connect(client, userdata, flags, rc):print('Connected with result code ' + str(rc))# 与MQTT服务器连接成功,之后订阅主题client.subscribe(topic_post, qos=0)client.subscribe(topic_set, qos=0)# 向服务器发布测试消息client.publish(topic_post, payload='test msg', qos=0)
# MQTT接收到服务器消息的回调处理函数
def on_message(client, userdata, msg):print('recv:', msg.topic + ' ' + str(msg.payload))
def on_disconnect(client, userdata, rc):if rc != 0:print('Unexpected disconnection %s' % rc)def mqtt_connect_aliyun_iot_platform():client.on_log = on_logclient.on_connect = on_connectclient.on_message = on_messageclient.on_disconnect = on_disconnectclient.username_pw_set(mqttUsername, mqttPassword)print('clientId:', mqttClientId)print('userName:', mqttUsername)print('password:', mqttPassword)print('brokerUrl:', brokerUrl)# ssl设置,并且port=8883# client.tls_set(ca_certs=None, certfile=None, keyfile=None, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLS, ciphers=None)try:client.connect(brokerUrl, 1883, 60)except:print('阿里云物联网平台MQTT服务器连接错误,请检查设备证书三元组、及接入点的域名!')client.loop_forever()def publish_loop():while 1:time.sleep(5)global onoffonoff = 1-onoffswitchPost = json_switch_set('1', onoff)client.publish(topic_post, payload=switchPost, qos=0)if __name__ == '__main__':# 建立线程t1:mqtt连接阿里云物联网平台# 建立线程t2:定时向阿里云发布消息:5s为间隔,变化开关状态t1 = threading.Thread(target=mqtt_connect_aliyun_iot_platform, )t2 = threading.Thread(target=publish_loop, )t1.start()t2.start()

运行现象(IDE使用 PyCharm)

  • 代码运行后,会在调试窗口输出提示内容。

  • 已经连接阿里云物联网平台,并定时上发开关状态的报文。

  • 阿里云物联网平台,设备后台,可以看到设备上线。

  • 查看客户端上发的开关状态:物模型 - 打开实时刷新

  • 点击查看数据,可以图标形式查看历史数据。

  • 利用在线调试,模拟向客户端下发控制指令。

  • 客户端收到服务器的控制指令。


异常处理

  • 代码已验证无误,如有错误,只能是设备证书填写有误。
  • Demo中需要根据个人设备进行改动的仅5项:productKeydeviceNamedeviceSecretregionIdmodelName。一定要保证这5项与个人注册的设备相匹配。
  • 脚本运行时,会调试输出 clientId、userName、passWordbrokerUrl 等关键信息。可自行对照。
  • productKeyregionId 填写有误,会导致 brokerUrl 合成错误,进而域名解析失败,MQTT不能正常连接阿里云服务器,引发异常。

Python模拟智能开关设备MQTT接入阿里云物联网平台 - PyCharm paho.mqtt相关推荐

  1. MQTT.fx客户端MQTT接入阿里云物联网平台,登录、订阅、发布消息

    目录 1. 准备 2. MQTT.fx 设置登录名.密码 3. MQTT.fx 接入阿里云,订阅Topic 4. 阿里云下发数据给 MQTT.fx 5. MQTT.fx 发布消息给服务器 相关链接:M ...

  2. 使用网络调试助手 MQTT接入阿里云物联网平台,逐字节讲解,适用单片机/ESP8266接入阿里云

    目录 1. CONNECT 连接服务器 2. CONNACK 确认连接 3. DISCONNECT 断开连接 4. PINGREQ 心跳请求 5. PINGRESP 心跳响应 6. SUBSCRIBE ...

  3. 001-STM32+Air724UG(4G模组)基本控制篇(阿里云物联网平台)-使用MQTT接入阿里云物联网平台

    前言 这节测试下使用STM32+Air724UG 和 Android 和 微信小程序 和 网页端 接入阿里云物联网平台 当前的各种物联网平台整体思想是提供一个网页端让用户去注册设备 这个设备就对应一个 ...

  4. Esp8266 进阶之路29【高级篇】百万条消息免费之乐鑫esp8266使用TCP直连模式MQTT协议接入阿里云物联网平台,支持私家服务器对接,支持阿里云规则引擎。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  5. 【阿里云生活物联网架构师专题 ①】esp32 sdk 直连接入阿里云物联网平台,实现天猫精灵语音控制;

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1.esp32接入阿里云物联网平台,实现天猫精灵语音控制: 2.es ...

  6. WIFI设备接入阿里云物联网平台

    WIFI设备接入阿里云物联网平台 WIFI设备接入阿里云物联网平台 准备工作 配置WIFI模块 调试 WIFI设备接入阿里云物联网平台 本文演示WIFI设备接入阿里云物联网平台,设备采用的时HC-25 ...

  7. 中移M5310-A通过AT指令MQTT连接阿里云物联网平台并进行数据互传

    一.平台端操作 1.设备创建 进入阿里云物联网平台,选择物联网平台.然后开通公共实例,成功后依次创建产品.创建设备.设备创建成功后点击最右侧的查看->MQTT连接参数可以看到该设备接入该产品所需 ...

  8. 【阿里云生活物联网架构师专题 ②】esp8266 sdk 直连接入阿里云物联网平台,实现天猫精灵找队友零配网功能和语音控制;

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1.esp32接入阿里云物联网平台,实现天猫精灵语音控制: 2.es ...

  9. mqtt协议 阿里云物联网平台

    mqtt协议 阿里云物联网平台 MQTT报文结构 MQTT---CONNECT连接服务器报文 固定报头 可变报头 有效载荷 客户端ID 用户名 密码 转换 通过网络调试助手连接阿里云服务器 远程主机地 ...

最新文章

  1. js表单验证,如果不为空时自动改变提交按钮的背景色
  2. toString()、String.valueOf、(String)强转,如何抉择,你真的了解吗
  3. AES加密时抛出java.security.InvalidKeyException:#160;Illegal#160;key#160;size#160;or#160;def...
  4. caffe依赖项安装
  5. 基于AES加解密的图像加解密算法
  6. C#/winform 窗体适应不同分辨率
  7. 关于java内容_关于java一些概念性的内容
  8. is not a function_libcxx 的 std::function 源码分析
  9. 看好某一个机会和项目,拥有或掌握某一个资源要素和自然禀赋,寻找并组合志同道合
  10. HDU 4389——X mod f(x)(数位DP)
  11. LayaAir2.0 内置函数
  12. 在Windows10上安装3Ds Max完整教程
  13. 推荐支持 azw3 、epub 和 mobi 格式的阅读器:FBReader
  14. 驱动精灵修复服务器,驱动精灵一键修复系统组件工具
  15. 爬取豆瓣电影排行版数据
  16. java正则表达式控制半角字符串输入
  17. Failed to start component [Connector[HTTP/1.1-20001]]报错
  18. Navigate组件的使用(React Router6)
  19. [VB.NET]VB REDIM
  20. 三菱PLC FX系列 结构化编程/FBD.4工位转盘带4个步 进,PLC程序有完整的注释,有威伦触摸屏程序,电气图纸,I/O表,电气BOM.

热门文章

  1. starting Tomcat v8.5 at localhost has encountered a problem
  2. PyQT5-QProgressBar
  3. MYSQL绿色安装过程
  4. 将程序添加防火墙白名单
  5. Java虚拟机工作原理具体解释
  6. 【Java 正则表达式】单字符匹配、预定字符、量词、Matcher(贪婪、勉强、独占模式)、捕获组、边界匹配符、String类与正则表达式
  7. 点击项目任意页面都是404,且报错class path resource [] cannot be opened because it does not exist等
  8. exchange邮箱服务器端追踪某用户发送的邮件(发送状态、时间、主题等等信息)
  9. csharp与java的区别_C#与JAVA之比较(1)
  10. 13分钟,教你python可视化分析20W数据,找到妹子最爱的内衣