乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      玩轉(zhuǎn)OneNET物聯(lián)網(wǎng)平臺之MQTT服務(wù)④ —— 遠(yuǎn)程控制LED(設(shè)備自注冊) Android App控制

       印度阿三17 2019-10-28

      授人以魚不如授人以漁,目的不是為了教會你具體項目開發(fā),而是學(xué)會學(xué)習(xí)的能力。希望大家分享給你周邊需要的朋友或者同學(xué),說不定大神成長之路有博哥的奠基石。。。

      QQ技術(shù)互動交流群:ESP8266&32 物聯(lián)網(wǎng)開發(fā) 群號622368884,不喜勿噴

      一、你如果想學(xué)基于Arduino的ESP8266開發(fā)技術(shù)

      一、基礎(chǔ)篇

      1. ESP8266開發(fā)之旅 基礎(chǔ)篇① 走進(jìn)ESP8266的世界
      2. ESP8266開發(fā)之旅 基礎(chǔ)篇② 如何安裝ESP8266的Arduino開發(fā)環(huán)境
      3. ESP8266開發(fā)之旅 基礎(chǔ)篇③ ESP8266與Arduino的開發(fā)說明
      4. ESP8266開發(fā)之旅 基礎(chǔ)篇④ ESP8266與EEPROM
      5. ESP8266開發(fā)之旅 基礎(chǔ)篇⑤ ESP8266 SPI通信和I2C通信
      6. ESP8266開發(fā)之旅 基礎(chǔ)篇⑥ Ticker——ESP8266定時庫

      二、網(wǎng)絡(luò)篇

      1. ESP8266開發(fā)之旅 網(wǎng)絡(luò)篇① 認(rèn)識一下Arduino Core For ESP8266
      2. ESP8266開發(fā)之旅 網(wǎng)絡(luò)篇② ESP8266 工作模式與ESP8266WiFi庫
      3. ESP8266開發(fā)之旅 網(wǎng)絡(luò)篇③ Soft-AP——ESP8266WiFiAP庫的使用
      4. ESP8266開發(fā)之旅 網(wǎng)絡(luò)篇④ Station——ESP8266WiFiSTA庫的使用
      5. ESP8266開發(fā)之旅 網(wǎng)絡(luò)篇⑤ Scan WiFi——ESP8266WiFiScan庫的使用
      6. ESP8266開發(fā)之旅 網(wǎng)絡(luò)篇⑥ ESP8266WiFiGeneric——基礎(chǔ)庫
      7. ESP8266開發(fā)之旅 網(wǎng)絡(luò)篇⑦ TCP Server & TCP Client
      8. ESP8266開發(fā)之旅 網(wǎng)絡(luò)篇⑧ SmartConfig——一鍵配網(wǎng)
      9. ESP8266開發(fā)之旅 網(wǎng)絡(luò)篇⑨ HttpClient——ESP8266HTTPClient庫的使用
      10. ESP8266開發(fā)之旅 網(wǎng)絡(luò)篇⑩ UDP服務(wù)
      11. ESP8266開發(fā)之旅 網(wǎng)絡(luò)篇? WebServer——ESP8266WebServer庫的使用
      12. ESP8266開發(fā)之旅 網(wǎng)絡(luò)篇? 域名服務(wù)——ESP8266mDNS庫
      13. ESP8266開發(fā)之旅 網(wǎng)絡(luò)篇? SPIFFS——ESP8266 Flash文件系統(tǒng)
      14. ESP8266開發(fā)之旅 網(wǎng)絡(luò)篇? web配網(wǎng)
      15. ESP8266開發(fā)之旅 網(wǎng)絡(luò)篇? 真正的域名服務(wù)——DNSServer
      16. ESP8266開發(fā)之旅 網(wǎng)絡(luò)篇? 無線更新——OTA固件更新

      三、應(yīng)用篇

      1. ESP8266開發(fā)之旅 應(yīng)用篇① 局域網(wǎng)應(yīng)用 ——炫酷RGB彩燈
      2. ESP8266開發(fā)之旅 應(yīng)用篇② OLED顯示天氣屏
      3. ESP8266開發(fā)之旅 應(yīng)用篇③ 簡易版WiFi小車

      四、高級篇

      1. ESP8266開發(fā)之旅 進(jìn)階篇① 代碼優(yōu)化 —— ESP8266內(nèi)存管理
      2. ESP8266開發(fā)之旅 進(jìn)階篇② 閑聊Arduino IDE For ESP8266配置
      3. ESP8266開發(fā)之旅 進(jìn)階篇③ 閑聊 ESP8266 Flash
      4. ESP8266開發(fā)之旅 進(jìn)階篇④ 常見問題 —— 解決困擾
      5. ESP8266開發(fā)之旅 進(jìn)階篇⑤ 代碼規(guī)范 —— 像寫文章一樣優(yōu)美
      6. ESP8266開發(fā)之旅 進(jìn)階篇⑥ ESP-specific APIs說明

      1.理論基礎(chǔ)

      ????參考博主線上博文:

      ????在前面的博文中,博主主要通過手動方式去創(chuàng)建設(shè)備。這種方式的缺點明顯:

      • 人為手動控制,對于開發(fā)者來說極度不友好;
      • 如果設(shè)備數(shù)量很多,豈不是要手動操作非常多次;

      ????那么,如何實現(xiàn)設(shè)備自注冊呢?所謂自注冊就是設(shè)備連入網(wǎng)絡(luò)后自動往OneNet云平臺注冊設(shè)備信息并獲取設(shè)備Id。

      • 為了區(qū)分唯一性,我們采用ESP-Mac地址的組合形式
      • 同時為了操作方便,博主花了個周末的時間做了一個對應(yīng)的app,理論上不限制ESP8266接入點的數(shù)量

      ????本篇博文的目的就在于教會大家如何和app通信,完成MQTT協(xié)議下的App遠(yuǎn)程控制LED燈,并且LED燈的數(shù)量可以隨意接入,用戶可以在app端修改設(shè)備名字以便方便操作。

      • 博主極度建議大家從第一篇看起,有個大概了解,因為本系列教程都是有相聯(lián)系的

      ????先上個概念圖:
      www.wityx.com

      2.遠(yuǎn)程控制LED,實現(xiàn)設(shè)備自注冊

      2.1 實驗材料

      • ESP8266 NodeMcu
      • Android手機(jī)
      • OneNet平臺

      2.2 實驗步驟

      2.2.1 創(chuàng)建 ESP8266智能燈系統(tǒng) 產(chǎn)品(MQTT協(xié)議)

      注意點

      • 務(wù)必選擇MQTT協(xié)議

      ????創(chuàng)建完畢后,我們點擊查看具體的產(chǎn)品信息:

      注意點

      • 需要記錄產(chǎn)品ID,其用來區(qū)分產(chǎn)品唯一標(biāo)識符,這個ID待會需要填入App
      • Master-APIkey,網(wǎng)絡(luò)請求鑒權(quán)信息,接口調(diào)用需要帶入,這個ID待會需要填入App

      2.2.2 NodeMcu燒錄代碼 —— MQTT設(shè)備端

      ????為了明確區(qū)分代碼功能,博哥命名工程名為P_OneNet_Exam05:

      • P_OneNet_Exam05.ino文件:
      /**
       *  功能:ESP8266 Mqtt客戶端自注冊功能,通過配套App控制Led消息,理論上可以接入無數(shù)個esp8266
       *  作者:單片機(jī)菜鳥
       *  時間:2019-10-27
       *  描述:
       *      1.初始化工作:初始化網(wǎng)絡(luò)配置,Mqtt客戶端自注冊,連接鑒權(quán),訂閱主題
       *      2.訂閱消息:獲取發(fā)送過來的消息(json格式),解析消息,實現(xiàn)控制亮滅燈
      */
      
      #include <ESP8266WiFi.h>
      #include <PubSubClient.h>
      #include <ESP8266HTTPClient.h>
      #include <ArduinoJson.h>
      #include <EEPROM.h>
      #include <Ticker.h>
      #include "H_project.h"
      
      #define MAGIC_NUMBER 0xAA
      
      int state;
      WiFiClient espClient;
      
      //聲明方法
      void initSystem();
      void initOneNetMqtt();
      void callback(char* topic, byte* payload, unsigned int length);
      void saveConfig();
      void loadConfig();
      bool parseRegisterResponse();
      void parseOneNetMqttResponse(char* payload);
      
      /**
       * 初始化
       */
      void setup() {
        initSystem();
        initOneNetMqtt();
      }
      
      void loop() {
        ESP.wdtFeed();
        state = connectToOneNetMqtt();
        if(state == ONENET_RECONNECT){
           //重連成功 需要重新注冊
           mqttClient.subscribe(TOPIC,1);
           mqttClient.loop();
        }else if(state == ONENET_CONNECTED){
           mqttClient.loop();
        }
        delay(2000);
      }
      
      void initSystem(){
          int cnt = 0;
          Serial.begin (115200);
          Serial.println("\r\n\r\nStart ESP8266 MQTT");
          Serial.print("Firmware Version:");
          Serial.println(VER);
          Serial.print("SDK Version:");
          Serial.println(ESP.getSdkVersion());
          wifi_station_set_auto_connect(0);//關(guān)閉自動連接
          ESP.wdtEnable(5000);
          WiFi.disconnect();
          delay(100);
          WiFi.begin(ssid, password);
          while (WiFi.status() != WL_CONNECTED) {
                delay(500);
                cnt  ;
                Serial.print(".");
                if(cnt>=40){
                  cnt = 0;
                  //重啟系統(tǒng)
                  delayRestart(1);
                }
          }
          pinMode(LED_BUILTIN, OUTPUT);
      
          loadConfig();
          //還沒有注冊
          if(strcmp(config.deviceid,DEFAULT_ID) == 0){
              int tryAgain = 0;
              while(!registerDeviceToOneNet()){
                Serial.print(".");
                delay(500);
                tryAgain  ;
                if(tryAgain == 5){
                  //嘗試5次
                  tryAgain = 0;
                  //重啟系統(tǒng)
                  delayRestart(1);
                }
              }
              if(!parseRegisterResponse()){
                  //重啟系統(tǒng)
                  delayRestart(1);
                  while(1);
              }
          }
      }
      
      void initOneNetMqtt(){
          mqttClient.setServer(mqttServer,mqttPort);
          mqttClient.setClient(espClient);
          mqttClient.setCallback(callback);
      
          initOneNet(PRODUCT_ID,API_KEY,config.deviceid);
      }
      
      void callback(char* topic, byte* payload, unsigned int length) {
        Serial.print("Message arrived [");
        Serial.print(topic);
        Serial.print("] ");
        for (int i = 0; i < length; i  ) {
          Serial.print((char)payload[i]);
        }
        Serial.println();
        parseOneNetMqttResponse((char *)payload);
      }
      
      /*
       * 保存參數(shù)到EEPROM
      */
      void saveConfig()
      {
        Serial.println("Save OneNet config!");
        Serial.print("deviceId:");
        Serial.println(config.deviceid);
      
        EEPROM.begin(150);
        uint8_t *p = (uint8_t*)(&config);
        for (int i = 0; i < sizeof(config); i  )
        {
          EEPROM.write(i, *(p   i));
        }
        EEPROM.commit();
      }
      
      /*
       * 從EEPROM加載參數(shù)
      */
      void loadConfig()
      {
        EEPROM.begin(150);
        uint8_t *p = (uint8_t*)(&config);
        for (int i = 0; i < sizeof(config); i  )
        {
          *(p   i) = EEPROM.read(i);
        }
        EEPROM.commit();
        if (config.magic != MAGIC_NUMBER)
        {
          strcpy(config.deviceid, DEFAULT_ID);
          config.magic = MAGIC_NUMBER;
          saveConfig();
          Serial.println("Restore config!");
        }
        Serial.println("-----Read config-----");
        Serial.print("deviceId:");
        Serial.println(config.deviceid);
        Serial.println("-------------------");
      }
      
      /**
       * 解析mqtt數(shù)據(jù)
       */
      void parseOneNetMqttResponse(char* payload){
         Serial.println("start parseOneNetMqttResponse");
         StaticJsonBuffer<100> jsonBuffer;
           // StaticJsonBuffer 在棧區(qū)分配內(nèi)存   它也可以被 DynamicJsonBuffer(內(nèi)存在堆區(qū)分配) 代替
           // DynamicJsonBuffer  jsonBuffer;
         JsonObject& root = jsonBuffer.parseObject(payload);
      
           // Test if parsing succeeds.
         if (!root.success()) {
             Serial.println("parseObject() failed");
             return ;
         }
      
         String deviceId = root["Did"];
         int status = root["sta"];
      
         if(strcmp(config.deviceid,deviceId.c_str()) == 0){
              if (status == 1) {
                  digitalWrite(LED_BUILTIN, LOW);
              } else {
                  digitalWrite(LED_BUILTIN, HIGH);
              }
          }
      }
      
      /**
       * 解析注冊返回結(jié)果
       */
      bool parseRegisterResponse(){
         Serial.println("start parseRegisterResponse");
         StaticJsonBuffer<200> jsonBuffer;
           // StaticJsonBuffer 在棧區(qū)分配內(nèi)存   它也可以被 DynamicJsonBuffer(內(nèi)存在堆區(qū)分配) 代替
           // DynamicJsonBuffer  jsonBuffer;
         JsonObject& root = jsonBuffer.parseObject(response);
      
           // Test if parsing succeeds.
         if (!root.success()) {
             Serial.println("parseObject() failed");
             return false;
         }
      
         int errno = root["errno"];
         if(errno !=0){
             Serial.println("register failed!");
             return false;
         }else{
             Serial.println("register sucess!");
             strcpy(config.deviceid, root["data"]["device_id"]);
             saveConfig();
             return true;
         }
      }
      • H_project.h 代碼:
      #ifndef _MAIN_H__
      #define _MAIN_H__
      
      
      extern "C" {
      #include "user_interface.h"
      #include "smartconfig.h"
      }
      
      struct onenet_config
      {
        char deviceid[15];
        uint8_t magic;
      };
      
      /************** ESP8266相關(guān)操作 **************************/
      void delayRestart(float t);
      void delayNs(uint8_t m);
      /*********************************************************/
      
      /*************** OneNet MQTT相關(guān)操作 ****************************/
      void initOneNet(uint8_t *productId,uint8_t *apiKey,uint8_t *deviceId);
      int connectToOneNetMqtt();
      /*********************************************************/
      
      /**************** OneNet Http相關(guān)操作 ***************************/
      HTTPClient http;
      String response;
      const char* host = "api.heclouds.com";
      bool registerDeviceToOneNet();
      /****************************************************************/
      
      #define ONENET_DISCONNECTED 1 //已經(jīng)斷開
      #define ONENET_CONNECTED 2    //已經(jīng)連接上
      #define ONENET_RECONNECT 3    //重連成功
      
      //常量
      #define VER             "MQTT_LED_V1.0"
      const char* ssid = "xxxxxxxx";//wifi賬號
      const char* password = "xxxxxxx";//wifi秘密
      
      //OneNet相關(guān)
      PubSubClient mqttClient;
      const char* mqttServer = "183.230.40.39";//mqtt服務(wù)器
      const uint16_t mqttPort = 6002;
      #define PRODUCT_ID    "253190" //此為博哥自己的產(chǎn)品id 請新建自己的
      #define API_KEY    "xxxxxx"
      #define DEFAULT_ID "123456"
      #define TOPIC     "esp8266led"
      
      unsigned long lastWiFiCheckTick = 0;
      bool ledState = 0;
      
      onenet_config config;
      
      #endif
      

      ????全部工程代碼,博哥放在個人QQ群里或者 代碼下載地址。

      注意點

      ????將工程分別燒進(jìn)多個NodeMcu(博哥這里燒錄了兩個),然后可以看到串口打印內(nèi)容,如下:

      ????同時,也可以在OneNet平臺看到設(shè)備情況,如下:

      ????接下來就可以通過App進(jìn)行遠(yuǎn)程控制led了。

      3.配套android App

      3.1 下載App

      • 博主把App放在了個人交流群上以及Github
      • App源碼暫不開源,博主也上傳到了個人交流群

      3.2 配置App

      • 手機(jī)App作為一個特殊的設(shè)備,需要自行注冊一個新的設(shè)備,然后填入deviceId,至于如何注冊設(shè)備,請參考 之前的博文。

      3.3 操作App

      • 主頁面可以看到當(dāng)前所有的設(shè)備列表(也就是你自注冊的所有智能燈),并且標(biāo)明了設(shè)備狀態(tài),然后我們就可以遠(yuǎn)程控制開關(guān)燈。

      3.4 實驗效果

      4.總結(jié)

      需要注意幾點:

      • 創(chuàng)建自己的OneNet產(chǎn)品,不要用博哥創(chuàng)建的,不然很容易發(fā)生MQTT重連的現(xiàn)象
      • 理論上設(shè)備接入數(shù)是無限制的,基本上能滿足普通需求。
      來源:https://www./content-4-530601.html

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多