Unity MQTT

news/2024/11/7 7:46:24/

Unity MQTT

最近接到一个物联网相关的项目,那边要求使用MQTT来进行通讯,第一次接触这个东西,所以写篇文档简单介绍下。

简介

MQTT(消息队列遥测传输) 是一种轻量级的消息传输协议,它可以用于连接 IoT 设备和应用程序。MQTT 由 IBM 在 1999 年首次开发,现在已成为一个开放的 OASIS 标准。MQTT 的设计目标是提供一个简单、可靠、低功耗、易于实现的消息传输协议,适用于各种网络环境和设备。

工作原理

MQTT 协议使用发布-订阅模式,其中消息发布者将消息发布到特定主题(Topic),而订阅者则通过订阅相应的主题来接收消息。MQTT 服务器(Broker)负责接收所有的消息,并将它们路由到对应的订阅者。MQTT 支持多个订阅者和发布者,因此可以构建复杂的消息传输网络。如果写过unity事件系统,就会发现是比较类似的。

主流的 MQTT 是基于 TCP 连接进行数据推送的,但是同样也有基于 UDP 的版本,叫做 MQTT-SN。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了。

协议

  1. 客户端(Client):MQTT 客户端可以是任何设备或应用程序,包括传感器、嵌入式系统、智能手机或桌面应用程序。客户端通过连接到 MQTT 服务器(Broker)来发送或接收消息。

  2. 主题(Topic):MQTT 消息可以被发布到一个或多个主题上。主题是消息的标识符,订阅者可以通过订阅主题来接收对应的消息。

  3. QoS(Quality of Service):MQTT 支持三种不同的 QoS 等级:

    • QoS 0:最多一次传输。消息发布者只发送一次消息,不保证消息是否被接收。
    • QoS 1:至少一次传输。消息发布者发送一条消息,确保至少被接收一次。
    • QoS 2:恰好一次传输。消息发布者发送一条消息,并确保只被接收一次。
  4. 保留消息(Retained Message):保留消息是一种特殊类型的消息,它会被保存在 MQTT 服务器上,并在新的订阅者连接到主题时自动发送。这对于提供实时数据更新非常有用。

  5. 保留消息(Retained Message):保留消息是一种特殊类型的消息,它会被保存在 MQTT 服务器上,并在新的订阅者连接到主题时自动发送。这对于提供实时数据更新非常有用。

特性

  1. 轻量级:MQTT 协议非常轻量,可以在资源受限的设备上运行。

  2. 可靠性:MQTT 支持 QoS 等级,可以确保消息的可靠传输。

  3. 灵活性:MQTT 支持多种主题过滤方式,可以根据需要定制订阅规则。

  4. 易于实现:MQTT 协议的实现非常简单,可以在各种编程语言和操作系统上使用。

  5. 开放标准:MQTT 是一个开放标准,有许多开源实现和工具可供使用。

unity中的使用

MQTT版本

目前 MQTT 主流版本有两个,分别是 MQTT3.1.1 和 MQTT5。MQTT3.1.1 是在 2014 年 10 月发布的,而 MQTT5 是在 2019 年 3 月发布的。虽然 MQTT3.1.1 与 MQTT5 在时间相差了将近五年,但是 MQTT3.1.1作为一个经典的版本,目前仍然是主流版本,能够满足大部分实际需求。

MQTT5 是在 MQTT3.1.1 的基础上进行了升级,因此 MQTT5 是完全兼容 MQTT3.1.1 的。而 MQTT5 是 在 MQTT3.1.1 的基础上添加了更多的功能、补充完善 MQTT 协议。

在这里我们使用MQTT5。

MQTT X

MQTT X 是一款开源的 MQTT 5.0 桌面测试客户端,它支持在 macOS,Linux,Windows 操作系统上运行。

工具下载地址:MQTT X: Cross-platform MQTT 5.0 Desktop Client

MQTTnet.dll

要在unity中使用,有一些现成的插件可以使用,这里我们选择了MQTTnet.dll。

github工程:GitHub - dotnet/MQTTnet

也可以在vs中通过NuGet来直接MQTTnet.dll。

获取到dll文件后,导入到unity工程中的Plugins文件夹下就可以。

客户端

客户端主要需要实现的功能就是连接服务器,断线重连,消息订阅,消息监听等。

这是我自己写的一个例子DEMO,希望能帮助到大家。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MQTTnet.Client;
using MQTTnet;
using System.Threading.Tasks;
using MQTTnet.Packets;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;/// <summary>
/// MQTT管理器
/// </summary>
public class MQTTManager : MonoSingleton<MQTTManager>
{private static readonly string MQTTURI = "broker.emqx.io";private static readonly int MQTTPort = 1883;private static readonly string MQTTUser = "";private static readonly string MQTTPassword = "";private string _ClientID;/// <summary>/// 重连间隔时间(s)/// </summary>private static readonly float ReconnectGapTime = 10;/// <summary>/// 客户端/// </summary>private IMqttClient _Client;/// <summary>/// 失败次数/// </summary>private int _FailCount;/// <summary>/// 当前状态/// </summary>private MQTTStatus _Status;/// <summary>/// 等待时间/// </summary>private float _WaitTime;// Start is called before the first frame updatevoid Start(){_ClientID = System.Guid.NewGuid().ToString();Task.Run(InitMQTT);}// Update is called once per framevoid Update(){if (_Status == MQTTStatus.Failed){_WaitTime += Time.deltaTime;if (_WaitTime > ReconnectGapTime){_WaitTime = 0;Reconnect();}}}/// <summary>/// 初始化MQTT信息/// </summary>private void InitMQTT(){MqttClientOptionsBuilder builder = new MqttClientOptionsBuilder().WithTcpServer(MQTTURI, MQTTPort) // 要访问的mqtt服务端的 ip 和 端口号.WithCredentials(MQTTUser, MQTTPassword) // 要访问的mqtt服务端的用户名和密码.WithClientId(_ClientID) // 设置客户端id.WithCleanSession().WithTls(new MqttClientOptionsBuilderTlsParameters{UseTls = false  // 是否使用 tls加密});MqttClientOptions clientOptions = builder.Build();_Client = new MqttFactory().CreateMqttClient();_Client.ConnectedAsync += Client_ConnectedAsync; // 客户端连接成功事件_Client.DisconnectedAsync += Client_DisconnectedAsync; // 客户端连接关闭事件_Client.ApplicationMessageReceivedAsync += Client_ApplicationMessageReceivedAsync; ; // 收到消息事件_Status = MQTTStatus.Connecting;_Client.ConnectAsync(clientOptions);}/// <summary>/// 重新连接/// </summary>private void Reconnect(){LogManager.LogInfo("重新连接");Task.Run(delegate (){_Status = MQTTStatus.Connecting;_Client.ReconnectAsync();});}/// <summary>/// 新消息事件/// </summary>/// <param name="arg"></param>/// <returns></returns>private System.Threading.Tasks.Task Client_ApplicationMessageReceivedAsync(MqttApplicationMessageReceivedEventArgs arg){string str = System.Text.Encoding.UTF8.GetString(arg.ApplicationMessage.PayloadSegment.Array);Loom.QueueOnMainThread(() =>{LogManager.LogInfo("收到消息:" + arg.ApplicationMessage.Topic + "=====" + str);});return Task.CompletedTask;}/// <summary>/// 连接断开事件/// </summary>/// <param name="arg"></param>/// <returns></returns>private System.Threading.Tasks.Task Client_DisconnectedAsync(MqttClientDisconnectedEventArgs arg){Loom.QueueOnMainThread(() =>{LogManager.LogInfo("MQTT连接断开:" + arg.Reason);});_Status = MQTTStatus.Failed;_FailCount++;return Task.CompletedTask;}/// <summary>/// 连接成功事件/// </summary>/// <param name="arg"></param>/// <returns></returns>private System.Threading.Tasks.Task Client_ConnectedAsync(MqttClientConnectedEventArgs arg){_Status = MQTTStatus.Connected;Loom.QueueOnMainThread(() =>{LogManager.LogInfo("MQTT连接成功");_FailCount = 0;});return Task.CompletedTask;}/// <summary>/// 发布消息/// </summary>public static void PublishAsync(MqttApplicationMessage message){if (_Instance){_Instance._Client.PublishAsync(message);}}/// <summary>/// 订阅消息/// </summary>public static void SubscribeAsync(MqttClientSubscribeOptions options){if (_Instance){_Instance._Client.SubscribeAsync(options);}}/// <summary>/// 取消订阅消息/// </summary>public static void UnsubscribeAsync(MqttClientUnsubscribeOptions options){if (_Instance){_Instance._Client.UnsubscribeAsync(options);}}/// <summary>/// 状态/// </summary>public enum MQTTStatus{Empty = 0,/// <summary>/// 连接中/// </summary>Connecting = 1,/// <summary>/// 连接成功/// </summary>Connected = 2,/// <summary>/// 连接失败/// </summary>Failed = 3,}
}

尾语

参考文档:一文带你搞懂 MQTT - 知乎 (zhihu.com)

如果有写的不好的地方,欢迎各位大佬留言批评指正。


http://www.ppmy.cn/news/147947.html

相关文章

MITA触摸屏维修WP4053米塔工控机控制屏维修

MITA-TEKNIK米塔触摸屏维修工控机工控屏控制器维修DISPLAY 2COM全系列型号 Mita-Teknik触摸屏维修常见故障&#xff1a;上电无显示&#xff0c;运行报故障&#xff0c;无法与电脑通讯&#xff0c;触摸无反应&#xff0c;触控板破裂&#xff0c;触摸玻璃&#xff0c;上电黑屏&a…

【定制项目】【触摸屏一体机】【自启动运行】【M15 消防安全宣传】【横屏版】主要模块:视频 + 音频 + 图标 + 问答游戏

之前客户指定要求竖屏版&#xff0c;所以只做了竖屏效果&#xff08;项目管理箴言 - 做只做需要的工作&#xff0c;不要镀金&#xff09;&#xff0c;后来客户采购了一批横屏设备&#xff08;毕竟横屏播放视频才是王道&#xff09;&#xff0c;所以代码升级支持横屏版。 功能参…

法院触摸屏查询软件

# - 触屏精灵&#xff0c;一款简单易用的触摸屏软件&#xff0c;主要应用于 医院、法院案件查询、自助博物馆导游、大屏广告、旅游区景点介绍、各类政企展馆展厅。 平台&#xff1a;win7 win8 win10 语言&#xff1a;C# Wpf 版本&#xff1a;V1.8.4 可以插入图片、视频、音…

光华股份在深交所上市:市值突破51亿元,前三季度收入约10亿元

12月8日&#xff0c;浙江光华科技股份有限公司&#xff08;下称“光华股份”&#xff0c;SZ:001333&#xff09;在深圳证券交易所主板上市。本次上市&#xff0c;光华股份的发行价格27.76元/股&#xff0c;发行数量为3200万股&#xff0c;募资总额约为8.88亿元&#xff0c;扣除…

工业触摸一体机的触摸屏原理和维护

工业触摸一体机的触摸屏原理和维护 工业触摸一体机集成主机、显示器、触摸屏为一体&#xff0c;具备稳定性好、可靠性高、扩展性强等特点&#xff0c;广泛用于自助终端、医疗仪器、工业控制、自动化设备、电信、电力、网络、轨道交通等领域。目前工业触摸一体机常用的触摸屏有电…

英方软件在科创板上市:总市值89亿元,胡军擎、江俊夫妇为实控人

1月19日&#xff0c;上海英方软件股份有限公司&#xff08;下称“英方软件”&#xff0c;SH:688435&#xff09;在上海证券交易所科创板上市。本次上市&#xff0c;英方软件的发行价为38.66元/股&#xff0c;发行2094.6737万股&#xff0c;募资总额约为8.10亿元&#xff0c;募资…

倍福触摸屏维修倍福显示屏维修CP3916-0000故障概述

倍福工控机触摸屏故障维修&#xff1a;先用万用表测了24V电源输入端与地之间阻值&#xff0c;2兆多欧姆&#xff0c;不短路&#xff0c;然后打开机器后壳&#xff0c;测电源保 险丝&#xff0c;完好。于是给机器上24V直流电&#xff0c;电源指示灯亮&#xff0c;初步判定电源电…

上海亚商投顾:两市成交创23个月新低 医疗器械板块强势

上海亚商投顾前言&#xff1a;无惧大盘大跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 沪指今日高开低走&#xff0c;盘中一度涨超1%&#xff0c;午后下行翻绿&#xff0c;再创本轮调整新低&#xff0c;…