前面幾篇介紹了ESP8266使用AT命令來鏈接WIFI實現一系列功能。這一篇介紹一下使用Wemos D1 Wifi來進行開發,固然也能夠用常見的8針ESP8266來完成(只是須要按網上的方法將Arduino做爲燒寫器,我是買了一個)。若是不用鏈接太多的傳感器,那麼ESP8266模塊自己就夠用了。git
1、工具選擇json
一、VS2015社區版,安裝FOR ARDUINO IDE。服務器
二、SOCKET調試工具NetAssist。工具
2、過程ui
一、安裝ESP8266開發板到IDEspa
二、選擇NodeMCU1.0調試
三、編寫代碼而後燒錄code
這個不涉及到任何刷固件之類的軟件,直接用IDE作就能夠了。很是簡單不是?server
做爲例子,依然用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這個要靈活豐富不少,固然作起來也就須要更費勁一點。