AT连接mqtt的命令有两个返回值,如何接收到第二个返回值?

fengyupaoyao 2025-01-09 23:28:08

问题:以下代码中 AT+QMTOPEN=0,"iot-06z00cq6rhvrr4a.mqtt.iothub.aliyuncs.com",1883 命令发送后,会分别有OK 、 +QMTOPEN: 0,0 、+QMTSTAT: 0,1 三个返回值,第2、3个返回值我用while嵌套的方式也接收不到,请问题如何接收?

连网用NBIOT  移远的BC260YCN主芯片,mqtt服务器用阿里云。AT命令与其他环境关系不大。

先开通阿里云mqtt(目前个人免费),参考以下链接开通和测试

【MQTT】通过mqtt.fx连接阿里云(巨详细)_mqttfx怎么连接阿里云-CSDN博客

下载好ssCom串口调试工具

一、三元素连接方式
 

AT    //测试与nobit的连线通
OK
AT+QSCLK=0    //禁止休眠
OK 
AT+CIMI     // 获取物联网卡号
460087933105679
AT+CGSN     //获取SN
MPN24H30A0*****P

AT+CGATT?     //检测网络是否附着到基站
+CGATT: 1
OK
AT+CGPADDR   //获取分配的IP,说明网络已经正常
+CGPADDR: 0,"10.90.35.36"
OK

AT+QMTCFG="aliauth",0,"k27ebAIurCE","ec600m_cn","5a67b8*********67e8d7f"   // 阿里云三元素
OK
AT+QMTOPEN=0,"iot-06z00cq6rhvrr4a.mqtt.iothub.aliyuncs.com",1883    //打开mqtt网络,这句有以下三个返回值
OK     //仅代表命令发送成功

+QMTOPEN: 0,0     //代表网络打开成功

AT+QMTCONN=0,0    //连接客户端至 MQTT 服务器,  这步很关键且必须在返回+QMTSTAT: 0,1之前执行,否则报ERROR。这句有以下两个返回值
OK

+QMTCONN: 0,0,0     //代表连接客户端至 MQTT 服务器成功

AT+QMTCONN?     //检测是否成功
+QMTCONN: 0,3    //成功
OK

+QMTSTAT: 0,1     //这个不清楚

AT+QMTPUB=0,2,1,1,"/k27ebAIurCE/ec600m_cn/user/update"   //发布mqtt消息
>
123    //消息内容,输入完按ctrl+z
OK

AT+QMTSUB=0,1,"/k27ebAIurCE/ec600m_cn/user/get",0      //订阅mqtt消息
OK

登录到阿里云物联网平台查看日志,看到这三条日志代表已经成功了。

以上用AT命令可以成功连接后,要用代码实现连接到mqtt ,出现问题

问题:以下代码中 AT+QMTOPEN=0,"iot-06z00cq6rhvrr4a.mqtt.iothub.aliyuncs.com",1883 命令发送后,会分别有OK 、 +QMTOPEN: 0,0 、+QMTSTAT: 0,1 三个返回值,第2、3个返回值我用while嵌套的方式也接收不到,请问题如何接收? 以下代码如何修改?(由于篇幅,省掉了连网的代码)

#include <Arduino.h>

bool openMQTTNetwork() {
  Serial.println("AT+QMTOPEN=0,\"iot-06z00cq6rhvrr4a.mqtt.iothub.aliyuncs.com\",1883");

  String response = "";
  while (Serial.available()) {
    response += (char)Serial.read();
  }

  if (response.indexOf("OK")!= -1) {
    delay(500);

    while (Serial.available()) {
      response = "";
      while (Serial.available()) {
        response += (char)Serial.read();
      }

      if (response.indexOf("+QMTOPEN: 0,0")!= -1) {
        Serial.println("MQTT Network opened successfully.");
        return true;
      } else {
        Serial.println("Failed to open MQTT network. Closing and retrying...");
        Serial.println("AT+QMTCLOSE=0");
        delay(500);
        return false;
      }
    }
  } else {
    Serial.println("ERROR: " + response);
    return false;
  }
}

void connectMQTTServer() {
  Serial.println("AT+QMTCONN=0,0");

  String response = "";
  while (Serial.available()) {
    response += (char)Serial.read();
  }

  if (response.indexOf("OK")!= -1) {
    while (Serial.available()) {
      response = "";
      while (Serial.available()) {
        response += (char)Serial.read();
      }

      if (response.indexOf("+QMTCONN: 0,0,0")!= -1) {
        Serial.println("Connected to MQTT server successfully.");
        return;
      } else {
        Serial.println("Failed to connect to MQTT server. Disconnecting and retrying...");
        Serial.println("AT+QMTDISC=0");
        delay(500);
        connectMQTTServer();
      }
    }
  } else {
    Serial.println("ERROR: " + response);
  }
}

bool checkQMTCONN() {
  Serial.println("AT+QMTCONN?");

  String response = "";
  while (Serial.available()) {
    response += (char)Serial.read();
  }

  if (response.indexOf("OK")!= -1) {
    if (response.indexOf("+QMTCONN: 0,3")!= -1 || response.indexOf("+QMTCONN: 0,0")!= -1) {
      return true;
    } else {
      Serial.println("ERROR: " + response);
      return false;
    }
  } else {
    Serial.println("ERROR: " + response);
    return false;
  }
}

void setup() {
  Serial.begin(9600);

  while (!openMQTTNetwork()) {
    // 继续尝试打开 MQTT 网络,直到成功
  }

  connectMQTTServer();

  if (checkQMTCONN()) {
    Serial.println("MQTT connection status is as expected.");
  } else {
    Serial.println("MQTT connection status is not correct.");
  }
}

void loop() {
  // 您的主循环代码,如果有的话
}

 

...全文
成就一亿技术人!
拼手气红包 5.00元
12856 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

119,493

社区成员

发帖
与我相关
我的任务
社区描述
分享嵌入式学习经验,讨论嵌入式学习方法,欢迎朋友们多多指教! 不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开!
嵌入式硬件arm开发 个人社区 江苏省·南京市
社区管理员
  • 矜辰所致
  • Qt历险记
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

分享嵌入式学习经验,

讨论嵌入式学习方法,

欢迎朋友们多多指教!

试试用AI创作助手写篇文章吧