找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2744|回复: 5
收起左侧

arduino IDE开发ESP8266 MQTT代码

  [复制链接]
ID:706228 发表于 2021-11-9 16:52 | 显示全部楼层 |阅读模式
arduino IDE开发ESP8266开发版终于可以手机远程控制LED点亮了
  1. #include <ESP8266WiFi.h>
  2. #include <PubSubClient.h>

  3. // 设置wifi接入信息(请根据您的WiFi信息进行修改)
  4. const char* ssid = "可用WiFi";
  5. const char* password = "密码";
  6. const char* mqttServer = "";
  7. // 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案
  8. WiFiClient wifiClient;
  9. PubSubClient mqttClient(wifiClient);

  10. // ****************************************************
  11. // 注意!以下需要用户根据然也物联平台信息进行修改!否则无法工作!
  12. // ****************************************************
  13. const char* mqttUserName = "自己的";         // 服务端连接用户名(需要修改)
  14. const char* mqttPassword = "自己的";          // 服务端连接密码(需要修改)
  15. const char* clientId = "自己的";          // 客户端id (需要修改)
  16. const char* subTopic = "自己/led_kz";        // 订阅主题(需要修改)
  17. const char* pubTopic = "自己/led_zt";        // 订阅主题(需要修改)
  18. const char* willTopic = "自己/led_yz";       // 遗嘱主题名称(需要修改)
  19. // ****************************************************

  20. //遗嘱相关信息
  21. const char* willMsg = "esp8266 offline";        // 遗嘱主题信息
  22. const int willQos = 0;                          // 遗嘱QoS
  23. const int willRetain = false;                   // 遗嘱保留

  24. const int subQoS = 1;            // 客户端订阅主题时使用的QoS级别(截止2020-10-07,仅支持QoS = 1,不支持QoS = 2)
  25. const bool cleanSession = false; // 清除会话(如QoS>0必须要设为false)

  26. bool ledStatus = HIGH;
  27. //int pushButton =D3;
  28. void setup() {
  29.   pinMode(LED_BUILTIN, OUTPUT);  // 设置板上LED引脚为输出模式
  30.   //pinMode(pushButton, INPUT);
  31.   digitalWrite(LED_BUILTIN, ledStatus);  // 启动后关闭板上LED
  32.   Serial.begin(9600);                    // 启动串口通讯
  33.   
  34.   //设置ESP8266工作模式为无线终端模式
  35.   WiFi.mode(WIFI_STA);
  36.   
  37.   // 连接WiFi
  38.   connectWifi();
  39.   
  40.   // 设置MQTT服务器和端口号
  41.   mqttClient.setServer(mqttServer, 1883);
  42.   mqttClient.setCallback(receiveCallback);

  43.   // 连接MQTT服务器
  44.   connectMQTTserver();
  45. }

  46. void loop() {
  47.   // 如果开发板未能成功连接服务器,则尝试连接服务器
  48.   if (!mqttClient.connected()) {
  49.     connectMQTTserver();
  50.   }

  51.    // 处理信息以及心跳
  52.    mqttClient.loop();
  53.   /* pushButton = digitalRead(LED_BUILTIN); //读取引脚2电平状态并将其赋值给布尔变量
  54.   
  55.   if (!pushButton){          //对布尔变量进行逻辑非运算,并根据运算结构点亮或者熄灭LED
  56.     digitalWrite(LED_BUILTIN, HIGH); //布尔变量数值为假(false)时点亮LED
  57.   } else {
  58.     digitalWrite(LED_BUILTIN, LOW);  //布尔变量数值为真(true)时熄灭LED
  59.   }*/
  60.    
  61. }

  62. // 连接MQTT服务器并订阅信息
  63. void connectMQTTserver(){
  64.   // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
  65.   

  66.   /* 连接MQTT服务器
  67.   boolean connect(const char* id, const char* user,
  68.                   const char* pass, const char* willTopic,
  69.                   uint8_t willQos, boolean willRetain,
  70.                   const char* willMessage, boolean cleanSession);
  71.   若让设备在离线时仍然能够让qos1工作,则connect时的cleanSession需要设置为false               
  72.                   */
  73.   if (mqttClient.connect(clientId, mqttUserName,
  74.                          mqttPassword, willTopic,
  75.                          willQos, willRetain, willMsg, cleanSession)) {
  76.     Serial.print("MQTT Server Connected. ClientId: ");
  77.     Serial.println(clientId);
  78.     Serial.print("MQTT Server: ");
  79.     Serial.println(mqttServer);   
  80.    
  81.     subscribeTopic(); // 订阅指定主题
  82.   } else {
  83.     Serial.print("MQTT Server Connect Failed. Client State:");
  84.     Serial.println(mqttClient.state());
  85.     delay(5000);
  86.   }   
  87. }

  88. // 收到信息后的回调函数
  89. void receiveCallback(char* topic, byte* payload, unsigned int length) {
  90.   Serial.print("Message Received [");
  91.   Serial.print(topic);
  92.   Serial.print("] ");
  93.   for (int i = 0; i < length; i++) {
  94.     Serial.print((char)payload[i]);
  95.   }
  96.   Serial.println("");
  97.   Serial.print("Message Length(Bytes) ");
  98.   Serial.println(length);

  99.   if ((char)payload[0] == '1') {     // 如果收到的信息以“1”为开始
  100.     ledStatus = LOW;
  101.     digitalWrite(BUILTIN_LED, ledStatus);  // 则点亮LED。
  102.   } else {
  103.     ledStatus = HIGH;                           
  104.     digitalWrite(BUILTIN_LED, ledStatus); // 否则熄灭LED。
  105.   }

  106.   pubMQTTmsg();
  107. }

  108. // 订阅指定主题
  109. void subscribeTopic(){

  110.   
  111.   // 通过串口监视器输出是否成功订阅主题以及订阅的主题名称
  112.   // 请注意subscribe函数第二个参数数字为QoS级别。这里为QoS = 1
  113.   if(mqttClient.subscribe(subTopic, subQoS)){
  114.     Serial.print("Subscribed Topic: ");
  115.     Serial.println(subTopic);
  116.   } else {
  117.     Serial.print("Subscribe Fail...");
  118.   }  
  119. }

  120. // 发布信息
  121. void pubMQTTmsg(){
  122.   char* pubMessage;
  123.   
  124.   if (ledStatus == LOW){
  125.     pubMessage = "LED ON";
  126.   } else {
  127.     pubMessage = "LED OFF";
  128.   }

  129.   // 实现ESP8266向主题发布信息
  130.   if(mqttClient.publish(pubTopic, pubMessage)){
  131.     Serial.println("Publish Topic:");Serial.println(pubTopic);
  132.     Serial.println("Publish message:");Serial.println(pubMessage);   
  133.   } else {
  134.     Serial.println("Message Publish Failed.");
  135.   }
  136. }

  137. // ESP8266连接wifi
  138. void connectWifi(){

  139.   WiFi.begin(ssid, password);

  140.   //等待WiFi连接,成功连接后输出成功信息
  141.   while (WiFi.status() != WL_CONNECTED) {
  142.     delay(1000);
  143.     Serial.print(".");
  144.   }
  145.   Serial.println("");
  146.   Serial.println("WiFi Connected!");  
  147.   Serial.println("");
  148. }
复制代码

评分

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

查看全部评分

回复

使用道具 举报

ID:752974 发表于 2021-12-16 17:30 | 显示全部楼层
手机APP如何实现?
回复

使用道具 举报

ID:752974 发表于 2021-12-31 15:39 | 显示全部楼层
问题解决了,谢谢楼主分享的代码。
回复

使用道具 举报

ID:272158 发表于 2022-2-15 14:26 | 显示全部楼层
那个版本的arduino IDE好用些?????
回复

使用道具 举报

ID:95059 发表于 2022-5-10 17:42 | 显示全部楼层
小兄弟谈谈你的感想!
回复

使用道具 举报

ID:858009 发表于 2022-8-3 16:13 | 显示全部楼层
想问一下怎么获取json长数据?,你这个如果获取1000字节的JSON数据是否也可以?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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