请问ESP8266怎么接入阿里云物联平台实现一键配网-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1488|回复: 8

[未解决] 请问ESP8266怎么接入阿里云物联平台实现一键配网

[复制链接]
发表于 2022-8-3 10:11 | 显示全部楼层 |阅读模式
各位大神好,本人小白一个,手里有块D1 WIFI Arduino UNO开发板,想通过接入阿里云物联平台实现阿里云智能APP手机远程控制WS2812 RGB LED,以及接入天猫精灵。经过几天的摸索和东拼西凑,现在已经实现开发板接入阿里云,并可以通过平台在线调试发送指令远程控制WS2812 RGB LED的开关和调色。但想加入一键配网功能一直实现不了,尝试过使用WiFi.beginSmartConfig()函数,但代码上传到开发板后用微信却可以配网,而用云智能APP添加不了设备。也看了阿里云官方关于一键配网的文档https://help.aliyun.com/document_detail/111047.html#section-3ig-m8q-pnz,无奈理解不了。有没有相关经验的大神给指导一下,感激不尽
  1. #include <ESP8266WiFi.h>
  2. #include <EEPROM.h>
  3. static WiFiClient espClient;

  4. #include <Arduino.h>
  5. #include <ArduinoJson.h>
  6. #include <aliyun_mqtt.h>
  7. #include "PubSubClient.h"
  8. #include "Ticker.h"

  9. /*****************网络设置项 *****************/
  10. const char *ssid2;                      //提供上网的无线路由ssid
  11. String ssid3;
  12. int ss;
  13. const char *password2;                  //提供上网的无线路由密码
  14. String password3;
  15. int pp;
  16. int count = 0;
  17. bool WIFI_Status = true;

  18. #include <Adafruit_NeoPixel.h>//rgb
  19. #ifdef __AVR__
  20. #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
  21. #endif
  22. #define PIXEL_PIN    D10  // Digital IO pin connected to the NeoPixels.
  23. #define PIXEL_COUNT 16  // Number of NeoPixels
  24. Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);


  25. #define WIFI_SSID "HONOR-510G1C"
  26. #define WIFI_PASSWD "qwaszx11"

  27. #define PRODUCT_KEY "a1OoF7GyNFB"
  28. #define DEVICE_NAME "9mui5RRSZbeuP4y8UinF"
  29. #define DEVICE_SECRET "1e4fcb1260667ed1321af8d7c7256e2d"
  30. #define REGION_ID "cn-shanghai"

  31. //设备下发命令的set主题
  32. #define ALINK_TOPIC_PROP_SET "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set"
  33. //设备上传数据的post主题
  34. #define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"
  35. //设备post上传数据要用到一个json字符串, 这个是拼接postJson用到的一个字符串
  36. #define ALINK_METHOD_PROP_POST "thing.event.property.post"
  37. //这是post上传数据使用的模板
  38. #define ALINK_BODY_FORMAT "{"id":"%u","version":"1.0","method":"%s","params":%s}"

  39. int postMsgId = 0; //记录已经post了多少条
  40. Ticker tim1;       //这个定时器是为了每5秒上传一次数据

  41. PubSubClient mqttClient(espClient); //通过网络客户端连接创建mqtt连接客户端

  42. void setup()
  43. {
  44.   strip.begin(); // Initialize NeoPixel strip object (REQUIRED)
  45.   strip.show();  // Initialize all pixels to 'off'

  46.   pinMode(LED_BUILTIN, OUTPUT);
  47.   digitalWrite(LED_BUILTIN, 1);

  48.   Serial.begin(115200);
  49.   EEPROM.begin(1024);
  50.   if (EEPROM.read(0) == 200) {
  51.     Serial.println("OK"); //测试数据
  52.     WiFi.mode(WIFI_STA);
  53.     ss = EEPROM.read(1);             //ssid长度
  54.     pp = EEPROM.read(2);             //密码长度
  55.     ssid3 = ssid1(ss, 10);
  56.     ssid2 = ssid3.c_str();
  57.     password3 = password1(pp, 30);
  58.     password2 = password3.c_str();
  59.     WiFi.begin(ssid2, password2);
  60.     delay(1000);
  61.     Serial.println("\r\n正在连接");
  62.     while (WiFi.status() != WL_CONNECTED)
  63.     {
  64.       if (WIFI_Status)
  65.       {
  66.         Serial.print(".");
  67.         digitalWrite(LED_BUILTIN, HIGH);
  68.         delay(500);
  69.         digitalWrite(LED_BUILTIN, LOW);
  70.         delay(500);
  71.         count++;
  72.         if (count >= 5) //5s
  73.         {
  74.           WIFI_Status = false;
  75.           Serial.println("WiFi连接失败,可能errom中数据出错,请用手机重新进行配网");
  76.         }
  77.       }
  78.       else
  79.       {
  80.         smartConfig();  //微信智能配网
  81.       }
  82.     }
  83.     /*****************************************/
  84.   }
  85.   /*如果errom中没有数据,则开始执行配网*/
  86.   else {
  87.     Serial.println("Start module");
  88.     smartConfig();
  89.   }

  90.   /*连接路由器*/
  91.   setup_wifi();
  92.   /*连接mqtt的onenet端口并设置回调函数*/
  93.   if (connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET))
  94.   {
  95.     Serial.println("MQTT服务器连接成功!");
  96.   };
  97.   mqttClient.setCallback(callback); //绑定收到set主题时的回调(命令下发回调)
  98.   tim1.attach(5, mqttPublish);      //启动每5秒发布一次消息


  99. }

  100. void loop()
  101. {
  102.   //检测有没有断线
  103.   if (WiFi.status() != WL_CONNECTED) //先看WIFI是否还在连接
  104.   {
  105.     WiFi.begin(ssid2, password2);
  106.     Serial.println("go to wifi");
  107.     Serial.println(ssid2);
  108.     Serial.println(password2);
  109.     delay(1000);
  110.     return;
  111.   }
  112.   else //如果WIFI连接了,
  113.   {
  114.     if (!mqttClient.connected()) //再看mqtt连接了没
  115.     {
  116.       Serial.println("mqtt已断开!尝试重新连接...");
  117.       Serial.println(mqttClient.state());
  118.       clientReconnect();
  119.     }
  120.   }
  121.   mqttClient.loop();//mqtt客户端监听
  122. }

  123. void smartConfig() {
  124.   WiFi.mode(WIFI_STA);
  125.   Serial.println("\r\nWait for Smartconfig");
  126.   //调用smartconfig功能
  127.   WiFi.beginSmartConfig();
  128.   while (1) {
  129.     Serial.print(".");

  130.     //若配置完成打印获取到的ssid
  131.     if (WiFi.smartConfigDone()) {
  132.       String s = "";
  133.       String p = "";
  134.       int cd1;
  135.       int cd2;
  136.       Serial.println("SmartConfig Success");
  137.       Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
  138.       Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
  139.       s = WiFi.SSID();
  140.       p = WiFi.psk();
  141.       cd1 = s.length();
  142.       cd2 = p.length();
  143.       EEPROM.write(1, cd1);
  144.       EEPROM.write(2, cd2);
  145.       for (int i = 0; i < cd1; i++) {
  146.         EEPROM.write(10 + i, s[i]);
  147.       }
  148.       for (int i = 0; i < cd2; i++) {
  149.         EEPROM.write(30 + i, p[i]);
  150.       }
  151.       EEPROM.write(0, 200);
  152.       EEPROM.commit();
  153.       Serial.println(s);
  154.       Serial.println(p);
  155.       /*重新修改路由器账号和密码*/
  156.       //ssid2=WiFi.SSID().c_str();             //重新修改路由器账号和密码
  157.       //password2=WiFi.psk().c_str();
  158.       Serial.println("ok");
  159.       break;
  160.     }
  161.   }
  162. }

  163. /*读取errom数据*/
  164. String ssid1(int a, int b) {
  165.   String data = "";
  166.   for (int i = 0; i < a; i++) {
  167.     data += char(EEPROM.read(b + i));
  168.   }
  169.   return data;
  170. }

  171. String password1(int a, int b) {
  172.   String data = "";
  173.   for (int i = 0; i < a; i++) {
  174.     data += char(EEPROM.read(b + i));
  175.   }
  176.   return data;
  177. }

  178. /*连接WiFi函数*/
  179. void setup_wifi() {

  180.   delay(10);
  181.   // We start by connecting to a WiFi network
  182.   Serial.println();
  183.   Serial.print("Connecting to ");
  184.   Serial.println(ssid2);

  185.   WiFi.begin(ssid2, password2);

  186.   while (WiFi.status() != WL_CONNECTED) {
  187.     delay(500);
  188.     Serial.print("-)");
  189.   }

  190.   randomSeed(micros());

  191.   Serial.println("");
  192.   Serial.println("WiFi connected");
  193.   Serial.println("IP address: ");
  194.   Serial.println(WiFi.localIP());
  195. }




  196. void clientReconnect()   //重连函数, 如果客户端断线,可以通过此函数重连
  197. {
  198.   while (!mqttClient.connected()) //再重连客户端
  199.   {
  200.     Serial.println("重新连接 MQTT...");
  201.     if (connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET))
  202.     {
  203.       Serial.println("connected");
  204.     }
  205.     else
  206.     {
  207.       Serial.println("failed");
  208.       Serial.println(mqttClient.state());
  209.       Serial.println("try again in 5 sec");
  210.       delay(5000);
  211.     }
  212.   }
  213. }

  214. void callback(char *topic, byte *payload, unsigned int length)
  215. { //收到set主题的命令下发时的回调函数,(接收命令)
  216.   if (strstr(topic, ALINK_TOPIC_PROP_SET))
  217.   { //如果收到的主题里包含字符串ALINK_TOPIC_PROP_SET(也就是收到/sys/a17lGhkKwXs/esp32LightHome/thing/service/property/set主题)
  218.     Serial.println("收到下发的命令主题:");
  219.     Serial.println(topic);
  220.     Serial.println("下发的内容是:");
  221.     payload[length] = '\0'; //为payload添加一个结束附,防止Serial.println()读过了
  222.     Serial.println((char *)payload);

  223.     //接下来是收到的json字符串的解析
  224.     DynamicJsonDocument doc(200);
  225.     DeserializationError error = deserializeJson(doc, payload);
  226.     if (error)
  227.     {
  228.       Serial.println("解析json失败parse json failed");
  229.       return;
  230.     }
  231.     JsonObject setAlinkMsgObj = doc.as<JsonObject>();
  232.     serializeJsonPretty(setAlinkMsgObj, Serial);
  233.     Serial.println();


  234.     int powerstate = setAlinkMsgObj["params"]["powerstate"];
  235.     digitalWrite(LED_BUILTIN, !powerstate);
  236.     if (powerstate == 1) { //如果“powerstate”开关指令为1
  237.       colorWipe(strip.Color(  255,   255,   255), 20);
  238.       Serial.println("\n 亮灯");
  239.     } else if (powerstate == 0) {
  240.       colorWipe(strip.Color(  0,   0,   0), 20);
  241.       Serial.println("\n 灭灯");
  242.     }
复制代码


9fe086682c629f192bedbfc6779e2e5.jpg
16ce87909ffa4527c48c2c9264ed2ae.jpg
36e4767f4ea5a5be993f58335c76ca3.png
84cc605e330cb363841be07c4a5bdf0.png
058684db4638c580e62880fe2067ecd.png
da82dd2c31656f4f4d9542e16f7e859.jpg
f4e7e0f91d6ef3db27135eafbed68aa.jpg
发表于 2022-8-3 20:31 | 显示全部楼层
老老实实跑ALIOS
 楼主| 发表于 2022-8-3 22:14 来自手机 | 显示全部楼层
XlinliY.Zhang 发表于 2022-8-3 20:31
老老实实跑ALIOS

啊?AliOS可以给ESP8266刷的吗?
发表于 2022-8-3 22:22 | 显示全部楼层
zyfl 发表于 2022-8-3 22:14
啊?AliOS可以给ESP8266刷的吗?

可以      
 楼主| 发表于 2022-8-4 01:38 来自手机 | 显示全部楼层
XlinliY.Zhang 发表于 2022-8-3 22:22
可以

怎么操作的呢,有没有示例参照下?
发表于 2022-8-4 13:43 | 显示全部楼层
zyfl 发表于 2022-8-4 01:38
怎么操作的呢,有没有示例参照下?

直接看AliOS的文档
 楼主| 发表于 2022-8-6 17:36 | 显示全部楼层
@eagler8   大神有招没
发表于 2022-8-16 14:19 | 显示全部楼层
要用生活物联自带的配网添加设备功能,只能使用alios的sdk,自己用airkiss web配网这些可以吧设备类型改为gprs设备
 楼主| 发表于 2022-8-21 11:22 来自手机 | 显示全部楼层
跑龙套的保 发表于 2022-8-16 14:19
要用生活物联自带的配网添加设备功能,只能使用alios的sdk,自己用airkiss web配网这些可以吧设备类型改为g ...

好的,多谢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 00:51 , Processed in 0.177828 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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