MQTT使用与C接口测试

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

可以看到消息发布成功
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值