授人以魚不如授人以漁,目的不是爲了教會你具體項目開發,而是學會學習的能力。但願你們分享給你周邊須要的朋友或者同窗,說不定大神成長之路有博哥的奠定石。。。html
QQ技術互動交流羣:ESP8266&32 物聯網開發 羣號622368884,不喜勿噴node
1、基礎篇git
2、網絡篇web
- ESP8266開發之旅 網絡篇① 認識一下Arduino Core For ESP8266
- ESP8266開發之旅 網絡篇② ESP8266 工做模式與ESP8266WiFi庫
- ESP8266開發之旅 網絡篇③ Soft-AP——ESP8266WiFiAP庫的使用
- ESP8266開發之旅 網絡篇④ Station——ESP8266WiFiSTA庫的使用
- ESP8266開發之旅 網絡篇⑤ Scan WiFi——ESP8266WiFiScan庫的使用
- ESP8266開發之旅 網絡篇⑥ ESP8266WiFiGeneric——基礎庫
- ESP8266開發之旅 網絡篇⑦ TCP Server & TCP Client
- ESP8266開發之旅 網絡篇⑧ SmartConfig——一鍵配網
- ESP8266開發之旅 網絡篇⑨ HttpClient——ESP8266HTTPClient庫的使用
- ESP8266開發之旅 網絡篇⑩ UDP服務
- ESP8266開發之旅 網絡篇⑪ WebServer——ESP8266WebServer庫的使用
- ESP8266開發之旅 網絡篇⑫ 域名服務——ESP8266mDNS庫
- ESP8266開發之旅 網絡篇⑬ SPIFFS——ESP8266 Flash文件系統
- ESP8266開發之旅 網絡篇⑭ web配網
- ESP8266開發之旅 網絡篇⑮ 真正的域名服務——DNSServer
- ESP8266開發之旅 網絡篇⑯ 無線更新——OTA固件更新
3、應用篇json
4、高級篇api
參考博主線上博文:數組
Http協議做爲經常使用網絡協議,其爲短鏈接協議(這裏不講解HTTP協議,請讀者自行查閱資料),在OneNet平臺上也一樣支持。網絡
設備側適用特色:app
平臺側提供功能:dom
典型適用場景
注意點:
建立完畢後,咱們點擊查看具體的產品信息:
注意點:
API接口定義:
操做步驟:
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" } }
API接口定義:
操做步驟:
爲了明確區分代碼功能,博哥命名工程名爲P_OneNet_Exam02:
/** * 功能: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); } }
#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羣裏。
注意點:
把工程燒進NodeMcu,而後能夠看到串口打印內容,以下:
同時,也能夠在OneNet平臺看到數據流狀況,以下:
在理解HTTP協議的基礎上,本篇是很是容易操做的。可是讀者也須要關注幾點:
下一篇,博哥將講解 玩轉OneNET物聯網平臺之HTTP服務② —— 模擬上傳溫度(HttpClient)。