ESP32运行MicroPython通过MQTT上报温湿度到阿里云

目录

阿里云创建产品和设备

MQTT.fx模拟设备连接到阿里云

ESP32设备连接阿里云


阿里云创建产品和设备

1、产品与服务——》物联网平台

 2、产品——》创建产品

3、创建产品模型

支持两种数据格式:

ICA标准数据格式(Alink JSON):数据使用JSON格式传输,不用写脚本,可以直接在平台上显示出来

透传/自定义:需要自己写脚本解析数据

4、产品在产品列表中

5、为产品定义物模型

引用阿里云的说明:

物模型指将物理空间中的实体数字化,并在云端构建该实体的数据模型。在物联网平台中,定义物模型即定义产品功能。完成功能定义后,系统将自动生成该产品的物模型。物模型描述产品是什么,能做什么,可以对外提供哪些服务。

物模型,简称TSL,即Thing Specification Language。是一个JSON格式的文件。它是物理空间中的实体,如传感器、车载装置、楼宇、工厂等在云端的数字化表示,从属性、服务和事件三个维度,分别描述了该实体是什么,能做什么,可以对外提供哪些信息。定义了这三个维度,即完成了产品功能的定义。

物模型将产品功能类型分为三类:属性、服务、和事件。定义了这三类功能,即完成了物模型的定义。

功能类型

说明

属性(Property)

一般用于描述设备运行时的状态,如环境监测设备所读取的当前环境温度等。属性支持GET和SET请求方式。应用系统可发起对属性的读取和设置请求。

服务(Service)

设备可被外部调用的能力或方法,可设置输入参数和输出参数。相比于属性,服务可通过一条指令实现更复杂的业务逻辑,如执行某项特定的任务。

事件(Event)

设备运行时的事件。事件一般包含需要被外部感知和处理的通知信息,可包含多个输出参数。如,某项任务完成的信息,或者设备发生故障或告警时的温度等,事件可以被订阅和推送。

功能定义——》编辑草稿——》添加自定义功能

比如创建属性:光照度和开关;

可以定义属性的数据类型、取值范围、步长、单位等。

这里面标‘*’的都必须填写,标识符:在我们上报的数据的时候需要用到,非常重要

6、发布更新,只有发布更新之后,我们在创建的设备下面才能看到这两个属性

7、添加设备

设备-——》添加设备

8、设备在设备列表

MQTT.fx模拟设备连接到阿里云

1、在MQTT.fx客户端设置参数,连接到阿里云

 图中1是服务器地址:a1cl5kV5GLv.iot-as-mqtt.cn-shanghai.aliyuncs.com,a1cl5kV5GLv是设备的ProductKey,cn-shanghai物理数据的中心,物联网平台貌似只能选择华东2(上海)。

图中2是端口号:1883

图中3是客户端ID:ID的生成规则如下

图中4是用户名字:

图中5是用户密码:

2、密码生成小工具

这个生成密码的小工具,可以使用阿里云官方的:https://help.aliyun.com/document_detail/86706.html?spm=a2c4g.11174283.2.44.34031668MapyOl。

3、连接服务器

4、订阅和发布主题

以下面两个主题说明:

一个是设备属性上报,一个是云端相应属性上报,既就是每上报一条数据,平台会给个回复。

订阅主题,出现红框中的内容,标识订阅成功:

发布主题:

数据是json格式,mlux和SwitchStatus两个参数正是我们前面定义的属性。

平台查看数据:

我们每次发布一条数据后,平台也会给我们回复一条数据(云端响应属性上报),就是我们订阅的主题,可以看到平台给的回复:

ESP32设备连接阿里云

1、创建产品

创建产品和设备、客户端参数的生成和上面一样的方法;创建一个温湿度上报到阿里云的产品和设备。

2、MQTT库

ESP32需要使用到MQTT库,使用网上开源的umqtt:https://github.com/micropython/micropython-lib/blob/master/umqtt.simple/umqtt/simple.py需要把这个文件导入到ESP32中。

3、温湿度

MicroPython本身内置了dht模块,支持DHT11、DHT22。

4、硬件连接

VCC <------>3V3

GND<------>GND

DAT <------>G4

5、脚本编写

程序设计:

定义了4个函数:ConnectWifi(ssid,passwd)用于连接wifi,ReadTemHum()用于读取温湿度,

sub_cb(topic, msg)订阅主题回调,apptimerevent(mytimer)定时器回调函数。

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

SSID="********"
PASSWORD="*******"

SERVER ='106.15.83.29'#这里使用域名一直连接不上,只能转换为IP使用了
#PORT:端口号,库里面默认使用处理
CLIENT_ID = "7788|securemode=3,signmethod=hmacsha1|"   #设备ID
username='ESP32-Device1&a1R00eqY67d'
password='0A1457C700FBEFE108B3E5E5523777BA82321363'

publish_TOPIC = '/sys/a1R00eqY67d/ESP32-Device1/thing/event/property/post'
subscribe_TOPIC ='/sys/a1R00eqY67d/ESP32-Device1/thing/event/property/post_reply'

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='{"params": {"CurrentTemperature": %d ,"CurrentHumidity": %d }, "method": "thing.event.property.post"}'%(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()

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)

mymessage='{"params": {"CurrentTemperature": %d ,"CurrentHumidity": %d }, "method": "thing.event.property.post"}'%(sensordata[0],sensordata[1])

CurrentTemperature和CurrentHumidity正式我们定义产品的时候的属性的标识符,只有这样上传数据阿里云才能正确解析,并显示图表出来。

ESP32订阅的主题:

如果数据展示出来,可以查看日志分析:

可以查看日志服务-》上行消息分析/下行消息分析-》点击“MessageID”查看,提供了4种显示格式。

 

  • 28
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

freemote

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值