下载Arduino

下载链接一Software | Arduino

下载连接二 :[Arduino IDE下载(2月21日更新到1.8.19)-Arduino中文社区 - Powered by
Discuz!](https://www.arduino.cn/thread-5838-1-1.html "Arduino
IDE下载(2月21日更新到1.8.19)-Arduino中文社区 - Powered by Discuz!")

安装好之后安装esp8266的包


安装ESP8266包

安装方式一:

安装方式二:[第3章 ESP8266-NodeMCU通过C/C++开发使用物联网 – 太极创客](http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/ "第3章
ESP8266-NodeMCU通过C/C++开发使用物联网 – 太极创客")

从上述的网站中下载esp8266的插件,然后点击安装即可


安装MQTT包

搜索pubsubclient,然后安装如下所示的包,版本自己选择
2026-01-25T12:39:35.png


修改源文件(!!!)

这一步挺重要的,之前按照网上的教程装好上述的包之后还是一直连接不上阿里云,总是一直返回错误。后来找到一个教程说要修改源文件,然后就好了。不过我搞忘记在哪看到的了。具体步骤是:

  • 找到包安装的位置

    • 第一个可能的位置(默认位置):在C盘文档里面有个Arduino,然后点开里面有个libraries,安装的包都在这里面
    • 第二个可能的位置:就是可能自己选了一个目录,在首选项里面可以看到,然后包就会放在那个目录的libraries下
  • 修改PubSubClient的头文件

    • 路径PubSubClient->src

      • 2026-01-25T13:05:00.png
    • 打开并修改如下

      • 2026-01-25T13:05:15.png
      • 包大小可以尽可能大一点,阿里云官方给的mqtt消息长度小于256k即可

        • 2026-01-25T13:05:36.png
    • *

连接测试

  • 测试代码
        #include <ESP8266WiFi.h>
        /* 依赖 PubSubClient 2.4.0 */
        #include <PubSubClient.h>
        
        /* 连接您的WIFI SSID和密码 */
        #define WIFI_SSID         "WIFI名称"
        #define WIFI_PASSWD       "WIFI密码"
        
        /* 线上环境域名和端口号 */
        #define MQTT_SERVER       "你的域名"
        #define MQTT_PORT         1883//端口号
        #define MQTT_USRNAME      "你的username"
        #define CLIENT_ID         "你的clientId"
        #define MQTT_PASSWD       "你的password"
        
        //发布消息用的topic
        #define PubTopic "你的topic"
        
        unsigned long lastMs = 0;
        WiFiClient espClient;
        PubSubClient  client(espClient);
        
        //收到消息后的回调函数
        void callback(char *topic, byte *payload, unsigned int length)
        {
          Serial.print("Message arrived [");
          Serial.print(topic);
          Serial.print("] ");
          payload[length] = '\0';
          Serial.println((char *)payload);
        
        }
        
        //wifi初始化
        void wifiInit()
        {
          WiFi.mode(WIFI_STA);
          WiFi.begin(WIFI_SSID, WIFI_PASSWD);
          while (WiFi.status() != WL_CONNECTED)
          {
            delay(1000);
            Serial.println("WiFi not Connect");
          }
        
          Serial.println("Connected to AP");
          Serial.println("IP address: ");
          Serial.println(WiFi.localIP());
        
          Serial.print("espClient [");
        
          client.setServer(MQTT_SERVER, MQTT_PORT);   /* 连接WiFi之后,连接MQTT服务器 */
          client.setCallback(callback);
        }
        
        //发布一个字符串的消息
        void pubMsg(char *msg)
        {
            boolean d = client.publish(PubTopic, msg);
            if(d){
              Serial.println("publish success"); 
            }else{
              Serial.println("publish fail"); 
            }
        }
        
        //发布指定长度的字符消息
        void pubMsgLen(uint8_t *msg,int len)
        {
            boolean d = client.publish(PubTopic,msg,len);
            if(d){
              Serial.println("publish success"); 
            }else{
              Serial.println("publish fail"); 
            } 
        }
        
        //连接到服务器
        void mqttCheckConnect()
        {
          while (!client.connected())
          {
            Serial.println("Connecting to MQTT Server ...");
            if (client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD))
        
            {
        
              Serial.println("MQTT Connected!");
        
            }
            else
            {
              Serial.print("MQTT Connect err:");
              Serial.println(client.state());
              delay(5000);
            }
          }
        }
        
        void setup()
        {
        /* initialize serial for debugging */
            Serial.begin(115200); //开启串口
            Serial.println("Demo Start");
            wifiInit();//连接wifi
            unsigned char i=0;
            mqttCheckConnect();//连接阿里云
            pubMsg("hello aliyun!");
        }
         
        // the loop function runs over and over again forever
        void loop()
        {
          client.loop();//保持客户端的连接
        }
  • 代码烧录好之后,在云平台就可以查看发送来的消息

    • 2026-01-25T13:06:00.png
  • 我们再从云平台发送一条消息过去测试

    • 2026-01-25T13:06:08.png
    • 在串口调试界面可以看到
    • 2026-01-25T13:06:20.png

注意

收到消息的速度与

client.loop();//保持客户端的连接

这句有很大关系 放入延时中可能会让接收消息也延迟