找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2361|回复: 0
打印 上一主题 下一主题
收起左侧

esp用arduinoide对接onenet 基于ESP8266的制作作品源码以及资料

[复制链接]
跳转到指定楼层
楼主
ID:267429 发表于 2019-3-26 21:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于ESP8266对接机智云介绍

单片机源程序如下:
  1. /*
  2. HTTP协议实现post和get发往onenet平台。
  3. post为温湿度上传。
  4. get为开关消息获取并执行。
  5. 阿正修改,资源源于网络。
  6. */
  7. #include <ESP8266WiFi.h>
  8. #include <ESP8266HTTPClient.h>
  9. #include <ArduinoJson.h>
  10. #include <DHT.h>
  11. #define LED 14                             //配网指示灯D5/GPIO14
  12. #define DEBUG 0
  13. #define ledPin 14                          // 定义ledPin连接到D5/GPIO14
  14. #define DHTPIN 12                         // 温湿度模块 D6 GPIO12
  15. #define DHTTYPE DHT11
  16. int ds;
  17. const char* host = "api.heclouds.com";
  18. const char* APIKEY = "dDu2j8l23dNMJSWv5XVqfc6hXoM=";    // API KEY    改成你自己的
  19. int32_t deviceId = 28315875;                             // Device ID    改成你自己的
  20. const char* DataStreams = "led";           //四个数据流       改成你自己的
  21. const char* DS_Temp = "wendu";
  22. const char* DS_Baojing = "w_baojing";
  23. const char* DS_Hum = "shidu";
  24. const size_t MAX_CONTENT_SIZE = 1024;
  25. const unsigned long HTTP_TIMEOUT = 2100;               // max respone time from server
  26. WiFiClient client;
  27. const int tcpPort = 80;                                //80端口
  28. DHT dht(DHTPIN, DHTTYPE);
  29. struct UserData {
  30.   int errno_val;                // 错误返回值
  31.   char error[32];               // 错误返回信息
  32.   int test_led_Val;             // TEST LED 状态值
  33.   char udate_at[32];            // 最后更新时间及日期
  34. };

  35. // Skip HTTP headers so that we are at the beginning of the response's body
  36. //  -- 跳过 HTTP 头,使我们在响应正文的开头
  37. bool skipResponseHeaders() {
  38.   // HTTP headers end with an empty line
  39.   char endOfHeaders[] = "\r\n\r\n";

  40.   client.setTimeout(HTTP_TIMEOUT);
  41.   bool ok = client.find(endOfHeaders);

  42.   if (!ok) {
  43.     Serial.println("No response or invalid response!");
  44.   }
  45.   return ok;
  46. }
  47. // Read the body of the response from the HTTP server -- 从HTTP服务器响应中读取正文
  48. void readReponseContent(char* content, size_t maxSize) {
  49.   //  size_t length = client.peekBytes(content, maxSize);
  50.   size_t length = client.readBytes(content, maxSize);
  51.   delay(20);
  52.   Serial.println(length);
  53.   Serial.println("Get the data from Internet!");
  54.   content[length] = 0;
  55.   Serial.println(content);
  56.   Serial.println("Read Over!");
  57. }
  58. bool parseUserData_test(char* content, struct UserData* userData) {
  59.   // Compute optimal size of the JSON buffer according to what we need to parse.
  60.   //  -- 根据我们需要解析的数据来计算JSON缓冲区最佳大小
  61.   // This is only required if you use StaticJsonBuffer. -- 如果你使用StaticJsonBuffer时才需要
  62.   const size_t BUFFER_SIZE = 1024;
  63.   // Allocate a temporary memory pool on the stack -- 在堆栈上分配一个临时内存池
  64.   StaticJsonBuffer<BUFFER_SIZE> jsonBuffer;
  65.   //  -- 如果堆栈的内存池太大,使用 DynamicJsonBuffer jsonBuffer 代替
  66.   // If the memory pool is too big for the stack, use this instead:
  67.   //  DynamicJsonBuffer jsonBuffer;
  68.   JsonObject& root = jsonBuffer.parseObject(content);
  69.   if (!root.success()) {
  70.     Serial.println("JSON parsing failed!");
  71.     return false;
  72.   }
  73.   // Here were copy the strings we're interested in
  74.   userData->errno_val = root["errno"];
  75.   strcpy(userData->error, root["error"]);
  76.   if ( userData->errno_val == 0 ) {
  77.     userData->test_led_Val = root["data"]["current_value"];
  78.     strcpy(userData->udate_at, root["data"]["update_at"]);
  79.     Serial.print("YF-Test_LED Value : ");
  80.     Serial.print(userData->test_led_Val);
  81.     Serial.print("\t The last update time : ");
  82.     Serial.println(userData->udate_at);
  83.   }
  84.   Serial.print("errno : ");
  85.   Serial.print(userData->errno_val);
  86.   Serial.print("\t error : ");
  87.   Serial.println(userData->error);
  88.   return true;
  89. }
  90. void colLED(int sta) {
  91.   digitalWrite(ledPin, sta);
  92. }
  93. void smartConfig()//智能配网,可以微信扫一扫进行配网,或者用app进行配网。
  94. {
  95.   WiFi.mode(WIFI_STA);
  96.   Serial.println("\r\nWait for Smartconfig");
  97.   WiFi.beginSmartConfig();
  98.   while (1)
  99.   {
  100.     Serial.print(".");
  101.     digitalWrite(LED, 0);
  102.     delay(500);
  103.     digitalWrite(LED, 1);
  104.     delay(500);
  105.     if (WiFi.smartConfigDone())
  106.     {
  107.       Serial.println("SmartConfig Success");
  108.       Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
  109.       Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
  110.       break;
  111.     }
  112.   }
  113. }
  114. void tcp_test () {
  115.   if (!client.connect(host, tcpPort)) {//链接tcp服务器测试
  116.     Serial.println("connection failed");
  117.     return;
  118.   }
  119. }
  120. void setup() {
  121.   WiFi.mode(WIFI_AP_STA);                 //set work mode:  WIFI_AP /WIFI_STA /WIFI_AP_STA
  122.   Serial.begin(115200);                  //传输波特率
  123.   pinMode(ledPin, OUTPUT);
  124.   dht.begin();                            //初始化温湿度模块
  125.   smartConfig();                          //开启自动配网。
  126. }
  127. void loop() {
  128.   float h = dht.readHumidity();
  129.   float t = dht.readTemperature();
  130.   if (isnan(h) || isnan(t)) {             //检测dht温湿度故障
  131.     Serial.println("Failed to read from DHT sensor!");
  132.     return;
  133.   }
  134.   tcp_test ();                             //tcp链接校验
  135.   getdata();                                //获取下发的数据流
  136.   tcp_test ();                              //tcp链接校验
  137.   postData(deviceId, t, h);                 //发送上报的数据流
  138. }







  139. void postData(int dId, float val_t, float val_h) {    //采用post方式发包,进行http协议温湿度上传
  140.   String url = "/devices/";
  141.   url += String(dId);
  142.   url += "/datapoints?type=3";           //http://open.iot.10086.cn/doc/art190.html#43
  143.   String data = "{\"" + String(DS_Temp) + "\":" + String(val_t) + ",\"" + String(DS_Hum) + "\":" + String(val_h) + ",\"" +  String(DS_Baojing) + "\":" + String(val_t) + "}";
  144.   Serial.println(data);
  145.   Serial.print("data length:");
  146.   Serial.println(String(data.length()));
  147.   String post_data = "POST " + url + " HTTP/1.1\r\n" +
  148.                      "api-key:" + APIKEY + "\r\n" +
  149.                      "Host:" + host + "\r\n" +
  150.                      "Content-Length: " + String(data.length()) + "\r\n" +
  151.                      "Connection: close\r\n\r\n" +
  152.                      data;
  153.   client.print(post_data);
  154. }
  155. void getdata() {                         //采用get方式获取服务器数据反馈进行开关继电器操作
  156.   // We now create a URI for the request
  157.   String url2 = "/devices/";
  158.   url2 += String(deviceId);
  159.   url2 += "/datastreams/";
  160.   url2 += DataStreams;
  161.   String send_data = String("GET ") + url2 + " HTTP/1.1\r\n" +
  162.                      "api-key:" + APIKEY + "\r\n" +
  163.                      "Host:" + host + "\r\n" +
  164.                      "Connection: close\r\n\r\n";
  165.   client.print(send_data);
  166.   if (DEBUG) {
  167.     Serial.println(send_data);
  168.   }
  169.   if (skipResponseHeaders())  { //  发送请求json解析
  170.     char response[MAX_CONTENT_SIZE];
  171.     readReponseContent(response, sizeof(response));
  172.     UserData userData_testLED;
  173.     if (parseUserData_test(response, &userData_testLED)) {
  174.       Serial.println("daily data parse OK!");
  175.       colLED(userData_testLED.test_led_Val);
  176.     }
  177.   }
  178. }
复制代码

所有资料51hei提供下载:
esp用arduinoide对接onenet.zip (3.56 KB, 下载次数: 30)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表