1. 程式人生 > >智能家居入門DIY——【五、執行命令】

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

嵌套 實現 mps 狀態 client ble cmd sid 智能家居

前面幾篇介紹了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——【五、執行命令】