目录
一、MQTT介绍
二、MQTT概念
2.1 订阅(Subscribtion)
2.2 会话(Session)
2.3 主题名(Topic Name)
2.4 主题筛选器(Topic Filter)
2.5 消息订阅
三、MQTT中的角色
3.1 客户端
3.2 服务器
四、X86平台安装mosquitto
4.1 下载 mosquitto 服务器
4.2 下载 mosquitto 客户端
4.3 mosquitto 命令
4.3.1 mosquitto
4.3.2 mosquitto_pub
4.3.3 mosquitto_sub
五、软件测试
六、QT使用MQTT
6.1 MQTT初始化
6.1.1 源码下载
6.2.1 将源码添加到工程
6.3.1 添加头文件路径
6.4.1 编译
6.5.1 mqtt初始化
6.6.1mqtt信号与槽
6.7.1 MQTT发布
每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。
消息订阅者所具体接收的内容。
1. Publisher 和 Subscriber 为客户端,Broker 为服务器端,消息主题为消息类型,Broker 根据 Topic 过滤消息,并将消息向客户端推送。
1. Publisher 和 Subscriber 都属于客户端。2. 发布应用消息给其它相关的客户端。3. 订阅以请求接受相关的应用消息。4. 取消订阅以移除接受应用消息的请求。5. 从服务端断开连接
1. 服务器端即所谓的 MQTT Broker 服务器。2. 接受来自客户端的网络连接。3. 接受客户端发布的应用消息。4. 处理客户端的订阅和取消订阅请求。5. 转发应用消息给符合条件的已订阅客户端。6. MQTT 提供的公共服务器端( Broker )有:1) test.mosquitto.org2) broker.hivemq.com3) iot.eclipse.org
命令:
sudo apt-get install mosquitto
sudo apt-get install mosquitto-clients
mosquitto_pub -h 192.168.0.137 -t "house" -m "500"
mosquitto_sub -h 192.168.0.137 -t "house" -v
测试结果:
添加到network模块
出错:解决方法
出错
解决方法:
QMQTT::Client *mqttClient ;
QString clientID;
qsrand(QTime(0,0,0).msecsTo(QTime::currentTime()));
clientID = "XYD-CXX"+QString::number(qrand()); //合成 mqtt id
//mqtt 初始化
mqttClient = new QMQTT::Client(ui->lEditServerIP->text(), 1883);
mqttClient->setClientId(clientID); //ClientId 不能重复,不然会覆盖之前连接的人的
//mqttClient->setUsername("user"); //服务器账号密码,不需要则不用
//mqttClient->setPassword("password");
mqttClient->connect();
//mqtt 连接成功
connect(mqttClient,SIGNAL(connected()),this,SLOT(doProcessMqttConnected()));
//mqtt 退出成功
connect(mqttClient,SIGNAL(disconnected()),this,SLOT(doProcessMqttDisconnected()));
//mqtt 订阅成功
connect(mqttClient,SIGNAL(subscribed(QString)),this,SLOT(doProcessMqttSubscribe(QSt
ring)));
//mqtt 订阅到消息
connect(mqttClient,SIGNAL(received(QMQTT::Message)),this,SLOT(doProcessMqttReceived
(QMQTT::Message)));
if(mqttIsConnected)
{
QMQTT::Message msg;
msg.setTopic(ui->lEditPub->text()); //发布的主题
//发布的内容,QString 转 QByteArray
msg.setPayload(ui->lEditPubPayload->text().toLatin1());
mqttClient->publish(msg);
}
订阅成功的槽函数:一般不用这个
void MqttForm::doProcessMqttSubscribe(QString topic)
{
//qDebug()<< topic + "is Subscribe";
}
收到信息的槽函数:
void MqttForm::doProcessMqttReceived(QMQTT::Message msg)
{
qDebug() << "topic:" + msg.topic();
qDebug() << "payload:" + msg.payload();
}