Arduino Uno R4 Wifi无法连接MQTT Broker问题求助
Arduino Uno R4 WiFi 无法连接Arduino IoT Cloud MQTT服务器问题排查与解决
问题概述
我正在制作一个由Alexa控制的按钮按压装置,使用伺服电机驱动按钮,硬件采用Arduino Uno R4 WiFi。设备已成功连接WiFi,但无法连接Arduino IoT Cloud的MQTT服务器,同时已添加到Alexa账户的设备无任何响应。
错误信息
ArduinoIoTCloudTCP::handle_ConnectMqttBroker could not connect to mqtts-up.iot.arduino.cc:8884
ArduinoIoTCloudTCP::handle_ConnectMqttBroker 1 connection attempt at tick time 27850
代码
#include "thingProperties.h" #include "WiFiS3.h" #include "Servo.h" #include "Arduino_WiFiConnectionHandler.h" char ssid[] = "ASK4 Wireless"; int status = WL_IDLE_STATUS; WiFiServer server(80); Servo myservo; void setup() { //Initialize serial and wait for port to open: Serial.begin(9600); delay(1500); myservo.attach(7); //initProperties(); ArduinoCloud.begin(ArduinoIoTPreferredConnection); setDebugMessageLevel(2); ArduinoCloud.printDebugInfo(); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // check for the WiFi module: if (WiFi.status() == WL_NO_MODULE) { Serial.println("Communication with WiFi module failed!"); // don't continue while (true) ; } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("Please upgrade the firmware"); } // attempt to connect to WiFi network: while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(ssid); // wait 10 seconds for connection: delay(10000); } server.begin(); // you're connected now, so print out the status: printWifiStatus(); while (ArduinoCloud.connected() == false) { ArduinoCloud.update(); delay(500); } } void printWifiStatus() { // print your board's IP address: IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); // print the received signal strength: long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); } void loop() { // put your main code here, to run repeatedly: //Serial.print("Test"); ArduinoCloud.update(); delay(2500); } void onFanChange() { // Add your code here to act upon ExtractorFan change myservo.write(0); delay(1000); myservo.write(120); }
补充信息
- 所在建筑使用ASK4网络,已将设备MAC地址添加到账户,串口监视器确认WiFi连接成功
- 设备已添加到Alexa账户,但无任何响应
排查与解决建议
1. 恢复initProperties()调用
代码中注释掉了initProperties();,这是Arduino IoT Cloud加载设备认证信息、属性配置的核心函数,必须在ArduinoCloud.begin()之前调用。取消注释该行,确保设备能正确获取MQTT连接所需的密钥与配置。
2. 调整WiFi与Cloud初始化顺序
当前代码先启动IoT Cloud再连接WiFi,会导致Cloud初始化时无可用网络。修改setup流程:
- 先完成WiFi模块检测、固件检查、WiFi连接
- 再初始化IoT Cloud相关内容
修改后的setup示例:
void setup() { Serial.begin(9600); delay(1500); myservo.attach(7); while (!Serial) { ; } // 先检查WiFi模块状态 if (WiFi.status() == WL_NO_MODULE) { Serial.println("Communication with WiFi module failed!"); while (true); } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("Please upgrade the firmware"); } // 优先完成WiFi连接 while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); status = WiFi.begin(ssid); delay(10000); } server.begin(); printWifiStatus(); // 再初始化IoT Cloud initProperties(); ArduinoCloud.begin(ArduinoIoTPreferredConnection); setDebugMessageLevel(2); ArduinoCloud.printDebugInfo(); // 等待Cloud连接建立 while (!ArduinoCloud.connected()) { ArduinoCloud.update(); delay(500); } }
3. 验证ASK4网络的端口限制
ASK4作为商业/公寓网络,可能限制了8884端口(MQTTS协议端口)的出站连接:
- 在同一网络的电脑上执行
telnet mqtts-up.iot.arduino.cc 8884,若无法连接,联系ASK4客服开放该端口 - 临时切换到手机热点测试,排除网络限制问题
4. 检查IoT Cloud设备配置
- 确认
thingProperties.h文件是由Arduino IoT Cloud平台自动生成的,未被手动修改(该文件包含设备ID、密钥等关键信息) - 登录Arduino IoT Cloud平台,确认设备状态为在线,且已启用Alexa集成功能
5. 优化Cloud更新频率
loop函数中delay(2500)会导致IoT Cloud消息处理延迟过长,建议改用非阻塞延时:
void loop() { ArduinoCloud.update(); static unsigned long lastUpdate = 0; if (millis() - lastUpdate >= 2500) { lastUpdate = millis(); // 可在此添加定时执行的代码 } }
6. 完成WiFi固件升级
代码中已提示固件需要升级,建议通过Arduino IDE完成Uno R4 WiFi的WiFi模块固件升级,避免因固件兼容性导致的网络连接问题。
内容的提问来源于stack exchange,提问作者Ben Naylor
相关产品推荐
相关产品推荐

