专栏首页物联网思考ESP32 MQTT连接到中移OneNET物联网平台(附源码)

ESP32 MQTT连接到中移OneNET物联网平台(附源码)

前言:MQTT是当下物联网用的比较多的协议,本篇聊一聊用esp32通过MQTT连接到中移OneNET物联网平台。

OneNET平台创建产品和设备

1、创建产品:开发者中心-》全部产品-》MQTT物联网套件(新版)-》添加产品

2、添加设备:产品概况-》设备列表-》添加设备

3、数据流-》数据流模版管理-》添加数据流模版

提示:这里根据自己要上传的数据创建。

MQTT.fx客户端模拟设备上报数据

1、MQTT服务器地址:183.230.40.96

2、端口号:1883

3、图中Client ID、User name、Password根据官网的提示依此是:

Password可以使用官网提供的工具生成(https://open.iot.10086.cn/doc/mqtt/book/manual/auth/tool.html),也可以使用python脚本生成。

官方工具生成:

时间戳:https://tool.chinaz.com/Tools/unixtime.aspx,这个时间不能比当前时间小,比如输入1672735919,表示的是2023/1/3 16:51:59,到这个时间后mqtt服务器就会拒绝访问。

Python脚本生成:

官方给你的脚本稍微有点问题,修改之后如下:

import base64
import hmac
import time
from urllib.parse import quote
def token(id,devicename,access_key):
    version = '2018-10-31'
    #res = res = 'products/%s' % id  # 通过产品ID访问产品API
    #修改如下
    res = 'products/%s/devices/%s' %( id ,devicename)
    # 用户自定义token过期时间
    et = str(int(time.time()) + 3600)
    # 签名方法,支持md5、sha1、sha256
    method = 'sha1'
    # 对access_key进行decode
    key = base64.b64decode(access_key)
    # 计算sign
    org = et + '\n' + method + '\n' + res + '\n' + version
    sign_b = hmac.new(key=key, msg=org.encode(), digestmod=method)
    sign = base64.b64encode(sign_b.digest()).decode()
    # value 部分进行url编码,method/res/version值较为简单无需编码
    sign = quote(sign, safe='')
    res = quote(res, safe='')
    # token参数拼接
    token = 'version=%s&res=%s&et=%s&method=%s&sign=%s' % (version, res, et, method, sign)
    return token
if __name__ == '__main__':
    id = '329104'
    devicename='my_mqtt_device'
    access_key = 'PSbr2krSLrLfZ9BZ4GWv9y8Ys657ZHDAuxO31y55B9k='
    print(token(id,devicename,access_key))

只需要提供产品id、设备名称devicename、access_key(key)就可计算出,这里要注意一下脚本里面默认的时间戳是当前时间往后1h,也就是1h之后,mqtt服务器就拒绝访问了,可以自行更改。如果没有安装python,可以使用在线编程工具。

4、正确输入参数之后,连接到服务器:

5、上报数据,OneNET提供了3个topic:

其中{pid}是产品id,{device-name}是设备名称;$sys/{pid}/{device-name}/dp/post/json用于发布,上报数据,数据格式仅支持json格式,其余两个是上报数据之后的响应,客户端可以订阅。

上报数据之后,上报成功或者失败,平台都会返回系统通知,可以订阅主题查看:

6、下发数据,OneNET提供了4个topic:

其中{pid}和{device-name}的含义同上,{cmdid}为平台为该命令自动创建的唯一标识,在客户端订阅的时候可以使用通配符+或者#代替{cmdid}。

下发数据,不必使用json格式。

7、客户端查看:

ESP32设备连接到OneNET

1、创建设备,方法和上面一样,命令为esp32_mqtt_device

2、计算password

3、发布和订阅主题

publish_TOPIC = '$sys/329104/esp32_mqtt_device/dp/post/json',用于上报数据

subscribe_TOPIC ='$sys/329104/esp32_mqtt_device/dp/post/json/+',用于接收平台对上报数据的相应。

4、micropython脚本编写

from umqtt.simple import MQTTClient
from machine import Pin
import network
import time
import machine
import dht
from machine import Timer

SSID="**********"  # wifi名称
PASSWORD="*********" # wifi密码

SERVER ='183.230.40.96'  
CLIENT_ID = "esp32_mqtt_device"   #设备名称
#PORT=1883
username='329104' #产品ID
password='version=2018-10-31&res=products%2F329104%2Fdevices%2Fesp32_mqtt_device&et=1618323601&method=sha1&sign=ss36MphhbXRi3EFAPhqLEYFw0VQ%3D'

publish_TOPIC = '$sys/329104/esp32_mqtt_device/dp/post/json'
subscribe_TOPIC ='$sys/329104/esp32_mqtt_device/dp/post/json/+'

client=None
mydht=None

def sub_cb(topic, msg):
    print((topic, msg))

def connectWifi(ssid,passwd):
    global wlan
    wlan=network.WLAN(network.STA_IF)         #create a wlan object
    wlan.active(True)                         #Activate the network interface
    wlan.disconnect()                         #Disconnect the last connected WiFi
    wlan.connect(ssid,passwd)                 #connect wifi
    while(wlan.ifconfig()[0]=='0.0.0.0'):
        time.sleep(1)
    print(wlan.ifconfig())

def apptimerevent(mytimer):
    try:
        sensordata=ReadTemHum()
        mymessage='{"id": 123,"dp": {"CurrentTemperature": [{ "v": %d,}],"CurrentHumidity": [{"v": %d,}]}}'%(sensordata[0],sensordata[1])
        client.publish(topic=publish_TOPIC,msg= mymessage, retain=False, qos=0)
    except Exception as ex_results2:
        print('exception',ex_results2)
        mytimer.deinit()
#     finally:
#         machine.reset()
# #Catch exceptions,stop program if interrupted accidentally in the 'try'
def ReadTemHum():
    mydht.measure()
    tem=mydht.temperature()
    hum=mydht.humidity()
    data=[tem,hum]
    print(data)
    return data

if __name__=='__main__':
    try:
        mydht=dht.DHT11(machine.Pin(4))
        connectWifi(SSID,PASSWORD)
        client = MQTTClient(CLIENT_ID, SERVER,0,username,password,60)     #create a mqtt client
        print(client)
        client.set_callback(sub_cb)                         #set callback
        client.connect()                                    #connect mqtt
        client.subscribe(subscribe_TOPIC)                   #client subscribes to a topic
        mytimer=Timer(0)
        mytimer.init(mode=Timer.PERIODIC, period=5000,callback=apptimerevent)
        while True:
            client.wait_msg()                            #wait message

    except Exception  as ex_results:
        print('exception1',ex_results)
    finally:
        if(client is not None):
            client.disconnect()
        wlan.disconnect()
        wlan.active(False)

5、查看数据

日志查看:日志查询-》输入查询时间和设备ID。

6、设备通过串口打印平台响应:

——————END——————

本文分享自微信公众号 - 物联网思考(everythinglink),作者:everythinglink

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LoRa没有凉,工信部发话了,LoRa应该这么玩!

    昨天对LoRa来说,是“异常热闹”的一天,各大QQ群、微信群,行内行外,到处讨论。

    ManInRoad
  • 从LoRaWAN服务器thethingsnetwork.org获取应用数据

    多数情况下只需要关注上报和下发数据,因此本文主要说明如何使用MQTT方式获取数据和下发数据,官方说明https://www.thethingsnetwork.o...

    ManInRoad
  • 外包接单故事||基于LoRa的医院料架车监测

    前言:以前的同事找到了我,他负责硬件,我负责软件,开发基于LoRa的料架车监测。

    ManInRoad
  • NGINX 配置本地HTTPS(双向认证)

    1、客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息。  2、服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的...

    py3study
  • Redis字符串类型

    从今天开始我将重点分享一下Redis中的5种数据结构,今天我们学习一下第一种数据结构字符串。字符串是Redis中的最基础的数据结构。我们保存到Redis中的ke...

    吉林乌拉
  • Python ssh 远程执行shell

    py3study
  • 【快报】滴滴获中国人寿6亿美元投资 | IBM要用AI改变糖尿病未来

    AI 汉德 汉德1.5亿欧收购意机器人公司Gimatic ? 去年成立的中国私募投资公司汉德资本收购了欧洲一家工业机器人公司,这是中国获取西方工业自动化技术努...

    新智元
  • 『JWT』,你必须了解的认证登录方案

    JWT 全称是 JSON Web Token,是目前非常流行的跨域认证解决方案,在单点登录场景中经常使用到。

    古时的风筝
  • hp服务器ilo批量配置脚本

    hp的ilo是一个非常方便的带外管理工具,在平时使用的时候,经常有大量的hp服务器需要配置ilo,下面是我下的一个脚本,可以批量的完成hp服务器ilo配置。

    力哥聊运维与云计算
  • 剑指offer_14_剪绳子

    动态规划:当绳子长度为n时,我们剪第一刀有n-1种可能,因为第一刀可以剪1米、2米、3米....n-1米。因此f(n) = max(f(i) * f(n - i...

    用户6055494

扫码关注云+社区

领取腾讯云代金券