正点原子IMX6ULL+QT实现MQTT通信连接EMQ X服务器
最近在学习嵌入式Linux,想通过MQTT将数据传输到云端
本文内容:
1.在Windows11中搭建本地EMQ X服务器
2.在IMX6ULL中通过QT编译MQTT的client
3.实现IMX6ULL与EMQ X服务器的通信
一、在windows环境中搭建EMQ X服务器
①在官网中下载EMQ X的源码
5.3.2以后的Windows版本不再更新,请参考以下网址
[https://www.emqx.com/zh/downloads/broker]
②下载至本地,解压
③管理员身份打开Windows shell终端
④进入到解压文件下的in目录下
运行.emqx install .emqx console .emqx start
⑤浏览器输入127.0.0.1:18083进入服务器
登入成功后,搭建结束。
二、在Ubuntu环境下通过QT 5.12.9实现MQTT的客户端
①创建QT工程
使用正点原子的虚拟机镜像,Ubuntu16.04。
configure时勾选ATK-I.MX6U(交叉编译器已经自带mqtt模块,无需编译qtmqtt源码)
②在.pro文件加入mqtt
③在mainwindow.h中加入
声明对象指针 QMqttClient *client;
④在Mainwindow的构造函数中加入
client = new QMqttClient;
client->setHostname("192.168.233.6");//保证imx6ull与windows连一个局域网,这里的是windows的ip
client->setPort(1883);
client->setClientId("imx6ull");
⑤使用client->connectToHost();进行客户端连接
⑥使用 client->publish(topic,ba);进行发布
⑦使用 client->subcribe(topic);进行订阅
⑧使用connect()连接信号与槽;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
client = new QMqttClient;
client->setHostname("192.168.233.6");
client->setPort(1883);
client->setClientId("imx6ull");
connect(client, &QMqttClient::connected,this,&MainWindow::connectSuccessSlots);//连接成功源
}
此槽函数为连接成功后触发
void MainWindow::connectSuccessSlots()
{
qDebug() << "Connect successful!";
connect(client, &QMqttClient::messageReceived, this, &MainWindow::recvMessageSlot);
}
收到消息后触发
void MainWindow::recvMessageSlot(const QByteArray &ba, const QMqttTopicName &topic)
{
QString str = topic.name() + QString(ba);
ui->textEdit->setText(str);
}
⑨交叉编译后进行移植
三、实现imx6ull与EMQ X及MQTTX之间的通信
原理为:EMQ X作为broker,imx6ull与MQTTX作为client 进行订阅和发布
订阅相同的topic,例如 /dht
向相同的topic中发布消息,例如/dht {mag:“hello”}