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種顯示格式。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章