当前位置:   article > 正文

MQTT使用与C接口测试_mqtt c

mqtt c

MQTT从入门到编程

MQTT服务器安装与配置

1、安装

使用apt包管理工具安装

sudo apt install mosquitto 
  • 1

2、修改配置

切换到/etc/mosquitto/目录下修改配置

cd /etc/mosquitto/
sudo gedit mosquitto.conf
  • 1
  • 2

添加两个配置

allow_anonymous false
password_file /etc/mosquitto/pwfile.txt
  • 1
  • 2

在这里插入图片描述

紧接着,按照上面的配置添加/etc/mosquitto/pwfile.txt文件并写上用户名和密码
在这里插入图片描述

3、熟悉软件管理命令

sudo service mosquitto status                           #查看运行状态
sudo service mosquitto start                                #启动服务
sudo service mosquitto stop                                 #停止服务
  • 1
  • 2
  • 3

软件启动后,可通过端口查看命令,查看到MQTT服务器默认监听1883端口

netstat -antp|grep mosq
  • 1

在这里插入图片描述

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

  • 1
  • 2
  • 3

2、新建build文件夹和install文件夹用来存储编译中间文件和安装目录

mkdir build install
  • 1

在这里插入图片描述
3、切换到build目录并进行配置

cd build
cmake ..
cmake-gui ..
  • 1
  • 2
  • 3

修改安装路径到install目录下,完成后重新重生makefile
在这里插入图片描述
4、编译并安装

make -j8 && sudo make install
  • 1

在这里插入图片描述
库安装到此结束,接下来通过代码测试下

测试代码

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

接下里,进行编译,参考编译命令如下
注意:命令里的路径需要改成前面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   
  • 1

编译完成后能生成一个a.out文件
接下来添加动态库路径

sudo gedit /etc/ld.so.conf.d/opencv.conf
  • 1

添加路径
在这里插入图片描述
完成后,切换到a.out的目录下,重新加载动态库,然后运行a.out

sudo ldconfig
./a.out
  • 1
  • 2

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/176330
推荐阅读
相关标签
  

闽ICP备14008679号