文章目錄
1.理論基礎
參考博主線上博文:
- 玩轉OneNET物聯網平臺之簡介
- ESP8266開發之旅 網絡篇⑨ HttpClient——ESP8266HTTPClient庫的使用
- 玩轉OneNET物聯網平臺之HTTP服務① —— 模擬上傳溫度(TcpClient)
2.OneNet HTTP
Http協議作爲常用網絡協議,其爲短連接協議(這裏不講解HTTP協議,請讀者自行查閱資料),在OneNet平臺上也同樣支持。
設備側適用特點:
- 只上報傳感器數據到平臺
- 無需下行控制質量到設備
平臺側提供功能:
- 存儲設備上報的數據點;
- 提供API接口實現設備管理;
- 提供數據推送到應用;
典型適用場景
- 簡單數據上報場景,比如溫溼度控制系統等傳感器檢測類項目;
3.模擬上傳溫度
3.1 實驗材料
- ESP8266 NodeMcu
- OneNet平臺
3.2 實驗步驟
3.2.1 創建 溫溼度系統-HTTP 產品(HTTP協議)
注意點:
- 務必選擇HTTP協議
創建完畢後,我們點擊查看具體的產品信息:
注意點:
- 需要記錄產品ID,其用來區分產品唯一標識符
- Master-APIkey,網絡請求鑑權信息,接口調用需要帶入
3.2.2 API調試創建 deviceA
API接口定義:
- 參考官方文檔 創建設備
操作步驟:
- 通過API調試工具創建deviceA
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"
}
}
- 查看設備列表
3.2.3 API調試模擬上傳溫度 —— deviceA
API接口定義:
- 參考官方文檔 新增數據點
操作步驟:
- 通過API調試工具發送請求
- 查看操作結果
3.2.4 NodeMcu燒錄代碼 —— deviceA
爲了明確區分代碼功能,博哥命名工程名爲P_OneNet_Exam03:
- P_OneNet_Exam03.ino文件:
/**
* 功能:ESP8266 HTTP 遠程上傳溫度值 V1.0
* 作者:單片機菜鳥
* 時間:2019-06-27
* 描述:
* 1.OneNet平臺端:創建Http協議的產品,創建DeviceA設備點
* 2.每個20s上傳一個隨機值給到OneNet平臺
*/
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include <ESP8266HTTPClient.h>
#include <stdlib.h>
#include <Ticker.h>
#include "H_project.h"
void initSystem();
void wifiTick();
bool postTempToOneNet();
int retry = 0;
/**
* 初始化
*/
void setup() {
initSystem();
}
void loop() {
ESP.wdtFeed();
wifiTick();
if(millis() - lastOneNetPostTick > 30*1000){
lastOneNetPostTick = millis();
if(postTempToOneNet()){
retry = 0;
}else{
retry ++;
if(retry == 20){
retry = 0;
delayRestart(1);
}
}
}
}
/**
* 初始化系統
*/
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是否連接上
* 控制指示燈
*/
void wifiTick(){
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);
}
}
}
/**
* 提交數據到OneNet
*/
bool postTempToOneNet(){
if(WiFi.status() != WL_CONNECTED) return false;
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];
}
return 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);
/*********************************************************/
/*************** OneNet HTTP相關操作 *********************/
WiFiClient client;
HTTPClient http;
String response;
const char* host = "api.heclouds.com";
bool postToDeviceDataPoint(String data);
/*********************************************************/
/*********************** 項目相關操作 ********************/
#define VER "HTTP_TEMP_V1.1"
const char* ssid = "TP-LINK_5344";//wifi賬號
const char* password = "6206908you11011010";//wifi祕密
const unsigned long BAUD_RATE = 115200;// serial connection speed
unsigned long lastWiFiCheckTick = 0;
bool ledState = 0;
unsigned long lastOneNetPostTick=0;
/*********************************************************/
#endif
全部工程代碼,博哥放在個人QQ羣裏。
注意點:
- 這裏用到了JSON,請參考博哥上線博文 玩轉ArduinoJson庫 V5版本;
- 我們這裏使用到了ESP8266 HttpClient來封裝Http請求;
把工程燒進NodeMcu,然後可以看到串口打印內容,如下:
同時,也可以在OneNet平臺看到數據流情況,如下:
4.總結
在理解HTTP協議的基礎上,本篇是非常容易操作的。但是讀者也需要關注幾點:
- 創建自己的OneNet產品,不要用博哥創建的(請在博哥源碼基礎上修改自己的產品信息);
- 可以嘗試加入優化代碼,比如溫度值不變,是否考慮不上傳,或者加大上傳間隔,也或者加入睡眠模式