找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3734|回復(fù): 5
收起左側(cè)

arduino IDE開(kāi)發(fā)ESP8266 MQTT代碼

  [復(fù)制鏈接]
ID:706228 發(fā)表于 2021-11-9 16:52 | 顯示全部樓層 |閱讀模式
arduino IDE開(kāi)發(fā)ESP8266開(kāi)發(fā)版終于可以手機(jī)遠(yuǎn)程控制LED點(diǎn)亮了
  1. #include <ESP8266WiFi.h>
  2. #include <PubSubClient.h>

  3. // 設(shè)置wifi接入信息(請(qǐng)根據(jù)您的WiFi信息進(jìn)行修改)
  4. const char* ssid = "可用WiFi";
  5. const char* password = "密碼";
  6. const char* mqttServer = "";
  7. // 如以上MQTT服務(wù)器無(wú)法正常連接,請(qǐng)前往以下頁(yè)面尋找解決方案
  8. WiFiClient wifiClient;
  9. PubSubClient mqttClient(wifiClient);

  10. // ****************************************************
  11. // 注意!以下需要用戶根據(jù)然也物聯(lián)平臺(tái)信息進(jìn)行修改!否則無(wú)法工作!
  12. // ****************************************************
  13. const char* mqttUserName = "自己的";         // 服務(wù)端連接用戶名(需要修改)
  14. const char* mqttPassword = "自己的";          // 服務(wù)端連接密碼(需要修改)
  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. //遺囑相關(guān)信息
  21. const char* willMsg = "esp8266 offline";        // 遺囑主題信息
  22. const int willQos = 0;                          // 遺囑QoS
  23. const int willRetain = false;                   // 遺囑保留

  24. const int subQoS = 1;            // 客戶端訂閱主題時(shí)使用的QoS級(jí)別(截止2020-10-07,僅支持QoS = 1,不支持QoS = 2)
  25. const bool cleanSession = false; // 清除會(huì)話(如QoS>0必須要設(shè)為false)

  26. bool ledStatus = HIGH;
  27. //int pushButton =D3;
  28. void setup() {
  29.   pinMode(LED_BUILTIN, OUTPUT);  // 設(shè)置板上LED引腳為輸出模式
  30.   //pinMode(pushButton, INPUT);
  31.   digitalWrite(LED_BUILTIN, ledStatus);  // 啟動(dòng)后關(guān)閉板上LED
  32.   Serial.begin(9600);                    // 啟動(dòng)串口通訊
  33.   
  34.   //設(shè)置ESP8266工作模式為無(wú)線終端模式
  35.   WiFi.mode(WIFI_STA);
  36.   
  37.   // 連接WiFi
  38.   connectWifi();
  39.   
  40.   // 設(shè)置MQTT服務(wù)器和端口號(hào)
  41.   mqttClient.setServer(mqttServer, 1883);
  42.   mqttClient.setCallback(receiveCallback);

  43.   // 連接MQTT服務(wù)器
  44.   connectMQTTserver();
  45. }

  46. void loop() {
  47.   // 如果開(kāi)發(fā)板未能成功連接服務(wù)器,則嘗試連接服務(wù)器
  48.   if (!mqttClient.connected()) {
  49.     connectMQTTserver();
  50.   }

  51.    // 處理信息以及心跳
  52.    mqttClient.loop();
  53.   /* pushButton = digitalRead(LED_BUILTIN); //讀取引腳2電平狀態(tài)并將其賦值給布爾變量
  54.   
  55.   if (!pushButton){          //對(duì)布爾變量進(jìn)行邏輯非運(yùn)算,并根據(jù)運(yùn)算結(jié)構(gòu)點(diǎn)亮或者熄滅LED
  56.     digitalWrite(LED_BUILTIN, HIGH); //布爾變量數(shù)值為假(false)時(shí)點(diǎn)亮LED
  57.   } else {
  58.     digitalWrite(LED_BUILTIN, LOW);  //布爾變量數(shù)值為真(true)時(shí)熄滅LED
  59.   }*/
  60.    
  61. }

  62. // 連接MQTT服務(wù)器并訂閱信息
  63. void connectMQTTserver(){
  64.   // 根據(jù)ESP8266的MAC地址生成客戶端ID(避免與其它ESP8266的客戶端ID重名)
  65.   

  66.   /* 連接MQTT服務(wù)器
  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.   若讓設(shè)備在離線時(shí)仍然能夠讓qos1工作,則connect時(shí)的cleanSession需要設(shè)置為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. // 收到信息后的回調(diào)函數(shù)
  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”為開(kāi)始
  100.     ledStatus = LOW;
  101.     digitalWrite(BUILTIN_LED, ledStatus);  // 則點(diǎn)亮LED。
  102.   } else {
  103.     ledStatus = HIGH;                           
  104.     digitalWrite(BUILTIN_LED, ledStatus); // 否則熄滅LED。
  105.   }

  106.   pubMQTTmsg();
  107. }

  108. // 訂閱指定主題
  109. void subscribeTopic(){

  110.   
  111.   // 通過(guò)串口監(jiān)視器輸出是否成功訂閱主題以及訂閱的主題名稱
  112.   // 請(qǐng)注意subscribe函數(shù)第二個(gè)參數(shù)數(shù)字為QoS級(jí)別。這里為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. // 發(fā)布信息
  121. void pubMQTTmsg(){
  122.   char* pubMessage;
  123.   
  124.   if (ledStatus == LOW){
  125.     pubMessage = "LED ON";
  126.   } else {
  127.     pubMessage = "LED OFF";
  128.   }

  129.   // 實(shí)現(xiàn)ESP8266向主題發(fā)布信息
  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. }
復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:752974 發(fā)表于 2021-12-16 17:30 | 顯示全部樓層
手機(jī)APP如何實(shí)現(xiàn)?
回復(fù)

使用道具 舉報(bào)

ID:752974 發(fā)表于 2021-12-31 15:39 | 顯示全部樓層
問(wèn)題解決了,謝謝樓主分享的代碼。
回復(fù)

使用道具 舉報(bào)

ID:272158 發(fā)表于 2022-2-15 14:26 | 顯示全部樓層
那個(gè)版本的arduino IDE好用些?????
回復(fù)

使用道具 舉報(bào)

ID:95059 發(fā)表于 2022-5-10 17:42 | 顯示全部樓層
小兄弟談?wù)勀愕母邢耄?/td>
回復(fù)

使用道具 舉報(bào)

ID:858009 發(fā)表于 2022-8-3 16:13 | 顯示全部樓層
想問(wèn)一下怎么獲取json長(zhǎng)數(shù)據(jù)?,你這個(gè)如果獲取1000字節(jié)的JSON數(shù)據(jù)是否也可以?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表