基於MQTT的物聯網開關,微信小程序做為控制端/esp32系統做為執行端


esp32 micropython視頻地址

1.1. 物聯網開關(基於MQTT)

在冬天,從被窩里鑽出來關燈需要莫大的勇氣。

而作為資深的工科男生,我絕不允許這樣的事情發生在我身上。實現方式是多種多樣的,比如可以用紅外遙控控制,但避免不了總也找不到遙控器;而手機則可享受進被窩的待遇,使用手機控制燈開關作為控制端是最理想的方案,手機端微信小程序有眾多優勢,比如跨平台、無需要安裝等,最終選擇微信小程序作為客戶端,整體整體框架如下:

wps5CE8.tmp

大致可分為三部分:MQTT服務、單片機執行端、微信小程序控制端。

1.1.1. MQTT掃盲

MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基於發布/訂閱(publish/subscribe)模式的"輕量級"通訊協議,該協議構建於TCP/IP協議上,由IBM在1999年發布。

MQTT最大優點在於,可以以極少的代碼和有限的帶寬,為連接遠程設備提供實時可靠的消息服務。作為一種低開銷、低帶寬占用的即時通訊協議,使其在物聯網、小型設備、移動應用等方面有較廣泛的應用。

MQTT基於客戶端-服務器的消息發布/訂閱傳輸協議。MQTT協議是輕量、簡單、開放和易於實現的,這些特點使它適用范圍非常廣泛。在很多情況下,包括受限的環境中,如:機器與機器(M2M)通信和物聯網(IoT)。其次,通過衛星鏈路通信傳感器、偶爾撥號的醫療設備、智能家居、及一些小型化設備中已廣泛使用。

wps5CE9.tmp

實現MQTT協議需要客戶端和服務器端通訊完成,在通訊過程中,MQTT協議中有三種身份:發布者(Publish)、代理(Broker)(服務器)、訂閱者(Subscribe)。其中,消息的發布者和訂閱者都是客戶端,消息代理是服務器,消息發布者可以同時是訂閱者。

MQTT傳輸的消息分為主題(Topic)和負載(payload)兩部分:

a. Topic,可以理解為消息的類型,訂閱者訂閱(Subscribe)后,就會收到該主題的消息內容(payload);

b. payload,可以理解為消息的內容,是指訂閱者具體要使用的內容。

MQTT會構建底層網絡傳輸:它將建立客戶端到服務器的連接,提供兩者之間的一個有序的、無損的、基於字節流的雙向傳輸。

當應用數據通過MQTT網絡發送時,MQTT會把與之相關的服務質量(QoS)和主題名(Topic)相關連。

1.1.1.1. MQTT客戶端

一個使用MQTT協議的應用程序或者設備,它總是建立到服務器的網絡連接。客戶端可以:

a. 發布其他客戶端可能會訂閱的信息;

b. 訂閱其它客戶端發布的消息;

c. 退訂或刪除應用程序的消息;

d. 斷開與服務器連接。

1.1.1.2. MQTT服務器

MQTT服務器以稱為"消息代理"(Broker),可以是一個應用程序或一台設備。它是位於消息發布者和訂閱者之間,它可以:

a. 接受來自客戶的網絡連接;

b. 接受客戶發布的應用信息;

c. 處理來自客戶端的訂閱和退訂請求;

d. 向訂閱的客戶轉發應用程序消息。

1.1.1.3. MQTT服務
1.1.1.3.1. 搭建本地MQTT服務器

搭建本地MQTT服務器的開源客戶端非常多,百度搜索“搭建本地MQTT服務器”會找到大量的教程,跟着教程一步步做很容易搭建,這里就不啰嗦了。

推薦mosquitto。

搭建本地服務器進行測試,后續需內網穿透(如花生殼等),后續才可在外網訪問到本地數據。而當前有很多網絡公司提供免費MQTT服務(當然有訪問量限值),使用這些現成的服務可以避免內網穿透及服務器維護等,是學習過程中的不錯選擇。推薦環信(百度搜索環信)。

1.1.1.3.2. 環信MQTT服務器

百度搜索“環信即時通訊”,打開環信官網,如下圖:

wps5CEA.tmp

按提示注冊環信賬戶,注意:注冊環信賬戶需要可用的郵箱。

激活后進入控制台,打開幫助:

wps5CEB.tmp

wps5CEC.tmp wps5CED.tmp

留意如下信息:

wps5CFD.tmp

wps5CFE.tmp

mqtt-fx界面如下:

wps5CFF.tmp

Extras->Edit connection profiles進入對話框,設置參數:

wps5D00.tmp

Client ID根據由xxx@Appname組成。

1.1.2. 配置服務器APP
1.1.2.1. 新建APP

為了方便管理,實際項目開發中最好設置獨立的app對應。在環信后台,選擇“首頁”->“添加應用”,按提示新建APP,如下:

wps5D01.tmp

wps5D02.tmp

開通app的MQTT服務(如已開通則可跳過),

wps5D03.tmp

wps5D04.tmp wps5D05.tmp

如下兩個位置,有連接服務的全部信息:

wps5D16.tmp

wps5D17.tmp

1.1.2.2. 測試APP

按下圖配置mqtt_fx,連接到服務器:

wps5D18.tmp

wps5D19.tmp

注意:publish、subscribe主題要一致,能接收到則證明app配置成功。

1.1.3. 執行端實現
1.1.3.1. 硬件電路

wps5D1A.tmp

1.1.3.2. 程序實現

micropython內置了mqtt的驅動模塊,在命令行使用help(“modules”)命令可以查到該模塊,如下:

wps5D1B.tmp

但在micropython的官網文檔中,對mqtt模塊的描述非常少,學習mqtt模塊可以到micropython_lib的源碼庫中學習,目錄micropython-lib/micropython/umqtt.simple,示例:

wps5D1C.tmp

本項目的實現代碼:

from machine import Pin

from time import sleep

from umqtt.simple import MQTTClient

import machine

led = Pin(2,Pin.OUT)

for i in range(3):

    led.on()

    sleep(0.5)

    led.off()

    sleep(0.5)

ctl = Pin(27,Pin.OUT)

def msg_callback(topic,msg):

    if msg==b'on':

        led.on()

        ctl.on()

    elif msg==b'off':

        led.off()

        ctl.off()

    else:

        pass

unique_id = machine.unique_id()

id_str = "{:.02x}{:.02x}{:.02x}{:.02x}{:.02x}{:.02x}".format(unique_id[0],unique_id[1],unique_id[2],unique_id[3],unique_id[4],unique_id[5])

print("client_id:"+id_str+"@nvfma0")

client = MQTTClient(id_str+"@nvfma0","nvfma0.cn1.mqtt.chat",port=1883,user="admin",password="YWMtik3FjjvhEey0XQtjEv9BhT7ramIbGUiJmZE06f5xgKjDWfdAK7kR7J4RvbTqXNhLAwMAAAF84NtPXzht7EBMJIAgcN45yeo_N1lkUvPAyCd1MpYaeeVavY-5Kc_LuQ")

client.connect()

client.set_callback(msg_callback)

client.subscribe("led_ctl")

while True:

    client.wait_msg()

 

1.1.4. 微信小程序控制端

在微信小程序中搜索“MQTT遙控開關”,打開微信小程序,填寫服務器連接地址、用戶名、密碼(token),點擊“連接服務器”,服務器連接成功會有提示,接下來就可以通過“on”和“off”按鍵操作執行端了,如圖:

wps5D1D.tmp wps5D1E.tmp


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM