MQTT从入门到编程
MQTT服务器安装与配置
1、安装
使用apt包管理工具安装
sudo apt install mosquitto
2、修改配置
切换到/etc/mosquitto/目录下修改配置
cd /etc/mosquitto/
sudo gedit mosquitto.conf
添加两个配置
allow_anonymous false
password_file /etc/mosquitto/pwfile.txt
紧接着,按照上面的配置添加/etc/mosquitto/pwfile.txt文件并写上用户名和密码
3、熟悉软件管理命令
sudo service mosquitto status #查看运行状态
sudo service mosquitto start #启动服务
sudo service mosquitto stop #停止服务
软件启动后,可通过端口查看命令,查看到MQTT服务器默认监听1883端口
netstat -antp|grep mosq
MQTT可视化测试
1、下载测试软件
从网站http://www.jensd.de/apps/mqttfx/1.7.1/ 下载MQTT.FX并安装
其次搜索wireshark软件,并安装
2、配置MQTT客户端
首先在服务器内打上ifconfig查看IP地址
接着进行服务器的配置
地址为MQTT服务器地址,端口为1883,用户名和密码为我们一开始配置的用户名,完成后点击ok
第三步,我们先以管理员身份打开wireshark,并监听网卡
点击connect可以看到有connect的包信息
接着,订阅topic,也能抓到包
紧接着发布消息
最后,断开连接
通过上述过程我们了解到了 MQTT发布消息的一般流程
建立连接 --》订阅topic–》发布消息–》断开连接
具体每个包的内容到底是什么 接着往下看
MQTT数据格式分析
我们上一步已经抓取了MQTT协议相关的数据,接下来可以利用wireshark来分析下包的内容分别代表什么意思。由于内容比较多,我们只以connect为例来看看。其余的格式请对照官方格式一一分析
可参考这篇文章(MQTT格式分析)
大家可以看下下面的数据报,里面就有我们设置的用户名和密码,因此MQTT协议的实现你只要按照官方要求的格式将数据填充入相应字段就能完成客户端与服务器的通信。
MQTT编程接口使用( paho.mqtt.c)
库安装
该库使用cmake的方式生成makefile,因此安装步骤具体如下
1、从github上下载源码,并切换到目录下
git clone https://github.com/eclipse/paho.mqtt.c.git
cd paho.mqtt.c
2、新建build文件夹和install文件夹用来存储编译中间文件和安装目录
mkdir build install
3、切换到build目录并进行配置
cd build
cmake ..
cmake-gui ..
修改安装路径到install目录下,完成后重新重生makefile
4、编译并安装
make -j8 && sudo make install
库安装到此结束,接下来通过代码测试下
测试代码
1、使用如下代码
注意:地址、端口、clientid、topic、payload、用户名、密码需要改成你自己的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#define ADDRESS "tcp://192.168.21.128:1883"
#define CLIENTID "63736c25805d48c48cf93fe0c8cb41ec"
#define TOPIC "linpc"
#define PAYLOAD "iot"
#define QOS 1
#define TIMEOUT 10000L
int main(int argc, char* argv[])
{
MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;
int rc;
if ((rc = MQTTClient_create(&client, ADDRESS, CLIENTID,
MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTCLIENT_SUCCESS)
{
printf("Failed to create client, return code %d\n", rc);
exit(EXIT_FAILURE);
}
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
conn_opts.username = "carl"; //将用户名写入连接选项中
conn_opts.password = "123456";
if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
{
printf("Failed to connect, return code %d\n", rc);
exit(EXIT_FAILURE);
}
pubmsg.payload = PAYLOAD;
pubmsg.payloadlen = (int)strlen(PAYLOAD);
pubmsg.qos = QOS;
pubmsg.retained = 0;
if ((rc = MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token)) != MQTTCLIENT_SUCCESS)
{
printf("Failed to publish message, return code %d\n", rc);
exit(EXIT_FAILURE);
}
printf("Waiting for up to %d seconds for publication of %s\n"
"on topic %s for client with ClientID: %s\n",
(int)(TIMEOUT/1000), PAYLOAD, TOPIC, CLIENTID);
rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
printf("Message with delivery token %d delivered\n", token);
if ((rc = MQTTClient_disconnect(client, 10000)) != MQTTCLIENT_SUCCESS)
printf("Failed to disconnect, return code %d\n", rc);
MQTTClient_destroy(&client);
return rc;
}
接下里,进行编译,参考编译命令如下
注意:命令里的路径需要改成前面paho.mqtt.c安装的路径
g++ main.cpp -fpermissive -I /home/ubuntu/Desktop/paho.mqtt.c/install/include/ -L /home/ubuntu/Desktop/paho.mqtt.c/install/lib/ -lpaho-mqtt3a -lpaho-mqtt3c
编译完成后能生成一个a.out文件
接下来添加动态库路径
sudo gedit /etc/ld.so.conf.d/opencv.conf
添加路径
完成后,切换到a.out的目录下,重新加载动态库,然后运行a.out
sudo ldconfig
./a.out
可以看到消息发布成功