找回密码
 立即注册

QQ登录

只需一步,快速开始

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

阿里云MQTT数据云流转,实现多个终端控制某一个设备

[复制链接]
跳转到指定楼层
楼主
ID:1051816 发表于 2022-11-14 00:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、在阿里云注册登录,并在控制台建好项目
二、在arduinoIDE上传代码至arduino系列单片机或者ESP8266或ESP32
三、可以在本地按键操作硬件,也可以在阿里云端进行设备模拟查看最终效果。
附上代码,仅供参考
  1. #include <ESP8266WiFi.h>
  2. #include <PubSubClient.h>//这个没有回调函数
  3. #include <ArduinoJson.h>
  4. #include "DHT.h"
  5. WiFiClient espClient;
  6. PubSubClient  client(espClient);
  7. PubSubClient mqttClient(espClient);
  8. #define sensor_Pin   0
  9. #define DHTPIN 2
  10. #define DHTTYPE DHT11
  11. DHT dht(DHTPIN, DHTTYPE);
  12. float h;
  13. float t;
  14. long s;
  15. // 连接WIFI和密码
  16. #define WIFI_SSID         "-------------"
  17. #define WIFI_PASSWD       "-----------"


  18. //设备的三元组信息
  19. #define PRODUCT_KEY "-----------"
  20. #define DEVICE_NAME "---------"
  21. #define DEVICE_SECRET "-----------"

  22. #define REGION_ID         "cn-shanghai"

  23. //不需要改
  24. #define MQTT_SERVER       PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs diancom"
  25. #define MQTT_PORT         1883

  26. /////
  27. #define MQTT_USRNAME      DEVICE_NAME "&" PRODUCT_KEY
  28. #define CLIENT_ID     "h8v70q9rDqp.center|securemode=2,signmethod=hmacsha256,timestamp=1652631576537|"//这里使用技小新可以生成,注意密码和密钥一定要对否则连不上MQTT    "FESA234FBDS24|securemode=3,timestamp=789,signmethod=hmacsha1|"
  29. #define MQTT_PASSWD       "180866dbe114bb5cedd3a3dc1f27dccdadeaf0dbc51bd3873a26c88bef98cf08"



  30. #define ALINK_TOPIC_PROP_SET "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set"
  31. #define ALINK_BODY_FORMAT         "{\"id\":\"ESP8266\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":%s}"
  32. #define ALINK_TOPIC_PROP_POST     "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"


  33. ////a1JKlnw6EP0/postion1/user/update
  34. unsigned long lastMs = 0;



  35. float soil_data = 0;


  36. //连接wifi
  37. void wifiInit()
  38. {
  39.   WiFi.mode(WIFI_STA);
  40.   WiFi.begin(WIFI_SSID, WIFI_PASSWD);
  41.   while (WiFi.status() != WL_CONNECTED)
  42.   {
  43.     delay(1000);
  44.     Serial.println("WiFi not Connect");
  45.   }
  46.   client.setServer(MQTT_SERVER, MQTT_PORT);   //连接MQTT服务器
  47. }

  48. //mqtt连接
  49. void mqttCheckConnect()
  50. {
  51.   while (!client.connected())
  52.   {
  53.     client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD);
  54.   }

  55.   Serial.println("MQTT connect succeed!");
  56.   // client.subscribe(ALINK_TOPIC_PROP_POSTRSP);
  57.   mqttClient.subscribe(ALINK_TOPIC_PROP_SET);
  58.   Serial.println("subscribe done");
  59. }

  60. void mqttIntervalPost()
  61. {
  62.   soil_data = analogRead(sensor_Pin);   //模拟数据读取(A0脚输入的数据)385-1024
  63.   soil_data -= 385;         //0-639
  64.   soil_data /= 6.39;        //0.00-100.00,变为百分比
  65.   soil_data = 100 - soil_data;         //修改为百分比越大湿度越大
  66.   char param[32];
  67.   char jsonBuf[128];
  68.   read_data();


  69.   //这里\"**"\要选择对应的标识符,否则数据上报不了。
  70.   sprintf(param, "{\"wendu\":%f}", t);
  71.   sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
  72.   Serial.println(jsonBuf);
  73.   boolean e = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);

  74.   sprintf(param, "{\"CurrentHumidity\":%f}", h);
  75.   sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
  76.   Serial.println(jsonBuf);
  77.   boolean f = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);


  78.   ///以下///上报给另一个设备///////////
  79.   

  80. }

  81. void callback(char *topic, byte *payload, unsigned int length)//mqtt回调函数
  82. {
  83.   Serial.print("Message arrived [");
  84.   Serial.print(topic);
  85.   Serial.print("] ");
  86.   payload[length] = '\0';
  87.   Serial.println((char *)payload);

  88.   if (strstr(topic, ALINK_TOPIC_PROP_SET))
  89.   {
  90.     StaticJsonBuffer<100> jsonBuffer;


  91.     JsonObject &root = jsonBuffer.parseObject(payload);
  92.     if (!root.success())
  93.     {
  94.       Serial.println("parseObject() failed");
  95.       return;
  96.     }
  97.   }
  98. }



  99. void setup()
  100. {
  101.   Serial.begin(115200);
  102.   wifiInit();
  103.   dht.begin();
  104. }

  105. void read_data()
  106. {
  107.   float read_h = dht.readHumidity();//湿度
  108.   float read_t = dht.readTemperature();//温度
  109.   h = read_h;
  110.   t = read_t;
  111.   Serial.print("湿度:");
  112.   Serial.print(h);
  113.   Serial.println("%");
  114.   Serial.print("温度:");
  115.   Serial.println(t);
  116. }

  117. void loop()
  118. {
  119.   s = millis();
  120.   delay(500);
  121.   read_data();
  122.   Serial.println(millis() - s);
  123.   if (millis() - lastMs >= 5000)
  124.   {
  125.     lastMs = millis();
  126.     mqttCheckConnect();
  127.     mqttIntervalPost();
  128.   }
  129.   client.loop();
  130.   delay(2000);
  131. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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