玩转OneNET物联网平台之HTTP服务① —— 模拟上传温度(TcpClient)
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。
QQ技术互动交流群:ESP8266&32 物联网开发 群号622368884,不喜勿喷
一、你如果想学基于Arduino的ESP8266开发技术
一、基础篇
二、网络篇
- 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固件更新
三、应用篇
四、高级篇
1.理论基础
参考博主线上博文:
- 玩转OneNET物联网平台之简介
- ESP8266开发之旅 网络篇⑨ HttpClient——ESP8266HTTPClient库的使用
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_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,然后可以看到串口打印内容,如下:

同时,也可以在OneNet平台看到数据流情况,如下:

4.总结
在理解HTTP协议的基础上,本篇是非常容易操作的。但是读者也需要关注几点:
- 创建自己的OneNet产品,不要用博哥创建的(请在博哥源码基础上修改自己的产品信息);
- 可以尝试加入优化代码,比如温度值不变,是否考虑不上传,或者加大上传间隔,也或者加入睡眠模式
下一篇,博哥将讲解 玩转OneNET物联网平台之HTTP服务② —— 模拟上传温度(HttpClient)。
玩转OneNET物联网平台之HTTP服务① —— 模拟上传温度(TcpClient)的更多相关文章
- 玩转OneNET物联网平台之MQTT服务④ —— 远程控制LED(设备自注册)+ Android App控制
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- 玩转OneNET物联网平台之MQTT服务③ —— 远程控制LED(设备自注册)
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- 玩转OneNET物联网平台之MQTT服务② —— 远程控制LED
1.理论基础 参考博主线上博文: 玩转PubSubClient MQTT库 玩转OneNET物联网平台之简介 玩转OneNET物联网平台之MQTT服务① 2.远程控制LED 2.1 实验材料 ...
- 玩转OneNET物联网平台之MQTT服务⑤ —— OneNet智能灯+MVP框架
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- 玩转OneNET物联网平台之HTTP服务③ —— OneNet智能灯 HTTP版本
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- 玩转OneNET物联网平台之MQTT服务⑦ —— 远程控制LED(数量无限制)+ Android App控制 优化第一版
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- 玩转OneNET物联网平台之MQTT服务① —— OneNetMqtt全方位调试
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- 玩转OneNET物联网平台之简介
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- 网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例
UDP协议 (了解) 称之为数据包协议,又称不可靠协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需 ...
随机推荐
- 通俗讲解 RESTful
1 什么是 RESTful 百度一下 RESTful,查到的资料很多都讲得不清楚,看完了都不知道说的是啥,导致很多人对 RESTful 不甚了解.来看一下常见的解释: (1)神一样的描述REST 并不 ...
- 2019-2020-1 20199303 《Linux内核原理分析》 第一周作业
2019-2020-1 20199303 <Linux内核原理分析> 第一周作业 1. 环境准备 在众多的Linux发行版中,Ubuntu,小红帽还有类Unix系统的BSD系统,我选择了目 ...
- Linux 安装CentOS7操作系统
作者:小啊博 QQ:762641008 转载请声明:https://www.cnblogs.com/-bobo 1.安装操作系统 开启虚拟机后会出现以下界面 Install CentOS 7 安装Ce ...
- druid 连接池的配置参数
介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生 ...
- 【SQL server基础】SQL视图加密,永久隐藏视图定义的文本
SQL可以对视图进行加密.也就是,可永久隐藏视图定义的文本. 注意 此操作不可逆.加密视图后,无法再修改它,因为无法再看到视图定义.如果需要修改加密视图,则必须删除它并重新创建另一个视图. 示例代 ...
- Spring只定义接口自动代理接口实现类
能够扫描到包 @ComponentScan("org.zxp.esclientrhl") ESCRegistrar类主要实现ImportBeanDefinitionRegistra ...
- 你不知道的 IDEA Debug调试小技巧
一.多线程调试断点 Intellij IDEA 的debug断点调试是有一个模式的选择的,就像下面这张图,平时我们都使用的是默认的 ALL(在Eclipse中默认是线程模式) ,这种模式我们只能将一个 ...
- python串口助手
最近项目中要使用模拟数据源通过向外发送数据,以前都是用C#编写,最近在研究python,所以就用python写了一个串口助手,方便以后的测试. 在电脑上通过虚拟串口助手产生两个虚拟串口,运行编写的串口 ...
- 利用JVM在线调试工具排查线上问题
在生产上我们经常会碰到一些不好排查的问题,例如线程安全问题,用最简单的threaddump或者heapdump不好查到问题原因.为了排查这些问题,有时我们会临时加一些日志,比如在一些关键的函数里打印出 ...
- python与数据存储
思考:为什么使用计算机? 存储数据,计算数据 思考:数据存在哪里? 数据存在内存里 内存:内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁.计算机中所有程序的运行都是在内存中进行的,因此内存的 ...