Bootstrap

esp32 + DHT11温湿度传感器+阿里云物联网平台实时数据显示 实现设备上云

1 课设目的

本课设是通过esp32板子搭配DHT11传感器,检测温度和湿度数据通过MQTT协议实时传输到阿里云物联网开发平台,实现设备上云。

2 阿里云环境准备

2.1开通物联网平台

我们先需要注册阿里云账号,然后开通物联网平台
网址:https://iot.console.aliyun.com/lk/summary/new

2.2 创建产品

在这里插入图片描述

当我们成功产品之后呢,将我们需要的信息记录下来:设备名以及地域名,本文提供完整的阿里云地域和可用区列表。每个地域完全独立。每个可用区完全隔离,但同一个地域内的可用区之间使用低时延链路相连。
地域和可用区之间的关系如下图所示:

在这里插入图片描述

我的设备所在地域是华北2,所以Region ID: cn-beijing

2.3查看 ProductKey, DeviceName,DeviceSecret信息

在这里插入图片描述

根据MQTT-TCP官方文档我们需要得知一机一密规则:

Y o u r P r o d u c t K e y . i o t − a s − m q t t . {YourProductKey}.iot-as-mqtt. YourProductKey.iotasmqtt.{YourRegionId}.aliyuncs.com:1883。这个是接入域名规则,其中:
${YourProductKey}:替换为设备所属产品的ProductKey。
${YourRegionId}:替换成我的设备区域ID
因此得到独一的接入域名

官方说明:

机一密、一型一密预注册认证方式:
使用设备证书(ProductKey、DeviceName和DeviceSecret)连接
mqttClientId:clientId+"|securemode=3,signmethod=hmacsha1,timestamp=13|"
mqttUsername: deviceName+"&"+productKey
mqttPassword: sign_hmac(deviceSecret,content)
根据格式要求就可以得出
CLIENT_ID = 123456|securemode=3,signmethod=hmacsha1|
username=‘mqtt_temp&g38qyn3gRew’
password=‘3484F5004B2392AE9C30B5CFDFD4D87802D3145E’
password需要用到一个密码生成工具,也可以用其他工具生成
file:///D:/Desktop/MQTT_Password/sign.html

2.4带通配符的自定义Topic

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210314003006357.png)

自定义主题中标识符是自己设定的,设定好之后不能更改,在后面的代码会用到。

2.5查看主题

在这里插入图片描述

当自定义完主题后会生成一个主题,将${deviceName}更改一下。
一个是设备属性上报,一个是云端相应属性上报,既就是每上报一条数据,平台会给个回复。
将以上内容都完成之后,就完成了环境的准备。
MQTT-TCP连接通信协议规范文档

3 本课设用到esp32 + DHT11

ESP32需要使用到MQTT库,使用网上开源的umqtt:https://github.com/micropython/micropython-lib/blob/master/umqtt.simple/umqtt/simple.py需要把这个文件导入到ESP32中。
温湿度:MicroPython本身内置了dht模块,支持DHT11、DHT22。
硬件连接
VCC <------>3V3
GND<------>GND
DAT <------>G4(根据自己定)
在这里插入图片描述

4 代码实现

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

SSID="LAPTOP-5G"
PASSWORD="lihuan12345"

SERVER ='106.15.83.29'#域名

CLIENT_ID = "123456|securemode=3,signmethod=hmacsha1|"   #设备ID
#PORT:端口号,库里面默认使用处理
username='mqtt_temp&g38qyn3gRew'
password='3484F5004B2392AE9C30B5CFDFD4D87802D3145E'
publish_TOPIC = '/sys/g38qyn3gRew/mqtt_temp/thing/event/property/post'
subscribe_TOPIC='/sys/g38qyn3gRew/mqtt_temp/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()
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)
 

在这里插入图片描述

4 总结

本次课设让我懂得了如何让设备上云的流程,DHT11传感器传感器用途,在这个艰辛的历程中,我在网上找到过很多教程,但是版本各有不同,在查阅资料的过程我是理解设备上云的流程吧,利用阿里云物联网平台的说明文档,配合书本,大概清楚是怎么回事,代码也出现很多BUG,最终也一一解决了,总的来说,我觉得这一次真是学到了东西,接下来我会利用这个物联网平台的数据接口,做一个APP或者微信小程序,将数据真正利用起来,再而就是加多的传感器做一个小项目。

参考文献…
[1]MicroPython入门 电子工业出版社
[2] https://blog.csdn.net/freemote/article/details/105322722
[3]阿里云物联网平台说

;