授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。但愿你们分享给你周边须要的朋友或者同窗,说不定大神成长之路有博哥的奠定石。。。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)。