玩轉OneNET物聯網平臺之HTTP服務① —— 模擬上傳溫度(TcpClient)

授人以魚不如授人以漁,目的不是爲了教會你具體項目開發,而是學會學習的能力。但願你們分享給你周邊須要的朋友或者同窗,說不定大神成長之路有博哥的奠定石。。。html

QQ技術互動交流羣:ESP8266&32 物聯網開發 羣號622368884,不喜勿噴node

1、你若是想學基於Arduino的ESP8266開發技術

1、基礎篇git

  1. ESP8266開發之旅 基礎篇① 走進ESP8266的世界
  2. ESP8266開發之旅 基礎篇② 如何安裝ESP8266的Arduino開發環境
  3. ESP8266開發之旅 基礎篇③ ESP8266與Arduino的開發說明
  4. ESP8266開發之旅 基礎篇④ ESP8266與EEPROM
  5. ESP8266開發之旅 基礎篇⑤ ESP8266 SPI通訊和I2C通訊
  6. ESP8266開發之旅 基礎篇⑥ Ticker——ESP8266定時庫

2、網絡篇web

  1. ESP8266開發之旅 網絡篇① 認識一下Arduino Core For ESP8266
  2. ESP8266開發之旅 網絡篇② ESP8266 工做模式與ESP8266WiFi庫
  3. ESP8266開發之旅 網絡篇③ Soft-AP——ESP8266WiFiAP庫的使用
  4. ESP8266開發之旅 網絡篇④ Station——ESP8266WiFiSTA庫的使用
  5. ESP8266開發之旅 網絡篇⑤ Scan WiFi——ESP8266WiFiScan庫的使用
  6. ESP8266開發之旅 網絡篇⑥ ESP8266WiFiGeneric——基礎庫
  7. ESP8266開發之旅 網絡篇⑦ TCP Server & TCP Client
  8. ESP8266開發之旅 網絡篇⑧ SmartConfig——一鍵配網
  9. ESP8266開發之旅 網絡篇⑨ HttpClient——ESP8266HTTPClient庫的使用
  10. ESP8266開發之旅 網絡篇⑩ UDP服務
  11. ESP8266開發之旅 網絡篇⑪ WebServer——ESP8266WebServer庫的使用
  12. ESP8266開發之旅 網絡篇⑫ 域名服務——ESP8266mDNS庫
  13. ESP8266開發之旅 網絡篇⑬ SPIFFS——ESP8266 Flash文件系統
  14. ESP8266開發之旅 網絡篇⑭ web配網
  15. ESP8266開發之旅 網絡篇⑮ 真正的域名服務——DNSServer
  16. ESP8266開發之旅 網絡篇⑯ 無線更新——OTA固件更新

3、應用篇json

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

4、高級篇api

  1. ESP8266開發之旅 進階篇① 代碼優化 —— ESP8266內存管理
  2. ESP8266開發之旅 進階篇② 閒聊Arduino IDE For ESP8266配置
  3. ESP8266開發之旅 進階篇③ 閒聊 ESP8266 Flash
  4. ESP8266開發之旅 進階篇④ 常見問題 —— 解決困擾
  5. ESP8266開發之旅 進階篇⑤ 代碼規範 —— 像寫文章同樣優美
  6. ESP8266開發之旅 進階篇⑥ ESP-specific APIs說明

1.理論基礎

    參考博主線上博文:數組

  • 玩轉OneNET物聯網平臺之簡介
  • ESP8266開發之旅 網絡篇⑨ HttpClient——ESP8266HTTPClient庫的使用

2.OneNet HTTP

    Http協議做爲經常使用網絡協議,其爲短鏈接協議(這裏不講解HTTP協議,請讀者自行查閱資料),在OneNet平臺上也一樣支持。網絡

設備側適用特色app

  • 只上報傳感器數據到平臺
  • 無需下行控制質量到設備

平臺側提供功能dom

  • 存儲設備上報的數據點;
  • 提供API接口實現設備管理;
  • 提供數據推送到應用;

典型適用場景

  • 簡單數據上報場景,好比溫溼度控制系統等傳感器檢測類項目;

3.模擬上傳溫度

3.1 實驗材料

  • ESP8266 NodeMcu
  • OneNet平臺

3.2 實驗步驟

3.2.1 建立 溫溼度系統-HTTP 產品(HTTP協議)

image

注意點

  • 務必選擇HTTP協議

    建立完畢後,咱們點擊查看具體的產品信息:

image

注意點

  • 須要記錄產品ID,其用來區分產品惟一標識符
  • Master-APIkey,網絡請求鑑權信息,接口調用須要帶入

3.2.2 API調試建立 deviceA

API接口定義

操做步驟

  • 經過API調試工具建立deviceA

image

http body

{
    "title": "http_device_A",
    "desc": "http_device_A",
    "tags": ["china", "mobile"],
    "location": {
        "lon": 109,
        "lat": 23.54
    },
    "auth_info": "http_device_A",
    "other": {
        "version": "1.0.0",
        "manufacturer": "china mobile"
    }
}
  • 查看設備列表

image

3.2.3 API調試模擬上傳溫度 —— deviceA

API接口定義

操做步驟

  • 經過API調試工具發送請求

image

  • 查看操做結果
    image

image

3.2.4 NodeMcu燒錄代碼 —— deviceA

    爲了明確區分代碼功能,博哥命名工程名爲P_OneNet_Exam02:

  • P_OneNet_Exam02.ino文件:
/**
 *  功能:ESP8266 HTTP 遠程上傳溫度值 V1.0
 *  做者:單片機菜鳥
 *  時間:2019-06-27
 *  描述:
 *      1.OneNet平臺端:建立Http協議的產品,建立DeviceA設備點
 *      2.每一個20s上傳一個隨機值給到OneNet平臺
*/

#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include <stdlib.h>
#include <Ticker.h>
#include "H_project.h"

void initSystem();
void wifiTick();
void postTempToOneNet();

/**
 * 初始化
 */
void setup() {
  initSystem();
}

void loop() {
  ESP.wdtFeed();
  wifiTick();
  doTCPClientTick();
  postTempToOneNet();
}

/**
 * 初始化系統
 */
void initSystem(){
    int cnt = 0;
    Serial.begin (115200);
    Serial.println("\r\n\r\nStart ESP8266 HTTP");
    Serial.print("Firmware Version:");
    Serial.println(VER);
    Serial.print("SDK Version:");
    Serial.println(ESP.getSdkVersion());
    wifi_station_set_auto_connect(0);//關閉自動鏈接
    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;
            //重啓系統
            delayRestart(1);
          }
    }
    pinMode(LED_BUILTIN, OUTPUT);
}

/*
*  WiFiTick
*  檢查是否須要初始化WiFi
*  檢查WiFi是否鏈接上,若鏈接成功啓動TCP Client
*  控制指示燈
*/
void wifiTick(){
  static bool taskStarted = false;
  static bool ledTurnon = false;
   if ( WiFi.status() != WL_CONNECTED ) {
       if (millis() - lastWiFiCheckTick > 1000) {
         lastWiFiCheckTick = millis();
         ledState = !ledState; digitalWrite(LED_BUILTIN, ledState);
         ledTurnon = false;
       }
    }else{
       if (ledTurnon == false) {
             ledTurnon = true;
             digitalWrite(LED_BUILTIN, 0);
        }

        if (taskStarted == false) {
             taskStarted = true;
             startTCPClient();
        }
    }
}

/**
 * 檢查client鏈接
 */
void doTCPClientTick(){
   //檢查是否斷開,斷開後重連
   if(WiFi.status() != WL_CONNECTED) return;
   if (!client.connected()) {//斷開重連
      if(preTCPConnected == true){
            preTCPConnected = false;
            preTCPStartTick = millis();
            Serial.println();
            Serial.println("TCP Client disconnected.");
            client.stop();
       }else if(millis() - preTCPStartTick > 10*1000){
            startTCPClient();
       }
   }
}

/**
 * 啓動Tcp client
 */
void startTCPClient(){
   Serial.println("\r\nstartTCPClient");
  if(client.connect(host, 80)){
      preTCPConnected = true;
      client.setNoDelay(true);
  }else{
      Serial.print("Failed connected to server:");
      Serial.println(host);
      client.stop();
      preTCPConnected = false;
  }
  preTCPStartTick = millis();
}

/**
 * 提交數據到OneNet
 */
void postTempToOneNet(){
   if(WiFi.status() != WL_CONNECTED || !client.connected()) return;
   if(millis() - lastOneNetPostTick > 15*1000){
       lastOneNetPostTick = millis();
       Serial.println("TCP Client postTempToOneNet.");

       StaticJsonBuffer<230> jsonBuffer;
       //建立根,也就是頂節點
       JsonObject& root = jsonBuffer.createObject();
       //在root對象中加入data數組
       JsonArray& datastreams = root.createNestedArray("datastreams");
       JsonObject& stream = datastreams.createNestedObject(); 
       stream["id"] = "temperature";
       JsonArray& datapoints = stream.createNestedArray("datapoints");
       JsonObject& value1 = datapoints.createNestedObject();
       value1["value"] =  random(20, 50);
       JsonObject& value2 = datapoints.createNestedObject();
       value2["value"] =  random(20, 50);
       
       int len = root.measureLength();
       char buffer[100];
       root.printTo(buffer, 100);
       String data;
       for(int index = 0;index<len;index++){
           data += buffer[index];
       }
       postToDeviceDataPoint(data);
   }
}
  • H_project.h 代碼:
#ifndef _MAIN_H__
#define _MAIN_H__


extern "C" {
#include "user_interface.h"
#include "smartconfig.h"
}

/************** ESP8266相關操做 **************************/
void delayRestart(float t);
void delayNs(uint8_t m);
/*********************************************************/

/******************** Http 相關操做 **********************/
const unsigned long HTTP_TIMEOUT = 5000;// max respone time from server
const size_t MAX_CONTENT_SIZE = 500;// max size of the HTTP response

WiFiClient client;
char response[MAX_CONTENT_SIZE];
char endOfHeaders[] = "\r\n\r\n";

bool sendGetRequest(const char* host,String url,String header,char* response);
bool sendPostRequest(const char* host,String url,String header,String postData,char* response);
bool skipResponseHeaders();
void readReponseContent(char* content, size_t maxSize);
void clearResponseBuffer(char* response);
/*********************************************************/

/*************** OneNet HTTP相關操做 *********************/
const char* host = "api.heclouds.com";
bool postToDeviceDataPoint(String data);
/*********************************************************/

/*********************** 項目相關操做 ********************/
#define VER             "HTTP_TEMP_V1.0"
const char* ssid = "TP-LINK_5344";//wifi帳號
const char* password = "xxxxxx";//wifi祕密
const unsigned long BAUD_RATE = 115200;// serial connection speed
unsigned long lastWiFiCheckTick = 0;
bool ledState = 0;
unsigned long lastOneNetPostTick=0;
unsigned long preTCPStartTick=0;
bool preTCPConnected=false;
/*********************************************************/

#endif

    所有工程代碼,博哥放在我的QQ羣裏。

注意點

  • 這裏用到了JSON,請參考博哥上線博文 玩轉ArduinoJson庫 V5版本
  • 咱們這裏使用到了ESP8266 WiFiClient來封裝Http請求(也能夠直接使用HttpClient庫),爲了加深理解,請讀者參考博哥上線博文 ESP8266開發之旅 網絡篇⑦ TCP Server & TCP Client 關於client部分;

    把工程燒進NodeMcu,而後能夠看到串口打印內容,以下:

image

    同時,也能夠在OneNet平臺看到數據流狀況,以下:

image

4.總結

在理解HTTP協議的基礎上,本篇是很是容易操做的。可是讀者也須要關注幾點:

  • 建立本身的OneNet產品,不要用博哥建立的(請在博哥源碼基礎上修改本身的產品信息);
  • 能夠嘗試加入優化代碼,好比溫度值不變,是否考慮不上傳,或者加大上傳間隔,也或者加入睡眠模式

下一篇,博哥將講解 玩轉OneNET物聯網平臺之HTTP服務② —— 模擬上傳溫度(HttpClient)。

相關文章
相關標籤/搜索