智能家居入門DIY——【5、執行命令】

        前面幾篇介紹了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這個要靈活豐富不少,固然作起來也就須要更費勁一點。

相關文章
相關標籤/搜索