MQTT|Windows + mosquitto|同一网段下的两台电脑联调

前言

MQTT有三个角色,代理(broker)、发布者(publisher)、订阅者(subscriber)
举例说明:代理(视频网站)、发布者(视频创作者)、订阅者(其他用户)
发布者(客户端A)发布视频---->代理(服务器)---->订阅者(客户端B)关注发布者即可看到视频

1. 环境准备

同一网段下的两台电脑,这里我用的家里在同一Wifi下的两台笔记本。
通过CMD的ipconfig分别查看两台笔记本的ip地址,以下用A电脑做发布者,A电脑搭建代理,B电脑做订阅者。文章中将简称A和B。
A的ip:192.168.5.4 B电脑的ip:192.168.5.2

2. mosquitto

2.1 安装(A和B均安装)

下载mosquitto软件:https://mosquitto.org/download/。默认安装即可
这里我在A、B笔记本均安装。
在这里插入图片描述
这里我安装在了E盘,默认C盘也可以
安装完成后,进入安装目录下,可以看到相关安装目录文件如下:
在这里插入图片描述会用到的文件说明:
mosquitto.exe:可执行文件。用于启动服务端。
mosquitto_pub.exe:可执行文件。用于启动发布者客户端。
mosquitto_sub.exe:可执行文件。用于启动订阅者客户端。
mosquitto.conf:配置文件。
pwfile.example:用户配置文件。用于存放用户的账号和密码。
至此安装完成。

2.2 修改mosquitto.conf配置文件

用记事本打开mosquitto.conf

2.2.1 listener(只在A上配置)

因为此次实验把A作为了代理(服务器),也就是说,A发布的消息将暂时放在A自己搭建的服务器上,因此,listenser只更新了A。

在这里插入图片描述

2.2.2 allow_anonymous(只在A电脑上配置)

allow_anonymous false:不允许匿名登录
allow_anonymous true:允许匿名登录
此处为了简单,直接配置成了allow_anonymous true
如果是远程的两台电脑,最好还是配置为false,设置相关密码更加安全。
在这里插入图片描述

2.2.3 password_file(只在A电脑上配置)

在这里插入图片描述

这里是设置账号和密码的文件位置,生成后默认在mosquitto根目录下。

管理员模式打开Window PowerShell
在这里插入图片描述

./mosquitto_passwd -c pwfile.example admin

这里配置了A的账号为admin,密码将会让你输入两次,一次设置,二次确认。
因为在2.2.2章节设置了allow_anonymous true,因此这里设置账号密码并不会影响。但是考虑到远程的设备传消息时的安全性,这里放置配置账号密码的内容。
在这里插入图片描述

2.2.4 启动MQTT Broker(A电脑)

在这里插入图片描述
切换到mosquitto的根目录,此处我的在D盘下Software\mosquitto
输入代码:

.\mosquitto -c .\mosquitto.conf -v

请添加图片描述
运行后,可以看到详细的信息:
通过配置文件启动了2.0.15版本的mosquitto,socket与1883的端口绑定。(1883是mosquitt的默认端口)

至此mosquitto部分结束。

3 防火墙开启

因为要让B顺利的从A那里订阅到信息,需要A把特定的端口给B打开。

3.1 开启防火墙

我这里是Window11,打开防火墙和网络保护,选择高级设置
在这里插入图片描述
在这里插入图片描述
选择入站规则,右边点击新建规则

进入新建入站规则向导,这里选择自定义。下一步。
在这里插入图片描述
程序选择所有程序,下一步。
在这里插入图片描述
协议和端口,下一步。
在这里插入图片描述
作用域这里,添加B的IP地址。下一步。
在这里插入图片描述
操作这里,继续下一步。
在这里插入图片描述
配置文件将三个都勾选上

在这里插入图片描述
最后给起个名称即可。

在这里插入图片描述
至此,开通防火墙结束。

3.2 Ping通A和B

检查以下A和B之间的通信。通信正常。
如果ping的时候出现问题,可以通过管理员身份CMD,输入以下命令,开启回显。

netsh firewall set icmpsetting 8

在这里插入图片描述
这里Ping的时候,还可以尝试下telnet,进入变黑即成功。
在这里插入图片描述
在这里插入图片描述
提示:Telnet服务可以通过控制面板—程序—启动或关闭Window功能–勾选Telnet客户端开启。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
至此,防火墙和通信部分结束。

4 测试

4.1 开启Broker服务(A电脑)

这里重新开启一下A电脑的MQTT Broker,详细可以见2.2.4章节。
这里我主要考虑因为开通防火墙在开启之后,所以,重新开启一下也好吧。

4.2 订阅(B电脑)

切换mosquitto的根目录,输入代码。
因为上文已经允许了匿名登录,所以这里的账号密码可以不用再输入。
可以看出,订阅后,处于等待状态。其中topic是A和B约定的主题,可以换成任何你们约定的一个主题,比如Test等。

mosquitto_sub -t topic -p 端口号 -h 服务器所在的IP地址 -u 订阅端用户名 -P 订阅端密码

在这里插入图片描述
订阅后,在A电脑的MQTT开启的CMD将接收到B的请求。

4.3 发布(A电脑)

切换mosquitto的根目录,输入代码。

mosquitto_pub -t topic -p 端口号 -h mosquitto服务器所在的IP地址 -u 发布端用户名 -P 发布   端密码 -m 发布端要发布的消息

在这里插入图片描述

这里发送了Hello。主机为5.4,也就是A,这里A既做了代理,又做了发布者。
回车后,B端收到消息。
在这里插入图片描述
至此,MQTT|Windows + mosquitto|同一网段下的两台电脑联调结束。

因为本身对计算机知识不是很清楚,关于防火墙的设置应该查询更详细的资料进行专门的设置,因为防火墙是保护计算机的重要防线了。
其次,本文没有开启MQTT的账号密码验证,因此,后期可以尝试。

通过CMD的简单调通,就可以利用不同编程语言设计更复杂的传输啦。

搞定立刻搞一局DOTA2。

附上本文一些参考链接:
1.MQTT | Windows + mosquitto搭建MQTT Broker(本地服务器)与MQTTX客户端联调
2.用windows命令行在本地局域网搭建mosquitto服务器体验
3.ping不通的解决
4.初步使用MQTT
5.开通防火墙的步骤

  • 23
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows C 语言程序中使用 MQTT 协议向 Mosquitto 服务器发送 JSON 数据,可以使用 Paho MQTT C 客户端库。下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <MQTTClient.h> #include <cJSON.h> #define ADDRESS "tcp://10.10.10.97:1883" #define CLIENTID "ExampleClientPub" #define TOPIC "test" #define QOS 1 #define TIMEOUT 10000L int main(int argc, char* argv[]) { MQTTClient client; MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; cJSON *root = NULL; char *payload = NULL; int rc; MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL); conn_opts.keepAliveInterval = 20; conn_opts.cleansession = 1; if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) { printf("Failed to connect, return code %d\n", rc); exit(EXIT_FAILURE); } root = cJSON_CreateObject(); cJSON_AddStringToObject(root, "name", "John"); cJSON_AddStringToObject(root, "surname", "Doe"); cJSON_AddNumberToObject(root, "age", 30); payload = cJSON_Print(root); MQTTClient_message pubmsg = MQTTClient_message_initializer; pubmsg.payload = payload; pubmsg.payloadlen = strlen(payload); pubmsg.qos = QOS; pubmsg.retained = 0; MQTTClient_deliveryToken token; MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token); 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); cJSON_Delete(root); free(payload); MQTTClient_disconnect(client, 10000); MQTTClient_destroy(&client); return rc; } ``` 这个示例代码中,首先定义了一些常量,包括 MQTT 代理服务器的地址 `ADDRESS`、客户端 ID `CLIENTID`、MQTT 主题 `TOPIC`、消息 QoS 级别 `QOS`、和超时时间 `TIMEOUT`。 然后,在 `main` 函数中,创建了一个 MQTT 客户端实例 `client`。使用 `MQTTClient_connect` 函数连接 MQTT 代理服务器连接成功后,使用 cJSON 库创建了一个 JSON 对象 `root`,并向其中添加了三个属性:`name`、`surname` 和 `age`。使用 `cJSON_Print` 函数将 JSON 对象转换成字符串格式,保存在变量 `payload` 中。 接着,定义了一个 MQTT 消息结构体 `pubmsg`,并设置了消息内容为 `payload`、消息长度为字符串长度、QoS 级别为 1,保留标志为 0。使用 `MQTTClient_publishMessage` 函数将消息发布到指定的 MQTT 主题上,并获取了发布令牌 `token`。 等待消息发布完成,使用 `MQTTClient_waitForCompletion` 函数等待消息传递完成,超时时间为 `TIMEOUT`。如果消息成功发送,则打印消息传递令牌 `token`。 最后,释放 JSON 对象内存、释放字符串内存、断开 MQTT 连接并销毁 MQTT 客户端实例,然后返回程序执行结果。 请注意,这个示例代码中的 MQTT 连接是不加密的,如果需要加密,请使用 SSL/TLS 协议连接 Mosquitto 服务器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值