记录Qt编写MQTT客户端,注册OneNet使用MQTT协议与Nb模块通信

13 篇文章 0 订阅

AT指令文档,qt工程等下载点这里

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指令等没有进行详细描述所有资料自行参考文档

  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值