You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:10:21