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

2023-11-02

概要

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_status
    return 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 = level
    print('%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_log
    client.on_connect = on_connect
    client.on_message = on_message
    client.on_disconnect = on_disconnect
    client.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 onoff
        onoff = 1-onoff
        switchPost = 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不能正常连接阿里云服务器,引发异常。
    在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • java中unexpected token

    文章目录 问题 问题 public class People int m 10 n 1 n 200 2 void f if m n n m 3 else n n m 4 这道题问的是 下列哪行代码有错误 一开始并没有发现问题的所在 放了编辑
  • 寻找环形链表的入口点

    如果链表中有某个节点 可以通过连续跟踪 next 指针再次到达 则链表中存在环 为了表示给定链表中的环 我们使用整数来表示链表尾连接到链表中的位置 索引从 0 开始 先定义一个节点 struct ListNode int val struc
  • 通讯协议与即时通讯

    转自 https www jianshu com p ca4aeabf55f6 推送服务一般有三种实现方式 1 轮询方式 客户端不断的查询服务器 检索新内容 这种方式的缺点十分明显 如果轮询频率过快 会大量消耗网络带宽和电池 2 长连接方式
  • FPGA学习---3.IP核使用,Counter IP核

    三 LPM counter IP核使用 小结 counter IP核 cin进位输入 clock时钟信号 cout进位输出 q当前计数值 FPGA设计方式 调用IP核 路径放到prj的ip文件夹下 名字叫counter就行 几位的计数器 计
  • Ubuntu 中vi下方向键变成ABCD, backspace无法删除字符的解决办法

    转载自 https blog csdn net sunzz pku article details 40581881 在linux中安装完VIM后 发现在insert模式下 按下四个方向键在屏幕中会输出ABCD这样的字符 并且Backspa
  • Java学习笔记 --- IDEA

    一 IDEA介绍 1 IDEA全称IntelliJ IDEA 2 在业界被公认为最好的Java开发工具 3 IDEA是JetBrains公司的产品 总部位于捷克的首都布拉格 4 除了支持Java开发 还支持HTML CSS PHP MySQ
  • Sonar 配置代码扫描规则 与 质量配置,设置各个语言默认的扫描规则

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 配置代码扫描规则 质量配置 设置各个语言默认的扫描规则 代码规则设置 如果认为有些扫描规则太严格了 可以把它 挂起 以后再构建的代码扫描项目时就不会再使用本规则 例如挂起J
  • electron-14版后remote废除

    文章目录 前言 安装与配置 前言 Electron最近的版本变迁比较频繁 在升级到14 0 0版本后 废除了很多旧有的API 而其中最主要的就是remote模块从旧有的模块里抽出 变成了一个需要新安装的模块 electronic remot
  • Android升级到7.0使得webview加载页面为空白页

    前段时间 公司一哥们把他的手机拿给我看 问到公司的软件加载进去是空白页 等了好久也是空白 我也为是网络出现了问题 排查没问题啊 看看是不是缓存问题 又是清缓存 又是卸载重装 结果还是空白页面 想了一下是不是系统问题 问他有没有更新过系统 结
  • Android:RecyclerView 的使用,有这一篇就够了

    谨以文章记录学习历程 如有错误还请指明 RecyclerView 简介 首先 可以理解 RecyclerView 是 ListView 的升级版 更加灵活 同时由于封装了 ListView 的部分实现 导致其使用更简单 结构更清晰 从名字
  • 金融数据时间序列分析——模型准确率过高怎么办

    多少年后 小f想起了自己还是刚刚出道的小萌新时候犯的一个错误 当时模型的准确率贼高 高的离谱 就像下面这种情况 precision recall f1 score support 1 1 1 1 1934 0 1 1 1 535 1 1 1
  • LoadStdProfileSettings -- 加载MRU

    如何为自己的应用程序加入最近文件列表功能呢 最简单的方法就是在你新建工程的时候选择包含最近文件列表功能 也就是在 MFC AppWizard 的第 4 步的时候使 How many files would you like on your
  • 06.RabbitMQ重试机制

    RabbitMQ重试机制 补偿机制 在消费中如果发生异常了 RabbitMQ会使用补偿机制 重试 如果消息没消费成功 会一直重复发送 直到消费成功为止 我们以之前的P2P例子为例 Component RabbitListener queue
  • antd中Form.Item无法获取到对应的表单值解决

    antd中Form Item无法获取到对应的表单值解决 前言 问题代码示例 解决 前言 本文章讲的解决方案只是其中一种 无法获得对应表单的原因有很多 只能在今后的道路上慢慢采坑然后避免 问题代码示例 import React Compone
  • Retrofit中的注解原理项目实战

    今天我们来聊聊这个最近很火的网络请求库retrofit 在此基础上会延伸出一些列的知识点 现在关于retrofit的文章很多 我之所以写这篇文章的原因在于 8月份负责假设新客户端底层的过程中首次尝试使用该库 并取得非常不错的效果 不到20天
  • 计算机视觉最新技术:YOLOv8等前沿算法推荐!

    计算机视觉最新技术 YOLOv8等前沿算法推荐 计算机视觉是人工智能领域中的一个重要方向 它涉及到图像 视频等多媒体形式的信息处理 而随着人工智能技术的不断发展 计算机视觉领域也不断涌现出新的算法和模型 其中 YOLOv8等一系列算法被认为
  • 初识springcloud(微服务)

    1 微服务的定义 microservice 1 多个微服务开发的依然是一个完整的应用 2 微服务都会独立运行在一个独立的进程里面 3 微服务之间通常会采用轻量级的通信机制来进行通信 比如http https socket netty dub
  • python 视频流分析,通过ffmpeg管道将视频输出流到Python脚本中进行分析。如何导入python?...

    我正在与其他库一起编写一个脚本 它需要RGB24格式的帧或图像 为了提高兼容性 我决定允许外部管道将帧流式传输到这个程序中 每次在代码中使用更改设备或源代码可能会变得乏味 使用解析器简单地指定源代码会导致语法错误 示例 ffmpeg f d
  • python如何更新包

    python如何更新包 更多python视频教程请到菜鸟教程https www piaodoo com Python安装新包 pip是很好用的安装工具 pip list 可以查询所有已安装的包和版本 怎么知道本地安装包的版本是否有可以更新的
  • Python模拟智能开关设备MQTT接入阿里云物联网平台 - PyCharm paho.mqtt

    概要 Python 使用 paho mqtt 库 利用阿里云物联网平台的设备证书 productKey deviceName deviceSecret 自动合成 userName passWord 以MQTT通信协议接入阿里云物联网平台 并