1.1. 物聯網開關(基於MQTT)
在冬天,從被窩里鑽出來關燈需要莫大的勇氣。
而作為資深的工科男生,我絕不允許這樣的事情發生在我身上。實現方式是多種多樣的,比如可以用紅外遙控控制,但避免不了總也找不到遙控器;而手機則可享受進被窩的待遇,使用手機控制燈開關作為控制端是最理想的方案,手機端微信小程序有眾多優勢,比如跨平台、無需要安裝等,最終選擇微信小程序作為客戶端,整體整體框架如下:
大致可分為三部分:MQTT服務、單片機執行端、微信小程序控制端。
1.1.1. MQTT掃盲
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基於發布/訂閱(publish/subscribe)模式的"輕量級"通訊協議,該協議構建於TCP/IP協議上,由IBM在1999年發布。
MQTT最大優點在於,可以以極少的代碼和有限的帶寬,為連接遠程設備提供實時可靠的消息服務。作為一種低開銷、低帶寬占用的即時通訊協議,使其在物聯網、小型設備、移動應用等方面有較廣泛的應用。
MQTT基於客戶端-服務器的消息發布/訂閱傳輸協議。MQTT協議是輕量、簡單、開放和易於實現的,這些特點使它適用范圍非常廣泛。在很多情況下,包括受限的環境中,如:機器與機器(M2M)通信和物聯網(IoT)。其次,通過衛星鏈路通信傳感器、偶爾撥號的醫療設備、智能家居、及一些小型化設備中已廣泛使用。
實現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服務器
百度搜索“環信即時通訊”,打開環信官網,如下圖:
按提示注冊環信賬戶,注意:注冊環信賬戶需要可用的郵箱。
激活后進入控制台,打開幫助:
留意如下信息:
mqtt-fx界面如下:
Extras->Edit connection profiles進入對話框,設置參數:
Client ID根據由xxx@Appname組成。
1.1.2. 配置服務器APP
1.1.2.1. 新建APP
為了方便管理,實際項目開發中最好設置獨立的app對應。在環信后台,選擇“首頁”->“添加應用”,按提示新建APP,如下:
開通app的MQTT服務(如已開通則可跳過),
如下兩個位置,有連接服務的全部信息:
1.1.2.2. 測試APP
按下圖配置mqtt_fx,連接到服務器:
注意:publish、subscribe主題要一致,能接收到則證明app配置成功。
1.1.3. 執行端實現
1.1.3.1. 硬件電路
1.1.3.2. 程序實現
micropython內置了mqtt的驅動模塊,在命令行使用help(“modules”)命令可以查到該模塊,如下:
但在micropython的官網文檔中,對mqtt模塊的描述非常少,學習mqtt模塊可以到micropython_lib的源碼庫中學習,目錄micropython-lib/micropython/umqtt.simple,示例:
本項目的實現代碼:
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”按鍵操作執行端了,如圖: