Unity实现MQTT服务器

这篇具有很好参考价值的文章主要介绍了Unity实现MQTT服务器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先下载MqttNet:MqttNet4.1.2.350

解压好后使用vs打开,并生成.dll文件(我这里下载的是4.1.2.350版本)

请注意最好下载4.1.2.350版本的,否则其他版本生成的Dll可能与我所用版本存在差异,导致我下面的代码出现错误,若链接失效,可自行百度MqttNet,选择

Unity实现MQTT服务器,unity,服务器,游戏引擎

点击进入后找到图中圈出来的部分

Unity实现MQTT服务器,unity,服务器,游戏引擎

点击“+”,然后翻找历史版本,选择4.1.2.350版本下载。

然后再/Source/MQTTnet/bin/Debug/net452 文件夹中找到生成的文件

新建unity工程,创建Plugins文件夹,将文件复制到该文件夹内

然后新建脚本MyMqttServer,代码内带有注释

using MQTTnet.Adapter;
using MQTTnet.Server;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MQTTnet;
using System.Threading.Tasks;
using System;
using System.Diagnostics.Tracing;
using System.Net;
using MQTTnet.Diagnostics;
using System.Text;
using MQTTnet.Protocol;
using static UnityEditor.ObjectChangeEventStream;

namespace MQTT.Server
{
    /// <summary>
    /// 客户端信息
    /// </summary>
    public class MqttClientObject
    {
        public MqttClientObject(string clientID, string userName = "", string password = "")
        {
            this.ClientID = clientID;
            this.UserName = userName;
            this.PassWord = password;
        }

        public string ClientID { get; set; }
        public string UserName { get; set; }
        public string PassWord { get; set; }
    }

    /// <summary>
    /// MQTT服务
    /// </summary>
    public class MyMqttServer
    {
        /// <summary>
        /// 服务器对象
        /// </summary>
        private MqttServer m_MqttServer = null;

        /// <summary>
        /// Mqtt服务器选项生成器
        /// </summary>
        MqttServerOptionsBuilder optionbuilder = null;

        /// <summary>
        /// 连接的客户端
        /// </summary>
        private List<MqttClientObject> m_MqttClientObject = new List<MqttClientObject>();

        /// <summary>
        /// 开启服务器
        /// </summary>
        /// <param name="port"></param>
        public void StartMqttServer(int port = 1883)
        {
            //1.创建服务器对象
            if (m_MqttServer == null)
            {
                //创建Mqtt服务器选项生成器
                optionbuilder = new MqttFactory().CreateServerOptionsBuilder();
                //设置带有默认终端
                optionbuilder.WithDefaultEndpoint();
                //设置终端端口号
                optionbuilder.WithDefaultEndpointPort(port);
                //设置具有持续会话
                optionbuilder.WithPersistentSessions(true);
                //设置无默认通信超时
                optionbuilder.WithDefaultCommunicationTimeout(TimeSpan.FromMilliseconds(60000));

                m_MqttServer = new MqttFactory().CreateMqttServer(optionbuilder.Build());
            }

            //监测服务器 开启/关闭
            m_MqttServer.StartedAsync += ServerStarted;
            m_MqttServer.StoppedAsync += ServerStoped;
            //监测客户端 连接/断开连接
            m_MqttServer.ClientConnectedAsync += ClientConnected;
            m_MqttServer.ClientDisconnectedAsync += ClientDisconnected;
            //监测客户端 订阅/取消订阅
            m_MqttServer.ClientSubscribedTopicAsync += ClientSubscribedTopic;
            m_MqttServer.ClientUnsubscribedTopicAsync += ClientUnSubscribedTopic;
            //客户端连接信息验证
            m_MqttServer.ValidatingConnectionAsync += ValidatingConnection;

            //获取客户端发送的消息
            m_MqttServer.InterceptingPublishAsync += InterceptingPublish;

            //开启服务器
            m_MqttServer.StartAsync();
        }

        /// <summary>
        /// 关闭服务
        /// </summary>
        public void StopMqttServer()
        {
            if (m_MqttServer != null)
            {
                m_MqttServer.StopAsync();
            }
        }

        /// <summary>
        /// 获取服务器状态--开启/关闭
        /// </summary>
        /// <returns></returns>
        public bool GetMqttServerState()
        {
            if (m_MqttServer == null)
            {
                return false;
            }

            return m_MqttServer.IsStarted;
        }

        /// <summary>
        /// 服务器完成开启
        /// </summary>
        /// <param name="eventArgs"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        private Task ServerStarted(EventArgs eventArgs)
        {
            Debug.Log("服务: started!");
            return Task.CompletedTask;
        }

        /// <summary>
        /// 服务器完成关闭
        /// </summary>
        /// <param name="eventArgs"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        private Task ServerStoped(EventArgs eventArgs)
        {
            Debug.Log("服务: stoped!");
            return Task.CompletedTask;

        }

        /// <summary>
        /// 客户端连接完成
        /// </summary>
        /// <param name="eventArgs"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        private Task ClientConnected(ClientConnectedEventArgs eventArgs)
        {
            Debug.Log($"服务:client Connected ClientId:{eventArgs.ClientId}");



            m_MqttClientObject.Add(new MqttClientObject(eventArgs.ClientId, eventArgs.UserName));
            return Task.CompletedTask;
        }

        /// <summary>
        /// 客户端订阅主题完成
        /// </summary>
        /// <param name="eventArgs"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        private Task ClientSubscribedTopic(ClientSubscribedTopicEventArgs eventArgs)
        {
            Debug.Log($"Client:{eventArgs.ClientId} -- Subscribed -- Topic:{eventArgs.TopicFilter.Topic}");

            ServerPublich(eventArgs.TopicFilter.Topic, $"Client:{eventArgs.ClientId} Subscribed this Topic");

            return Task.CompletedTask;
        }

        /// <summary>
        /// 客户端取消订阅主题完成
        /// </summary>
        /// <param name="eventArgs"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        private Task ClientUnSubscribedTopic(ClientUnsubscribedTopicEventArgs eventArgs)
        {
            Debug.Log($"Client:{eventArgs.ClientId} -- Subscribed -- Topic:{eventArgs.TopicFilter}");

            return Task.CompletedTask;
        }

        /// <summary>
        /// 客户端断开连接完成
        /// </summary>
        /// <param name="eventArgs"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        private Task ClientDisconnected(ClientDisconnectedEventArgs eventArgs)
        {
            Debug.Log($"Client:client DisConnected ClientId:{eventArgs.ClientId}");
            return Task.CompletedTask;
        }

        /// <summary>
        /// 客户端连接信息验证
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        private Task ValidatingConnection(ValidatingConnectionEventArgs args)
        {
            Debug.Log($"UserName:{args.UserName},PassWord:{args.Password}");
            
            return Task.CompletedTask;
        }

        /// <summary>
        /// 获取客户端发送的消息
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        private Task InterceptingPublish(InterceptingPublishEventArgs args)
        {
            Debug.Log($"Client:{args.ClientId} send Message : {Encoding.UTF8.GetString(args.ApplicationMessage.Payload)} -- Topic:{args.ApplicationMessage.Topic}");

            return Task.CompletedTask;
        }

        /// <summary>
        /// 服务器广播消息
        /// </summary>
        /// <param name="topic">主题</param>
        /// <param name="message">信息</param>
        public void ServerPublich(string topic, string message, bool isRetain = false, MqttQualityOfServiceLevel level = MqttQualityOfServiceLevel.ExactlyOnce)
        {
            var builder = new MqttApplicationMessageBuilder().WithTopic(topic).WithPayload(message).WithRetainFlag(isRetain).WithQualityOfServiceLevel(level).Build();
            var data = new InjectedMqttApplicationMessage(builder);
            data.SenderClientId = "1";
            m_MqttServer.InjectApplicationMessage(data);
        }

    }
}

创建脚本MyMqttClient,代码内带有注释

using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Diagnostics;
using MQTTnet.Protocol;
using MQTTnet.Server;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;

/// <summary>
/// MQTT客户端
/// </summary>
public class MyMqttClient
{
    private IMqttClient m_MqttClient = null;
    private string m_ClientID;

    /// <summary>
    /// 创建客户端并连接服务器
    /// </summary>
    /// <param name="clientID"></param>
    /// <param name="ip"></param>
    /// <param name="port"></param>
    public MyMqttClient(string clientID, string ip = "127.0.0.1", int port = 1883)
    {
        m_ClientID = clientID;
        //客户端选项生成器
        var options = new MqttClientOptionsBuilder()
        .WithClientId(m_ClientID)
        .WithTcpServer(ip, port)
        .Build();
        //创建客户端
        m_MqttClient = new MqttFactory().CreateMqttClient();
        //监测客户端 连接/断开连接 完成
        m_MqttClient.ConnectedAsync += ClientConnected;
        m_MqttClient.DisconnectedAsync += ClientDisConnected;
        //客户端接收到消息
        m_MqttClient.ApplicationMessageReceivedAsync += ReceiveMsg;
        //连接服务器
        m_MqttClient.ConnectAsync(options);
    }

    /// <summary>
    /// 接收到消息
    /// </summary>
    /// <param name="args"></param>
    /// <returns></returns>
    private Task ReceiveMsg(MqttApplicationMessageReceivedEventArgs args)
    {
        Debug.Log($"Receive Message From Client:{args.ClientId} msg:{Encoding.UTF8.GetString(args.ApplicationMessage.Payload)}");

        return Task.CompletedTask;
    }

    /// <summary>
    /// 断开连接完成
    /// </summary>
    /// <param name="args"></param>
    /// <returns></returns>
    private Task ClientDisConnected(MqttClientDisconnectedEventArgs args)
    {
        Debug.Log("disConnected");
        return Task.CompletedTask;
    }

    /// <summary>
    /// 连接完成
    /// </summary>
    /// <param name="args"></param>
    /// <returns></returns>
    private Task ClientConnected(MqttClientConnectedEventArgs args)
    {
        Debug.Log("connected");

        return Task.CompletedTask;
    }

    /// <summary>
    /// 发布消息
    /// </summary>
    public void PublishMsg(string topic, string message, MqttQualityOfServiceLevel level = MqttQualityOfServiceLevel.ExactlyOnce, bool isRetain = false)
    {
        m_MqttClient.PublishStringAsync(topic, message, level, isRetain);
    }

    /// <summary>
    /// 订阅主题
    /// </summary>
    public void Subscribe(string topic)
    {
        m_MqttClient.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic(topic).Build());
    }
}

到这服务器与客户端脚本完成,接下来只需要写一些测试脚本,调用上面脚本的接口,即可完成服务器的开启/关闭,客户端连接,收发消息等功能。

测试上述功能的脚本如下,只需要加个ui,托一些按钮就可以。文章来源地址https://www.toymoban.com/news/detail-735747.html

using MQTT.Server;
using MQTTnet.Server;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Test : MonoBehaviour
{
    public Button StartBtn;
    public Button StopBtn;
    public Button ClientConnectBtn;
    public Button PublichBtn;
    public Button SubBtn;

    public Button SendBtn;
    MyMqttServer mqttServer = null;
    MyMqttClient client = null;
    private void Awake()
    {
        StartBtn?.onClick.AddListener(OnStartBtnClick);
        StopBtn?.onClick.AddListener(OnStopBtnClick);
        ClientConnectBtn?.onClick.AddListener(OnConnectBtnClick);
        PublichBtn?.onClick.AddListener(OnSendBtnClick);
        SubBtn?.onClick.AddListener(OnSubBtnClick);

        SendBtn?.onClick.AddListener(OndBtnClick);
    }

    private void OndBtnClick()
    {
        mqttServer.ServerPublich("2", "Message Test");
    }

    private void OnSubBtnClick()
    {
        client.Subscribe("2");
    }

    private void OnSendBtnClick()
    {
        client.PublishMsg("2", "Message Test!");
    }
     
    private void OnConnectBtnClick()
    {
        client = new MyMqttClient(Guid.NewGuid().ToString());
    }

    private void OnStopBtnClick()
    {
        if (mqttServer != null)
        {
            mqttServer.StopMqttServer();
        }
    }

    private void OnStartBtnClick()
    {
        if (mqttServer == null)
        {
            mqttServer = new MyMqttServer();
        }

        mqttServer.StartMqttServer();
    }
}

到了这里,关于Unity实现MQTT服务器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 如何与服务器对接来实现

    Unity是一款非常流行的游戏引擎,它可以用来制作各种类型的游戏,包括单人游戏和多人游戏。在多人游戏中,玩家需要与服务器进行通信,以便实现多人游戏的功能。本文将详细讲解Unity如何与服务器对接来实现多人在线游戏。 网络通信 在多人游戏中,玩家需要与服务器进

    2024年02月10日
    浏览(36)
  • Unity进阶--通过PhotonServer实现联网登录注册功能(服务器端)--PhotonServer(二)

    如何配置PhotonServer服务器:https://blog.csdn.net/abaidaye/article/details/132096415 大体结构图 结构图示意 BLL层(控制层) 总管理类 控制层接口 登录注册控制类 DAL层(数据控制层) 总数据管理层 登录注册数据管理层 模型层 登录注册层 DLC 服务器配置类 发送消息类 以及消息类 服务器

    2024年02月14日
    浏览(45)
  • mqtt服务器搭建与qt下的mqtt客户端实现

      MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(Io

    2024年02月06日
    浏览(94)
  • Windows搭建MQTT服务器:详细步骤及代码实现

    Windows搭建MQTT服务器:详细步骤及代码实现 MQTT是一种轻量级的通信协议,常用于物联网领域中设备与设备之间的通信。在Windows操作系统下,搭建MQTT服务器可作为物联网通信的基础设施。本文将详细介绍Windows下如何搭建MQTT服务器,包括安装软件、配置服务、使用代码实现等

    2024年02月06日
    浏览(56)
  • 搭建自己的MQTT服务器,实现设备上云(Ubuntu+EMQX)

    这篇文章教大家在ECS云服务器上部署EMQX,搭建自己私有的MQTT服务器,配置EMQX实现设备上云,设备数据转发,存储;服务器我采用的华为云的ECS服务器,系统选择Ubuntu系统。 Windows版本的看这里: https://blog.csdn.net/xiaolong1126626497/article/details/134280836 EMQX是一款大规模可弹性伸缩

    2024年02月04日
    浏览(47)
  • 【物联网开发】-微信小程序之MQTT连接,基于MQTT实现设备-服务器-小程序的消息传输

    想要开发微信小程序,首先要有一些基础知识:html、cs、js、json等,小程序中要用到的知识框架大体相同,一个页面包括js、json、wxml、wxss格式的文件。 由于本人此前从未接触过小程序开发,本篇文章将会以新手小白的角度一步步剖析如何使用微信小程序通过MQTT服务器连接设

    2023年04月24日
    浏览(59)
  • esp8266模块--MQTT协议连接服务器实现数据接收和发送+源码

    首先推荐中国移动的代码,我觉得中国移动的代码更为合理:(但是有一些其他的模块在里面) OneNET开发板代码、资料--2020-09-27--标准板、Mini板bug修复 - 开发板专区 - OneNET设备云论坛 (10086.cn) 以及这位b站up做的视频:(wifi模块在p9节) 【挽救小白第一季】STM32+8266+小程序智能

    2024年02月08日
    浏览(63)
  • nodejs 实现MQTT协议的服务器端和客户端的双向交互

    公司和第三方合作开发一个传感器项目,想要通过电脑或者手机去控制项目现场的传感器控制情况。现在的最大问题在于,现场的边缘终端设备接入的公网方式是无线接入,无法获取固定IP,所以常规的HTTP协议通信就没法做,现在打算使用MQTT来实现云平台和边缘终端(传感器

    2024年02月05日
    浏览(68)
  • 【毕业论文】| 基于Unity3D引擎的冒险游戏的设计与实现

    📢博客主页:肩匣与橘 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 肩匣与橘 编写,首发于 CSDN 🙉 📢生活依旧是美好而又温柔的,你也是✨  基于Unity3D引擎的冒险游戏的设计与实现 📢前言 摘要 Abstract 1 绪论 1.1 选题背景 1.2 研究目的及意义 2 开发工具

    2024年02月05日
    浏览(66)
  • Unity如何上传一个文件到服务器

    在游戏开发过程中,有时候需要上传一些文件到远程服务器上,比如游戏资源文件、玩家数据等等。在Unity中,我们可以使用UnityWebRequest类来实现文件上传功能。本文将详细介绍Unity如何上传一个文件到服务器,并给出Unity与服务器的核心代码实现。 对啦!这里有个游戏开发交

    2023年04月18日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包