当前位置: 首页 > article >正文

Unity 与 Mosquitto MQTT Broker 通信教程

内容将会持续更新,有错误的地方欢迎指正,谢谢!
 

Unity 与 Mosquitto MQTT Broker 通信教程
     
TechX 坚持将创新的科技带给世界!

拥有更好的学习体验 —— 不断努力,不断进步,不断探索
TechX —— 心探索、心进取!

助力快速掌握 MQTT 学习

为初学者节省宝贵的学习时间,避免困惑!


前言:

  在这篇文章中,我们将探讨如何在 Unity 中使用 MQTT 协议与 Mosquitto Broker 进行通信。我们将涵盖 Broker 的概念,Mosquitto 的安装和启动,如何在 Unity 中安装 MQTT 客户端库,并实现 MQTT 消息的 订阅 和 发布 功能。


文章目录

  • 一、什么是 MQTT Broker?
  • 二、Mosquitto 的安装和启动
    • 1. 安装 Mosquitto
    • 2. 启动 Mosquitto
    • 3. MQTT服务测试
      • 1. MQTT 客户端测试
      • 2. 使用命令行测试
  • 三、在 Unity 中安装 MQTT 客户端库
    • 1、使用 MQTTnet 库
    • 2、Unity和Mosquitto Broker进行消息订阅和发布


一、什么是 MQTT Broker?


MQTT Broker 是一个消息中间件,它负责接收来自不同客户端(如设备、服务器、应用程序等)的消息,并将这些消息按主题传递给订阅该主题的其他客户端。MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息协议,广泛应用于物联网(IoT)场景。

在 MQTT 协议中,Broker 充当着中介的角色,确保消息的传递和客户端之间的通信。



二、Mosquitto 的安装和启动


Mosquitto 是一个开源的 MQTT Broker 实现,支持 MQTT v3.1 和 v3.1.1 协议,易于安装和配置,适用于许多物联网应用。

1. 安装 Mosquitto


在 Windows 上安装 Mosquitto,可以通过以下步骤进行:

1、访问 Mosquitto 官方网站。
2、下载适用于 Windows 系统的exe安装包(根据自己系统的位数来下载)。
3、运行安装程序并按照默认设置完成安装。

在这里插入图片描述

对于 Linux 系统,您可以通过包管理工具安装 Mosquitto,例如:

sudo apt-get update
sudo apt-get install mosquitto
sudo apt-get install mosquitto-clients

2. 启动 Mosquitto


安装完成后,可以通过命令行启动 Mosquitto 服务。

在 Windows 上,可以通过命令行启动:

mosquitto

在 Linux 上,可以使用:

sudo systemctl start mosquitto

默认情况下,Mosquitto 会监听 1883 端口(该端口是 MQTT 协议的标准端口)。

3. MQTT服务测试


1. MQTT 客户端测试


为了确保 Mosquitto Broker 启动成功,可以使用 MQTT 客户端工具(如 MQTT.fx 或 Mosquitto 客户端工具)进行测试。

下载地址:
https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho.ui.app/1.1.1/

在这里插入图片描述

注意:使用这个软件需要安装JAVA环境。

在这里插入图片描述
可以看到已经连接成功,并订阅了一个test主题的消息,同时想test主题发送一个一个消息。

2. 使用命令行测试


订阅(监听主题):

通过cmd命令,切换到mosquitto安装目录,打开第一个命令窗口,订阅主题

mosquitto_sub -h localhost -t "test/topic"

在这里插入图片描述

发布(发送消息):

打开第二个命令窗口,发布主题

mosquitto_pub -h localhost -t "test/topic" -m "Hello MQTT"

在这里插入图片描述

如果成功订阅和发布消息,表示 Mosquitto Broker 工作正常。



三、在 Unity 中安装 MQTT 客户端库


1、使用 MQTTnet 库


在 Unity 中,我们可以使用 MQTTnet 库来实现与 Mosquitto Broker 的通信。MQTTnet 是一个功能强大的 MQTT 客户端库,支持 .NET 标准,并且能够在 Unity 中使用。

安装步骤:
1、访问 MQTTnet GitHub 页面。

2、下载最新版本的 MQTTnet 库,或者直接从 NuGet 获取。

3、将下载的 MQTTnet.dll 文件放入 Unity 项目的 Assets/Plugins 文件夹中。

你也可以直接通过 NuGet 获取 MQTTnet 包,并在 Unity 中通过 NuGet For Unity 插件进行安装。

在这里插入图片描述

2、Unity和Mosquitto Broker进行消息订阅和发布


我们将编写一个简单的 Unity 脚本来实现与 Mosquitto Broker 的订阅和发布功能。以下是实现此功能的完整代码:

using System;
using MQTTnet;
using MQTTnet.Client;
using UnityEngine;
using UnityEngine.UI;
using Newtonsoft.Json;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Protocol;
using UnityEngine.XR;

public class MQTTClient : MonoBehaviour
{
    private IMqttClient mqttClient;

    // 连接信息
    private string brokerAddress = "localhost"; // 本地 Mosquitto 地址,如果使用其他 Broker,替换成对应地址
    private int brokerPort = 1883;


    //订阅
    public InputField subscribeTopic;
    public Text subscribeMessage;
    public Button subscribe;

    //发布
    public InputField publishTopic;
    public InputField publishMessage;
    public Button publish;

    private void Awake()
    {
        subscribe.onClick.AddListener(SubscribeMessage);
        publish.onClick.AddListener(PublishMessage);
    }

    void Start()
    {
        // 连接到 Broker
        ConnectToBroker();
    }

    async void ConnectToBroker()
    {
        try
        {
            // 初始化 MQTT 客户端
            var factory = new MqttFactory();
            mqttClient = factory.CreateMqttClient();

            var options = new MqttClientOptionsBuilder()
                .WithTcpServer(brokerAddress, brokerPort) // 设置 Broker 地址和端口
                .Build();

            // 连接 Broker
            try
            {
                using (var timeoutToken = new CancellationTokenSource(TimeSpan.FromSeconds(1)))
                {
                    var response = await mqttClient.ConnectAsync(options, timeoutToken.Token);
                    Debug.Log("Connected to MQTT Broker");

                    string output = JsonConvert.SerializeObject(response, new JsonSerializerSettings
                    {
                        Formatting = Formatting.Indented
                    });

                    Debug.Log(output);
                }
            }
            catch (OperationCanceledException)
            {
                Debug.Log("Timeout while connecting.");
            }
        }
        catch (Exception ex)
        {
            Debug.LogError("Error connecting to Broker: " + ex.Message);
        }
    }

    private async void SubscribeMessage()
    {
        string topic = subscribeTopic.text;
        // 订阅主题
        await mqttClient.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic(topic).Build());
        Debug.Log("Subscribed to topic: " + topic);

        // 设置消息回调
        mqttClient.ApplicationMessageReceivedAsync += (e =>
        {
            string message = System.Text.Encoding.UTF8.GetString(e.ApplicationMessage.PayloadSegment);
            //subscribeMessage.text = message;
            Debug.Log($"{e.ApplicationMessage.Topic} Message received: {message}");

            // 将接收到的字节数组转换为字符串
            // 反序列化字符串为 MyMessage 类实例
            //MyMessage receivedMessage = AnalysisMessage<MyMessage>(e.ApplicationMessage.PayloadSegment);

            return Task.CompletedTask;
        });
    }

    // 发布消息
    private async void PublishMessage()
    {
        string topic = publishTopic.text;

        string msg = publishMessage.text;

        var message = new MqttApplicationMessageBuilder()
            .WithTopic(topic)
            .WithPayload(msg)
            .Build();

        await mqttClient.PublishAsync(message);

        Debug.Log($"{topic} Message publish: {msg}");


        // 创建一个 MyMessage 实例
        //MyMessage myMessage = new MyMessage
        //{
        //    Id = 1,
        //    Name = "Test",
        //    Value = 100.5f
        //};

         将 JSON 字符串转换为字节数组
        //var byteArray = CreateMessage<MyMessage>(myMessage);

        //var message = new MqttApplicationMessageBuilder()
        //    .WithTopic(topic)
        //    .WithPayload(byteArray)
        //    .Build();

        //await mqttClient.PublishAsync(message);
    }

    public byte[] CreateMessage<T>(T myMessage)
    {
        // 序列化 MyMessage 对象为 JSON 字符串
        string jsonString = JsonConvert.SerializeObject(myMessage);

        Debug.Log($"Message published: {jsonString}");

        // 将 JSON 字符串转换为字节数组
        var byteArray = System.Text.Encoding.UTF8.GetBytes(jsonString);

        return byteArray;
    }

    public T AnalysisMessage<T>(ArraySegment<byte> bytes)
    {
        string jsonString = System.Text.Encoding.UTF8.GetString(bytes);
        Debug.Log($"Message received: {jsonString}");

        // 反序列化字符串为 MyMessage 类实例
        T receivedMessage = JsonConvert.DeserializeObject<T>(jsonString);
        return receivedMessage;
    }

    private void OnApplicationQuit()
    {
        // 在退出时断开连接
        if (mqttClient.IsConnected)
        {
            mqttClient.DisconnectAsync();
            Debug.Log("Disconnected from MQTT Broker");
        }
    }
}

[Serializable]
public class MyMessage
{
    public int Id;
    public string Name;
    public float Value;
}
  • 连接到 Broker:在 ConnectToBroker() 方法中,我们创建了一个 mqttClient,然后连接到 Mosquitto Broker。

  • 订阅消息:在 SubscribeMessage() 方法中,我们使用 mqttClient.SubscribeAsync() 来订阅指定的主题。接收到的消息会通过回调函数处理。

  • 发布消息:在 PublishMessage() 方法中,我们使用 mqttClient.PublishAsync() 来发布消息到指定的主题。

在这里插入图片描述



小结

在这篇博客中,我们通过一个完整的案例演示了如何在 Unity 中使用 MQTTnet 客户端库与 Mosquitto Broker 进行通信。首先,我们了解了 Broker 的概念,安装并启动了 Mosquitto,然后在 Unity 中使用 MQTT 协议实现了消息的 订阅 和 发布。

通过这种方式,你可以将 Unity 应用与物联网设备或其他系统进行实时通信,适用于各类需要消息传递和远程控制的应用。





TechX —— 心探索、心进取!

每一次跌倒都是一次成长

每一次努力都是一次进步


END
感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!

http://www.kler.cn/a/553528.html

相关文章:

  • TypeScript 中的 type 和 interface:你真的了解它们的不同吗?
  • React之旅-02 创建项目
  • 使用Druid连接池优化Spring Boot应用中的数据库连接
  • vite调试node_modules下面插件
  • 同花顺C++面试题及参考答案
  • 校招后台开发:JAVA和GO选哪一个?
  • Spring Security实现记住我功能的实战指南
  • 罗格科技发布全球首款税务智能合规终端“罗拉DeepTax双引擎AI一体机”
  • IP关联:定义、影响及避免策略‌
  • HTTPS(上)
  • 【Golang 面试题】每日 3 题(五十七)
  • “深入浅出”系列之杂谈篇:(3)Qt5和Qt6该学哪个?
  • 常用 Webpack Plugin 汇总
  • LangChain大模型应用开发:消息管理与聊天历史存储
  • 单细胞转录组画小提琴VlnPlot只显示需要类型细胞
  • 【Linux】文件系统:文件fd
  • Android系统开发 给system/app传包报错
  • 清华大学DeepSeek PPT第二版 Deepseek赋能职场应用
  • 1、云原生写在前面
  • 部署前端项目