当前位置:   article > 正文

ESP8266连接onenet(旧版MQTT方式)_onenet旧版账号

onenet旧版账号

一、为什么使用旧版MQTT

1、简单

   使用ESP8266 + Arduino开发的方式,只需要极简的代码,就可以实现上云。

   MQTT在ESP8266上拥有现成的库,我们只需要在平台创建设备,在程序里面输入参数即可。

2、双向

  对比于HTTP的单向连接,MQTT是双向的,不需要设备去请求服务器下发数据,大大简化了程序流程。

二、如何实现MQTT接入

1、注册设备

直接上图

第一步当然是登陆账号(没有的直接注册+实名认证即可,免费哒)

然后进入控制台

然后开始添加产品设备

使用的是旧版控制台

先添加产品才能添加设备

添加完产品,然后点击刚刚添加的产品进入产品管理,再然后开始添加设备

设备ID为CLIENTID 鉴权信息为USERPASSWORD 产品ID为USERNAME

到这一步,设备已经添加完成了,数据流什么的可以不用理,设备上传数据后系统会自动添加数据节点。

2、烧录ESP8266代码

关于Arduino IDE如何烧录ESP8266,网上有许多的教程,这一步不再赘叙,直接上代码

  1. const char *Device_ID = "*******"; //设备ID
  2. const char *Product_ID = "*******"; //产品ID
  3. const char *Api_KEY = "*******"; //鉴权信息
  4. const char *WiFi_SSID = "*******"; //WiFi名称
  5. const char *WiFi_Password = "***********"; //WiFi密码
  6. #include <ESP8266WiFi.h>
  7. #include <PubSubClient.h>
  8. float Current = 0;
  9. uint8_t Upload_Package[100];
  10. uint32_t Last_Updata_Time = 0;
  11. WiFiClient espClient;
  12. PubSubClient client(espClient);
  13. void WiFi_Init(void);
  14. void MQTT_Init(void);
  15. void MQTT_Reconnection(void);
  16. void MQTT_Callback(char *MQTT_Topic, uint8_t *MQTT_Payload, uint16_t MQTT_Payload_Len);
  17. void setup()
  18. {
  19. Serial.begin(115200);
  20. WiFi_Init();
  21. MQTT_Init();
  22. }
  23. void loop()
  24. {
  25. if (!client.connected())
  26. MQTT_Reconnection();
  27. if (millis() - Last_Updata_Time >= 3000)
  28. {
  29. Last_Updata_Time = millis();
  30. float ADC_Value = analogRead(A0);
  31. Current = (ADC_Value - 512) * 0.033783784;
  32. Serial.print("Current: ");
  33. Serial.print(Current);
  34. Serial.println(" A\r\n");
  35. memset(Upload_Package, 0, 100);
  36. String Json_Buffer = ",;Current,";
  37. Json_Buffer += String(Current);
  38. Json_Buffer += ";";
  39. Upload_Package[0] = 5;
  40. Upload_Package[1] = highByte(Json_Buffer.length());
  41. Upload_Package[2] = lowByte(Json_Buffer.length());
  42. for (int i = 0; i < Json_Buffer.length(); i++)
  43. Upload_Package[i + 3] = Json_Buffer.c_str()[i];
  44. client.publish("$dp", Upload_Package, Json_Buffer.length() + 3);
  45. }
  46. client.loop();
  47. }
  48. void WiFi_Init(void)
  49. {
  50. Serial.print("\r\n\r\nConnecting to ");
  51. Serial.print(WiFi_SSID);
  52. WiFi.mode(WIFI_STA);
  53. WiFi.begin(WiFi_SSID, WiFi_Password);
  54. while (WiFi.status() != WL_CONNECTED)
  55. {
  56. delay(500);
  57. Serial.print(".");
  58. }
  59. Serial.print("\r\nWiFi Connected.\r\nIP address: ");
  60. Serial.println(WiFi.localIP());
  61. }
  62. void MQTT_Init(void)
  63. {
  64. client.setServer("183.230.40.39", 6002);
  65. client.setCallback(MQTT_Callback);
  66. }
  67. void MQTT_Callback(char *MQTT_Topic, uint8_t *MQTT_Payload, uint16_t MQTT_Payload_Len)
  68. {
  69. Serial.printf("Topic: %s[%d]:\r\n", MQTT_Topic, MQTT_Payload_Len);
  70. for (uint16_t i = 0; i < MQTT_Payload_Len; i++)
  71. {
  72. Serial.print(MQTT_Payload[i] < 0x10 ? " 0x0" : " 0x");
  73. Serial.print(MQTT_Payload[i]);
  74. }
  75. Serial.println();
  76. }
  77. void MQTT_Reconnection(void)
  78. {
  79. while (!client.connected())
  80. {
  81. Serial.println("MQTT Reconnection.");
  82. if (client.connect(Device_ID, Product_ID, Api_KEY))
  83. Serial.println("MQTT Connected");
  84. else
  85. {
  86. Serial.print("Connect Failed, Error Code = ");
  87. Serial.print(client.state());
  88. Serial.println(", Try again in 5 seconds.");
  89. delay(5000);
  90. }
  91. }
  92. }

本示例将A0口读取的模拟值上传到onenet,并在接收到onenet下发信息时在串口打印

三、程序讲解

  1、联网相关

  1. //首先要有WiFi参数
  2. const char *WiFi_SSID = "*******"; //WiFi名称
  3. const char *WiFi_Password = "***********"; //WiFi密码
  4. //其次要有WiFi驱动库
  5. #include <ESP8266WiFi.h>
  6. //声明下函数
  7. void WiFi_Init(void);
  8. void setup()//setup只执行一次,联网放这里面就行
  9. {
  10. //串口要初始化下,方便查看过程
  11. Serial.begin(115200);
  12. //开始WiFi初始化
  13. WiFi_Init();
  14. }
  15. void loop()
  16. {
  17. }
  18. void WiFi_Init(void)
  19. {
  20. //打印下提示语
  21. Serial.print("\r\n\r\nConnecting to ");
  22. Serial.print(WiFi_SSID);
  23. //STA模式,传入wifi参数
  24. WiFi.mode(WIFI_STA);
  25. WiFi.begin(WiFi_SSID, WiFi_Password);
  26. //循环到WiFi连接
  27. while (WiFi.status() != WL_CONNECTED)
  28. {
  29. //定时打印............告诉你老子没死机
  30. delay(500);
  31. Serial.print(".");
  32. }
  33. //打印提示语和本机IP地址
  34. Serial.print("\r\nWiFi Connected.\r\nIP address: ");
  35. Serial.println(WiFi.localIP());
  36. }

 2、上云相关

  1. //首先要有参数
  2. const char *Device_ID = "711583270"; //设备ID
  3. const char *Product_ID = "421451"; //产品ID
  4. const char *Api_KEY = "20210425"; //鉴权信息
  5. //提供socket协议(MQTT基于TCP)
  6. #include <ESP8266WiFi.h>
  7. //提供MQTT协议
  8. #include <PubSubClient.h>
  9. //创建对象
  10. WiFiClient espClient;
  11. PubSubClient client(espClient);
  12. //声明下函数
  13. void MQTT_Init(void);
  14. void MQTT_Reconnection(void);
  15. void setup()
  16. {
  17. Serial.begin(115200);
  18. MQTT_Init();//初始化MQTT
  19. }
  20. void loop()//loop相当于其他单片机的while(1)
  21. {
  22. //判断MQTT连接了没,没的话重新连接
  23. if (!client.connected())
  24. MQTT_Reconnection();
  25. //MQTT运行
  26. client.loop();
  27. }
  28. void MQTT_Init(void)
  29. {
  30. client.setServer("183.230.40.39", 6002);//设置服务器IP地址和端口
  31. client.setCallback(MQTT_Callback); //设置接收到信息的回调函数
  32. }
  33. //MQTT重连函数
  34. void MQTT_Reconnection(void)
  35. {
  36. while (!client.connected())//循环到MQTT已连接
  37. {
  38. Serial.println("MQTT Reconnection.");
  39. if (client.connect(Device_ID, Product_ID, Api_KEY))//调用MQTT连接,传入对应的参数,返回1则连接成功
  40. Serial.println("MQTT Connected");
  41. else//否则就打印错误消息
  42. {
  43. Serial.print("Connect Failed, Error Code = ");
  44. Serial.print(client.state());
  45. Serial.println(", Try again in 5 seconds.");
  46. delay(5000);
  47. }
  48. }
  49. }

3、收发数据相关

  1. //在初始化MQTT时候,我们已经设置了回调函数
  2. client.setCallback(MQTT_Callback);
  3. //所以,当收到信息时,会调用这个函数,传入参数含义如下
  4. //MQTT_Topic 收到的消息的主题
  5. //MQTT_Payload 收到的消息的内容
  6. //MQTT_Payload_Len 收到的消息的内容的长度
  7. void MQTT_Callback(char *MQTT_Topic, uint8_t *MQTT_Payload, uint16_t MQTT_Payload_Len)
  8. {
  9. //此处只进行了打印,没有其余处理操作
  10. Serial.printf("Topic: %s[%d]:\r\n", MQTT_Topic, MQTT_Payload_Len);
  11. for (uint16_t i = 0; i < MQTT_Payload_Len; i++)
  12. {
  13. Serial.print(MQTT_Payload[i] < 0x10 ? " 0x0" : " 0x");
  14. Serial.print(MQTT_Payload[i]);
  15. }
  16. Serial.println();
  17. }
  18. //若要上传数据,则使用发布函数发布
  19. //$dp ONENT上传数据固定主题
  20. //Upload_Package 上传的数据数组
  21. //Json_Buffer.length() + 3 上传的数据长度,因为包含0,使用不能使用strlen计算长度
  22. client.publish("$dp", Upload_Package, Json_Buffer.length() + 3);

4、上传协议

Upload_Package[0]为上传格式,详见ONENET文档,此处用的是5

数据示例:,;数据名称,数据值;

Upload_Package[1] * 256 + Upload_Package[2] 为 3~数据结束的长度

四、总结

1、几个需要注意的点

ONENET的上传数据格式有点特殊,前3字节为固定格式,其后才是真正数据

ONENET的端口号是6002不是传统的1883

格式5即使是字符也不需要双引号(不同于JSON)

2、缺点

ONENET下发数据和更新数据时间不一样,导致有时候下发了数据,控件还没刷新

故障描述如下:

按下按钮,他变ON,过一会又变OFF,直到设备上传ON的数据才会变成ON

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/471794
推荐阅读
相关标签
  

闽ICP备14008679号