使用Python模拟设备接入阿里云物联网的MQTT服务器

前言

由于阿里云物联网套件关于设备认证的文档不够详细,笔者差不多摸索了几天才连接上MQTT。下面是使用Python模拟设备接入阿里云的MQTT。

概述

阿里云物联网套件提供两种接入方式:

  1. MQTT客户端域名直连(资源受限设备推荐)
  2. 先HTTPS发送授权后再连接MQTT(一些特殊增值服务,比如设备级别的引流)

本文主要介绍第一种接入方式,TCP直连,并提供Python代码示例。

主要参数

连接域名

<ProductKey>.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883

MQTT Connect报文参数

1、mqttClientId

mqttClientId = "<ClientId>"+"|securemode=3,signmethod=hmacsha1,timestamp=132323232|"

2、mqttUsername

使用&拼接<DeviceName><ProductKey>

mqttUsername = "<DeviceName>&<ProductKey>"

3、mqttPassword

把以下参数按字典键名排序,再把键名都拼接起来(没有分隔符)生成content,然后以DeviceSecret为盐,对content进行hma_sha1加密,最后二进制转为十六进制字符串表示。

  • clientId
  • deviceName
  • productKey
  • timestamp
mqttPassword = hmac_sha1(DeviceSecret, content).toHexString();

示例

假设

  • clientId = 12345
  • deviceName = device
  • productKey = pk
  • timestamp = 789
  • signmethod = hmacsha1

content拼接结果:clientId12345deviceNamedeviceproductKeypktimestamp789

注意:不用拼接signmethod参数。

对content以DeviceSecret为盐进行hmacsha1加签后,再转为十六进制字符串,最后结果:FAFD82A3D602B37FB0FA8B7892F24A477F851A14

注意:不需要base64。

最后总结一下生成的参数:

  • mqttHost = pk.iot-as-mqtt.cn-shanghai.aliyuncs.com
  • mqttPort = 1883
  • mqttClientId = 12345|securemode=3,signmethod=hmacsha1,timestamp=789|
  • mqttUsername = device&pk
  • mqttPassword = FAFD82A3D602B37FB0FA8B7892F24A477F851A14

参数说明

参数 描述
ProductKey 产品Key。从iot套件控制台获取
DeviceName 设备名称。从iot套件控制台获取
DeviceSecret 设别密码,从iot套件控制台获取
signmethod 算法类型,hmacmd5或hmacsha1
clientId 客户端自表示id,建议mac或sn
timestamp 当前时间毫秒值,可选
securemode 目前安全模式,可选值有2 (TLS直连模式)、3(TCP直连模式)

示例代码

填写自己的ProductKeyClientIdDeviceNameDeviceSecret

# coding=utf-8
# !/usr/bin/python3

import datetime
import time
import hmac
import hashlib
import math

TEST = 0

ProductKey = ""
ClientId = "12345"  # 自定义clientId
DeviceName = ""
DeviceSecret = ""

# signmethod
signmethod = "hmacsha1"
# signmethod = "hmacmd5"

# 当前时间毫秒值
us = math.modf(time.time())[0]
ms = int(round(us * 1000))
timestamp = str(ms)

data = "".join(("clientId", ClientId, "deviceName", DeviceName,
                "productKey", ProductKey, "timestamp", timestamp
                ))
# print(round((time.time() * 1000)))
print("data:", data)

if "hmacsha1" == signmethod:
    ret = hmac.new(bytes(DeviceSecret, encoding="utf-8"),
                   bytes(data, encoding="utf-8"),
                   hashlib.sha1).hexdigest()
elif "hmacmd5" == signmethod:
    ret = hmac.new(bytes(DeviceSecret, encoding="utf-8"),
                   bytes(data, encoding="utf-8"),
                   hashlib.md5).hexdigest()
else:
    raise ValueError

sign = ret
print("sign:", sign)

# ======================================================

strBroker = ProductKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com"
port = 1883

client_id = "".join((ClientId,
                     "|securemode=3",
                     ",signmethod=", signmethod,
                     ",timestamp=", timestamp,
                     "|"))
username = "".join((DeviceName, "&", ProductKey))
password = sign

print("="*30)
print("client_id:", client_id)
print("username:", username)
print("password:", password)
print("="*30)

def secret_test():
    DeviceSecret = "secret"
    data = "clientId12345deviceNamedeviceproductKeypktimestamp789"
    ret = hmac.new(bytes(DeviceSecret, encoding="utf-8"),
                   bytes(data, encoding="utf-8"),
                   hashlib.sha1).hexdigest()
    print("test:", ret)

# ======================================================
# MQTT Initialize.--------------------------------------

try:
    import paho.mqtt.client as mqtt
except ImportError:
    print("MQTT client not find. Please install as follow:")
    print("git clone http://git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.python.git")
    print("cd org.eclipse.paho.mqtt.python")
    print("sudo python setup.py install")

# ======================================================
def on_connect(mqttc, obj, rc):
    print("OnConnetc, rc: " + str(rc))

    mqttc.subscribe("test", 0)

def on_publish(mqttc, obj, mid):
    print("OnPublish, mid: " + str(mid))

def on_subscribe(mqttc, obj, mid, granted_qos):
    print("Subscribed: " + str(mid) + " " + str(granted_qos))

def on_log(mqttc, obj, level, string):
    print("Log:" + string)

def on_message(mqttc, obj, msg):
    curtime = datetime.datetime.now()
    strcurtime = curtime.strftime("%Y-%m-%d %H:%M:%S")
    print(strcurtime + ": " + msg.topic + " " + str(msg.qos) + " " + str(msg.payload))
    on_exec(str(msg.payload))

def on_exec(strcmd):
    print("Exec:", strcmd)
    strExec = strcmd

# =====================================================
if name == '__main__':
    if TEST:
        secret_test()
        exit(0)

    mqttc = mqtt.Client(client_id)
    mqttc.username_pw_set(username, password)
    mqttc.on_message = on_message
    mqttc.on_connect = on_connect
    mqttc.on_publish = on_publish
    mqttc.on_subscribe = on_subscribe
    mqttc.on_log = on_log

    mqttc.connect(strBroker, port, 120)
    mqttc.loop_forever()

参考资料

  • 阿里云物联网套件 > 设备端接入手册 > 设备基于MQTT接入 > 设备认证


终于知道之前为什么总是连接不上了!!!之前文档对password加密的字段是多了「signmethodhmacsha1」字符串!

时间: 2025-01-21 12:48:27

使用Python模拟设备接入阿里云物联网的MQTT服务器的相关文章

阿里联手美的签署战略合作协议,全系列产品都将接入阿里云平台

3月17日上午消息,阿里巴巴.美的今天上午正式签署战略合作协议,双方将共同构建基于阿里云的物联网开放平台,实现家电产品的连接对话和远程控制.美的也发布了首款基于阿里云的智能空调,将于3月19日在天猫电器城独家首发. 据悉,从2014年开始,美的将在所有空调新品中应用物联网智能技术,计划三年时间将50%以上的空调物联网化,未来美的全系列产品都将接入阿里云平台. 美的集团执行副总裁.家用空调事业部总裁吴文新透露,美的与阿里的战略合作项目将分为三个阶段完成:2014年,形成统一的物联网产品应用和通信标

阿里云Linux下FTP服务器搭配配置

  阿里云服务器是国内目前 最好的一个云服务器了,不过价格方面也比较贵了,下面我们来给各位介绍在阿里云Linux下FTP服务器搭配配置了,大概方法 与linux下搭配ftp服务器区别不大,只是一些小细节了. 一.aliyun Linux(Redhat)安装vsftp软件 1.更新yum源 首先需要更新系统的yum源,便捷工具下载地址:update_source.zip.这里需要注意的是,目前文件无法传输,所以想要运行 update_source.sh 只能用文本打开,复制粘贴到阿里云服务器系统运

阿里云最便宜的服务器多少钱?199一年!

阿里云最便宜的服务器ECS 阿里云服务器新用户专享活动地址如下 购买前请先领取阿里云优惠券 购买时会有相应的优惠(在原有的199一年的价格上进行优惠) 这这个价格我们能购买到 1H 2G 1M 60G的磁盘相对来说实惠多了 !(此配置是基础版 非常适合新手 当然后期站点流量加大 可以一键升级服务器配置 非常方便) 二.也可选择购买网站空间 网站空间是用来存放网站内容,网站文件,比如网页.图片.音乐等资料的,提供的网站空间包括虚拟主机.VPS主机.独立服务器等,所有的空间都放置于顶级电信机房,全年

远程连接阿里云SqlServer 2012 数据库服务器的图文教程

前言: 在使用 阿里云 上的一些产品时,遇到不少坑. 安装IIS 时,遇到因买的配置过低,虚拟内存不足,而导致 IIS 总是安装失败: 现在 在上面安装了个 Sql Sever 2012,远程老是 不能连接,百度找半天,终于能够连接上了. 实现步骤如下: 1. 找到 安全组配置,打开 安全组配置,点击配置规则,增加 地址段访问的 授权规则,Sql Server的默认端口时 1433 . 2. 服务器上 win + R  键入  compmgmt.msc ,打开 计算机管理,按照如图所示 设置.注

⑮云上场景:德澜科技,阿里云物联网云平台实践

德澜是国内领先的物联网整体解决方案提供商,提供从设备.数据.平台.云至运营的一体化方案与产品服务.常年为美的.海信.长虹等大型家电厂商提供智能家电产品与方案,获得市场的高度评价. 德澜同借助阿里云服务开发了国内领先的智能家电物联网云平台,汇集不同品类家电.支持海量家电并发接入.海量用户在线应用,并为家电企业提供从产品定义.开发.生产.售后维护到产品运营的全生命周期管理.平台着力汇集家电设备.用户.售后的海量数据,针对家电企业需求提供大数据分析服务:通过丰富的第三方连接通道,促进数据的流动性,为客

如何接入阿里云短信服务 (完整指南)

目录 一.注册并实名认证 二.开通短信服务 三.获取AccessKey 四.设置短信内容 五.配置短信接口 六.发送短信 七.常见问题FAQ 一.注册并实名认证 使用阿里云短信服务,用户需要先在阿里云注册,并完成个人/企业实名认证. 注意:要发送营销短信的用户,必须完成企业实名认证 1.1 注册阿里云:点此注册  1.2 实名认证:点此认证  1.3 绑定企业支付宝: 点击绑定企业支付宝   二.开通短信服务 2.1.开通短信服务:点击开通短信服务 2.2 子账号页面:点击查看子账号页面 2.3

快速接入阿里云应用配置管理工具 轻松开启企业效率新时代

日前,阿里云正式推出了应用配置管理(Application Configuration Manangement,简称 ACM)工具产品,这是一款在分布式架构环境中对应用配置进行集中管理和推送的工具类产品,在微服务.DevOps.大数据等场景下极大地减轻配置管理的工作量,增强配置管理的服务能力. 配置是管理应用变更的常见手段之一,在应用生命周期管理中,通常会将应用发布后需要改变的一些配置项或者元数据从代码中分离出来,放在单独的配置文件中管理,以便应用在发布之后,运维人员或最终用户可以通过调整配置来

阿里云最便宜的服务器能建几个网站?

这里我们按照阿里云低配服务器 1H cpu 2G内存 1M 带宽 60G存储盘 这个配置来说 最多15个. 阿里云服务器199一年 阿里云高配置服务器链接  ① 首次备案的域名可提交5个单独的网站,每个网站可以对应3个域名. 非阿里云主体新增网站第一次可以提交一个网站,第二次可以提交多个网站 . 方法:在代备案系统中→填写网站信息的页面→网站域名(指向同一首页URL的多个域名,用逗号隔开)→首页URL(填写1个).  ②做新增接入的域名,一次性提交一个网站. a:例如:域名备案号为:浙ICP备1

阿里云使用Windows登录服务器有哪些问题

远程连接服务器For Windows Windows系统远程桌面无法连接的检查 Mac远程桌面链接ECS Windows2012提示"远程桌面连接无法验证您希望连接的计算机的身份" ECS Windows系统多人使用相同账号同时远程登陆 ECS服务器Windows 2008设置远程连接断开后的自动注销时间 ECS Windows 2008 远程连接提示"由于没有远程桌面授权服务器可以提供许可证"的处理方法 ECS服务器Windows 服务器远程登录黑屏 Window