目录
概述
本文详细介绍如何EMQX配置一个MQTT服务器,并使用MQTT.fx工具,分别实现了MQTT message的订阅和发送功能。还在Ubuntu上实现了一个Client,它可以发布信息,MQTT.fx工具用来订阅该信息,用以测试MQTT服务器的数据发布和订阅功能。
1 配置EMQX做MQTT服务器
1.1 登录EMQX
在Ubuntu上安装好了EMQX之后,然后在第三方电脑上登录该服务器,并做相应的配置。第一步要做的事情是登录该服务器,怎么登录系统?在浏览器上输入网址,会看到如下页面:
这时候需要输入用户名和密码:
类型 | 内容 | 注释 |
---|---|---|
username | admin | 用户名 |
password | public | 密码 |
输入用户名和密码后,点击登录按钮,会进入如下页面,说明已经成功登录到服务器。后面需要做一些相应的配置,使其成为MQTT服务器。
1.2 配置EMQX
1.2.1 配置客户端认证
这里主要配置访问MQTT服务器的方式,数据库信息等类型,配置步骤如下:
step -1:选择Password-Based方式,其目的: 使用客户端用户名、Client ID 与密码进行认证
step-2: 选择内置数据库,这样不用再安装第三方数据了
step - 3: 配置参数,选择默认配置即可
点击创建按钮后,跳到如下页面,数据库创建成功:
1.2.2 创建用户
在如下选项卡中选择配置用户
添加用户信息
笔者使用如上方法创建连个用户:
2 测试MQTT服务器
2.1 配置MQTT.fx工具
笔者已经在EMQX中配置了两个user,现在使用MQTT.fx来连接该服务器,以验证其是否可以正常的功能。在连接EMQX之前,需要在MQTT.fx中创建一个终端。
step - 1: 配置EMQX的IP地址
step-2: 输入用户认证
以上两步完成后,可以尝试连接MQTT服务器
2.2 连接MQTT服务器
点击connect后,看见如下图标颜色,说明MQTT.fx连接服务器成功
在服务器端可以看见如下信息。这时可以在MQTT.fx上发布和订阅信息:
3 使用MQTT.fx发布和订阅信息
3.1 在MQTT.fx上发布信息
定义一个topic : switch
{
"DI1": true,
"DI2": false,
"DI3": false,
"DI4": true,
"DI5": true,
"DI6": false
}
3. 2 在MQTT.fx上订阅信息
选择subscribe选项卡,输入订阅的topic,然后在publish选项卡中发布信息,subscribe中可以看见如下信息,说明订阅数据成功:
4 Ubuntu上实现MQTT Client
下面实现一个功能: 在Ubuntu上实现MQTT Client, 然后发布信息至服务器。MQTT.fx订阅该信息,并查看Ubuntu上MQTT Client发布的信息与MQTT.fx接收到的信息是否一致
4.1 Ubuntu上编写MQTT Client
本Client选择连接的用户信息如下:
代码实现如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "MQTTClient.h"
#define ADDRESS "tcp://192.168.1.11"
#define CLIENTID "MQTT_USR2"
#define TOPIC "mytest"
#define PAYLOAD "123456"
#define USERNAME "mqtt_user2"
#define PASSWORD "123456"
#define QOS 0
#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 = USERNAME; //用户名
conn_opts.password = PASSWORD; //密码
if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
{
printf("Failed to connect, return code %d\n", rc);
exit(EXIT_FAILURE);
}
while(1){
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);
sleep(5);
}
MQTTClient_destroy(&client);
return rc;
}
4.2 编译和测试
在ubuntu上编译代码,使用命令:
gcc MQTTClient_publish.c -lpaho-mqtt3c
编译成功后,生成.out 文件
运行该文件,可以看见,该客户端已经能正常的发送数据:
在EMQX上可以看见,MQTT_USR2已经在线
5 MQTT.fx订阅MQTT_USR2 Topic
5.1 MQTT.fx订阅Topic
现在实现一个功能MQTT.fx订阅MQTT_USR2 Topic,根据MQTT_USR2的代码可知,其发布数据的topic 为:
在MQTT.fx上订阅该Topic: mytest
5.2 EMQX上查看数据流
登录EMQX,在客户端栏上选择当前用户,可以看见当前Client数据流的详细情况
标签:MQTTClient,自定义,订阅,fx,MQTT,服务器,EMQX From: https://blog.csdn.net/mftang/article/details/136601795