智能家居入門DIY——【五、執行命令】
前面幾篇介紹了ESP8266使用AT命令來連接WIFI實現一系列功能。這一篇介紹一下使用Wemos D1 Wifi來進行開發,當然也可以用常見的8針ESP8266來完成(只是需要按網上的方法將Arduino作為燒寫器,我是買了一個)。如果不用連接太多的傳感器,那麽ESP8266模塊本身就夠用了。
一、工具選擇
1、VS2015社區版,安裝FOR ARDUINO IDE。
2、SOCKET調試工具NetAssist。
二、過程
1、安裝ESP8266開發板到IDE
2、選擇NodeMCU1.0
3、編寫代碼然後燒錄
這個不涉及到任何刷固件之類的軟件,直接用IDE做就可以了。非常簡單不是?
作為例子,依然用lewei50的TCP連接,後面文章可能還會說一下OneNet的MQTT協議:
此時,可以使用如下庫:
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
其中ESP8266WIFI是連接WIFI來的,而WIFICLIENT是用來做客戶端和服務器通訊的:
//連接WIFI bool ConnectWifi() { if (!WiFi.isConnected()) { WiFi.begin(ssid, password);while (!WiFi.isConnected()) { delay(100); } } return WiFi.isConnected();// WiFi.status() == WL_CONNECTED; } //連接服務器 bool ConnectServer() { if (wClient.status() != ESTABLISHED) { wClient.stop(); wClient.connect(serverUrl, serverPort); delay(1000); } return wClient.status()==4; }
這都非常簡單,然後介紹一下ArduinoJson庫,這個庫就是用來編輯Json數據的,lewei50的TCP長連要求先發送識別碼,相當於登錄:
//發送識別碼 bool UpDateToServer() { String info = ""; StaticJsonDocument<200> doc; JsonObject root = doc.to<JsonObject>(); root["method"] = "update"; root["gatewayNo"] = "01"; root["userkey"] = userKey; serializeJson(root, info); info += (String)"&^!"; return wClient.print(info)== info.length(); }
這樣就實現了這個登錄格式要求(API參考文檔為:http://www.lewei50.com/dev/doc/155)
{
"method": "update",
"gatewayNo": "你的網關號",
"userkey": "你的userkey"
}&^!
接下來來點幹貨,怎麽實現這樣的格式:
{
"method": "response",
"result": {
"successful": true,
"message": "xxxx"
}
}&^!
還有這樣的格式:
{
"method": "upload",
"data":[
{
"Name":"T1",
"Value":"1"
},
{
"Name":"01H1",
"Value":"96.2"
}
]
}&^!
這樣的格式:
{
"method": "response",
"result": {
"successful": true,
"message": "xxxx",
"data":[
{
"id":"C1",
"value":"1"
},
{
"id":"C2",
"value":"2"
}]
}
}&^!
JsonObject是可以嵌套的,實現代碼如下:
//上傳數據 bool UpLoadToServer() { String info = ""; //根節點 StaticJsonDocument<500> doc; JsonObject root = doc.to<JsonObject>(); //method節點 root["method"] = "upload"; //data節點 JsonArray data= root.createNestedArray("data"); //data數據 data.add(CreateJsonObject("Name", "T1", "Value", (String)dht22.getTemperature())); data.add(CreateJsonObject("Name", "H1", "Value", (String)dht22.getHumidity())); serializeJson(root, info); info += (String)"&^!"; return wClient.print(info) == info.length(); } //創建data子json對象 JsonObject CreateJsonObject(String key1,String val1,String key2 ,String val2) { StaticJsonDocument<100> buffer; JsonObject obj = buffer.to<JsonObject>(); obj[key1] = val1; obj[key2] = val2; return obj; }
至於執行命令,就是獲取服務器發送來的消息,然後解析Json就可以了。
String serverMessage = ""; if (wClient.available()) { serverMessage = wClient.readString(); Serial.println("read"); //Serial.println(serverMessage); } if (serverMessage != "") { Serial.println("docommand"); DoCommand(serverMessage); } //執行服務器的命令 void DoCommand(String serverMessage) { String cmd = DumpServerMessage(serverMessage, "f"); //回復服務器對控制器狀態的查詢 if (cmd == "getAllSensors") { ResponseState(); } //服務器更新控制器的命令 else if (cmd == "updateSensor") { String id = DumpServerMessage(serverMessage, "p1"); //命令參數1,控制器ID int state = DumpServerMessage(serverMessage, "p2").toInt(); //命令參數2,控制器狀態0=關,1=開 if (!ResponseCommand((String)id + ":" + state)) { Serial.println("re command err"); } else { if (id == "C1") { digitalWrite(C1Pin, state); } } } //服務器的其他消息 else { //Serial.println((String)"cmd:\r\n" + cmd); } }
嗯,就到這裏吧,剩下的可以自己去研究一下。下一篇介紹一下OneNet的MQTT,OnetNet比lewei50這個要靈活豐富很多,當然做起來也就需要更費勁一點。
智能家居入門DIY——【五、執行命令】