119,493
社区成员




问题:以下代码中 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() {
// 您的主循环代码,如果有的话
}