首页 > 系统相关 >使用MQTT.fx和自定义Client(Ubuntu上实现)测试MQTT服务器(EMQX )

使用MQTT.fx和自定义Client(Ubuntu上实现)测试MQTT服务器(EMQX )

时间:2024-03-16 10:31:23浏览次数:40  
标签:MQTTClient 自定义 订阅 fx MQTT 服务器 EMQX

目录

概述

1 配置EMQX做MQTT服务器

1.1 登录EMQX

1.2 配置EMQX

1.2.1 配置客户端认证

1.2.2 创建用户

2 测试MQTT服务器

2.1 配置MQTT.fx工具

2.2 连接MQTT服务器

3 使用MQTT.fx发布和订阅信息

3.1 在MQTT.fx上发布信息

3. 2 在MQTT.fx上订阅信息

4 Ubuntu上实现MQTT Client

4.1 Ubuntu上编写MQTT Client

4.2 编译和测试

5 MQTT.fx订阅MQTT_USR2 Topic

5.1 MQTT.fx订阅Topic

5.2 EMQX上查看数据流


概述

本文详细介绍如何EMQX配置一个MQTT服务器,并使用MQTT.fx工具,分别实现了MQTT message的订阅和发送功能。还在Ubuntu上实现了一个Client,它可以发布信息,MQTT.fx工具用来订阅该信息,用以测试MQTT服务器的数据发布和订阅功能。

1 配置EMQX做MQTT服务器

1.1 登录EMQX

在Ubuntu上安装好了EMQX之后,然后在第三方电脑上登录该服务器,并做相应的配置。第一步要做的事情是登录该服务器,怎么登录系统?在浏览器上输入网址,会看到如下页面:

这时候需要输入用户名和密码:

类型内容注释
usernameadmin用户名
passwordpublic密码

输入用户名和密码后,点击登录按钮,会进入如下页面,说明已经成功登录到服务器。后面需要做一些相应的配置,使其成为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

相关文章

  • 什么是C#的扩展方法,要怎么自定义使用
    介绍:C#中的扩展方法是一种特殊的静态方法,允许你向现有的类添加新的方法,而无需修改类的原始定义。它们使得可以在不修改原始类的情况下,给类添加新的行为。这种功能在编写库或者框架时非常有用,因为它允许你向已有的类添加新的功能,同时不会破坏现有的代码。原理:扩展方法......
  • Qt Charts 自定义样式
    QtCharts是Qt框架中用于创建图表和图形可视化的模块,它提供了一些内置的图表类型,如折线图、柱状图、饼图等。如果你想要自定义QtCharts中图表的样式,你可以使用一些方法来实现。以下是一些自定义QtCharts样式的方法:1、使用QChart的样式属性: QtCharts中的QChart类具有许多属性......
  • SOLIDWORKS参数化工具自定义设置小技巧 慧德敏学
    利用SOLIDWORKS参数化工具-SolidKits.AutoWorks,我们可以实现产品的一键改型、打包、编码、出BOM。整个流程大家都已经非常熟悉了,但是参数化工具的设置你可能还没有留心,加入你想自定义产品选型的分类名称,那在设置中就可以轻松实现。软件中,产品分类的默认名称为产品大类、产品小类......
  • vue 3+TS 封装自定义右键全局菜单(虚拟节点)
    有时我们需要点击(右键或左键)某个元素时弹出菜单,实现复制、粘贴、删除等功能。本文将介绍如何封装一个自定义的右键全局菜单(无三方依赖)。封装的菜单可自定义菜单项,图标,禁用,分割线,隐藏等。并且可以在全局任意地方使用。源码在文章末尾。效果使用<template><div>......
  • 塑造自己的神器——vim的自定义配置
    本文结构:1、简介2、配置文件所在位置3、语法解释及简单的配置示例4、常用配置选项1.简介:Vim编辑器的配置文件是vimrc,它允许用户自定义Vim的行为,包括快捷键、颜色方案、插件加载等。Vim在启动时会自动加载vimrc文件,从而应用用户定义的设置。2.vimrc的位置:vimrc......
  • element ui 自定义的快捷选项的日期选择器并格式化
    效果图时间日期选择器(el-date-picker)设置为段时间:type="datetimerange"规范格式:format="yyyy-MM-dd"value-format="yyyy-MM-dd"1.给日期选择器el-date-picker标签添加picker-options属性,传入变量pickerOptions<el-date-picker//日期选择器v-model="timeCyc......
  • QT6.6下android编译及调用自定义so库方法
    一.问题概述   最近需要把QT程序从5.12的桌面环境移植到QT6.6的android下,项目中有很多DLL库要重新编译为so文件,移植到android环境然后调用,中间有很多坑,虽然大体和桌面系统用法相同,但细节上还是有区别的,尤其是so库的调用方法上,过程中也是debug了两天才解决,如果你也遇到了同......
  • QT 自定义QGraphicsItem 缩放后旋转 图形出现漂移问题
    实现自定义QGraphicsItem缩放和旋转时,遇到了这样一个问题:将item旋转一个角度,然后拖拽放大,再次进行旋转时图像会发生漂移。原本以为是放大后中心点位置没有改变,导致旋转时以原中心的旋转出现了偏移,但是重新设置旋转中心setTransformOriginPoint(rect.center());并没有起作用,图像......
  • 【SpringBoot】自定义工具类实现Excel数据新建表存入MySQL数据库
    ......
  • 有手就会Python自定义模块使用
    1.自定义模块自定义模块一般是在项目中根据自己的需求进行的封装项目中自定义了额一个模块,module.pyname="张三"age=23weight=160height=187deftest():print("测试的方法")defdemo():print("天使的眼泪")deffn():print("老鼠爱大米")2.......