OneNet部分
该部分主要是在移动端拿到三个重要信息,产品号,设备号,鉴权信息。
OneNet部分作用可理解为信息转发部分。
OneNet官网
注册部分直接参考官网文档
MQTT界面,选择多协议接入
自行参考官方文档创建产品,添加设备
创建产品后就能得到产品号,第一个重要信息
添加设备会设置鉴权信息,完成后可以得到另外两个重要信息,设备号,鉴权信息
点击设备详情即可看到设备ID,鉴权信息
另外可先自行下载官方测试的工具下载
Qt移植Mqtt部分
先在Github上下载源码地址
我下载的是5.12.12的
解压
直接打开工程编译mqtt(注意:使用release编译)
会提示perl命令无效
下载安装perl:地址
再次编译
注意:上面这步如果报QtMqtt/xxx.h找不到,在Qt安装目录创建文件夹Qt5.12.2\5.12.2\mingw73_64\include\QtMqtt,自行将源文件src/mqtt下所有.h头文件添加到我们创建的QtMqtt文件夹。
打开Release所对应文件夹
自行编译mqtt客户端测试
新建工程mqttClient,在该工程中创建一个lib文件夹,将上一步Release文件夹的lib文件夹中以下四个文件拷贝到自己的客户端工程进行测试,这四个文件是以上步骤编译得到每台电脑可能不一样
mqttClient工程中pro中添加network模块
另外在mqttClient新建一个include文件夹将qtmqtt-5.12.12\src\mqtt下所有.h头文件拷贝到该目录中,此时整个工程文件都有了
测试代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtWidgets/QMessageBox>
#include <QDateTime>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_client = new QMqttClient(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_buttonConnect_clicked()
{
if(m_client->state() == QMqttClient::Disconnected)
{
m_client->setHostname("183.230.40.39");//服务器IP
m_client->setPort(6002);//端口
m_client->setClientId("xxxxx");//对应Onenet设备ID
m_client->setUsername("xxxx");//对应Onenet产品ID
m_client->setPassword(QByteArray(QString("xxxxx").toStdString().c_str()));//对应Onenet鉴权信息
m_client->setProtocolVersion(QMqttClient::MQTT_3_1_1);
// connect(m_client, &QMqttClient::connected, [this](void){ui->buttonConnect->setText("断开连接");});
connect(m_client, &QMqttClient::connected, this,&MainWindow::connect_success_slot);
connect(m_client, &QMqttClient::errorChanged,this,&MainWindow::connect_error_slot);
connect(m_client, &QMqttClient::messageReceived, this, &MainWindow::connect_Received_slot);
connect(m_client, &QMqttClient::disconnected, this,&MainWindow::connect_disconnect_slot);
m_client->cleanSession();
m_client->connectToHost();
}
else
{
m_client->disconnected();
}
}
void MainWindow::connect_success_slot()
{
ui->buttonConnect->setText("断开连接");
QString str = "sub01";
m_client->subscribe(str);//订阅sub01
}
void MainWindow::connect_error_slot(QMqttClient::ClientError error)
{
qDebug()<<error;
}
void MainWindow::connect_disconnect_slot()
{
m_client->disconnectFromHost();
ui->buttonConnect->setText("连接");
}
void MainWindow::connect_Received_slot(QByteArray m_message, QMqttTopicName m_topic)
{
QString str = m_message;
ui->editLog->append(m_message);
}
void MainWindow::on_buttonPublish_clicked()
{
QByteArray test = ui->lineEditMessage->text().toUtf8();
QString str = "pry01";//发布者
m_client->publish(str,test,0,false);
}
连接成功
此时已经订阅了sub01的消息,测试是否接收消息可通过OneNet下载的工具登录另一个产品使用sub01发布消息即可。以下通过Nb模块M5310-A进行测试。
M5310-A与客户端进行通信
用串口调试助手进行通信
1、设置信息
AT+MQTTCFG=“183.230.40.39”,6002,“Onenet设备ID”,10,“Onenet产品ID”,“Onenet鉴权信息”,1
返回:OK
2、打开连接
AT+MQTTOPEN=1,1,0,0,0,“”,“”
返回: OK
+MQTTOPEN:OK
3、订阅消息(注意这里刚好对应qt客户端的发布者)
AT+MQTTSUB=pry01,0
返回:+MQTTOPEN:OK
打开连接后就可以看到该设备也已经在线状态,此时可以进行通信了
4、发送消息
AT+MQTTPUB=sub01,1,0,0,0,“4555555”
返回:OK
此时客户端已经可以收到消息了,客户端也发送消息
另外消息发送前通过以下命令查询返回信息为+CEREG:0,1和+MQTTSTAT:5就可发送成功
//驻网信息查询
AT+CEREG?
返回:+CEREG:0,1
//MQTT连接状态查询
AT+MQTTSTAT?
返回:+MQTTSTAT:5
如果不成功则使用AT+MQTTDISC和AT+MQTTDEL将mqtt连接断开和删除,重新执行1、2、3、4就可发送成功。
文章写得比较匆忙,AT指令等没有进行详细描述所有资料自行参考文档