MQTT通信协议在Unity中的应用之二—Unity3D C#实现

vanturman 2020-04-10

上一篇讲解了MQTT协议在JS实现,通过和Unity3D交互实现通信,因为对JS不是特别精通,所以讲得比较粗略。这一篇中,介绍Unity3D 实现MQTT协议通信,将细致讲解过程
MQTT是IBM开源的一个通讯方式,是一个基于TCP的发布订阅协议,MQTT使用类似MQ常用的发布/订阅模式,起到应用程序解耦,异步消息,削峰填谷的作用。
优点:
  • 使用发布/订阅模式,提供一对多的消息发布,使消息发送者和接收者在时间和空间上解耦。
  • 二进制协议, 网络传输开销非常小(固定头部是2字节)。
  • 灵活的Topic订阅、 Qos、临终遗言等特性。
    缺点:
  • 集中化部署,服务端压力大,需要考虑流程控制及高可用。
  • 对于请求/响应模式的支持需要在应用层根据消息ID做发布主题和订阅主题。

适用范围:
在低带宽、不可靠的网络下提供基于云平台的远程设备的数据传输和监控。

原理图:
MQTT通信协议在Unity中的应用之二—Unity3D C#实现

MQTT开发文档:
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html

Unity3D开发引入MQTT时候进行封装成M2MQTT,通过GiitHub下载M2MQTT,很多,导入你的Unity工程,这里就不介绍了。

第一步:因为MQTT中间需要消息代理,所以我们首先得搭建代理服务器,我这里使用得是apache-apollo-1.7.1服务,安装过程百度,注册登录
MQTT通信协议在Unity中的应用之二—Unity3D C#实现
需要选择协议。
第二步:就是要在Unity进行开发了,直接上代码吧

using System.Net;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;

 /// <summary>
    /// 连接
    /// </summary>
    public void  onConnect()
    {
        string txtIP = ip.text;
        string txtPort = port.text;
        string clientId = Guid.NewGuid().ToString();
        //服务器默认密码是这个
        string username = "admin";
        string password = "password";
        client = new MqttClient(IPAddress.Parse(txtIP), int.Parse(txtPort), false, null);

        client.MqttMsgPublishReceived += Client_MqttMsgPublishReceived;
        client.MqttMsgSubscribed += Client_MqttMsgSubscribed;
        client.Connect(clientId, username, password);
    }

          /// <summary>
      /// 断开连接
      /// </summary>
      client.Disconnect();

        //订阅主题
          if (client != null&&subscribe_chanel.text!="")
            {
                client.Subscribe(new string[] { subscribe_chanel.text }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
            }

                        //订阅回调
                         private void Client_MqttMsgSubscribed(object sender, uPLibrary.Networking.M2Mqtt.Messages.MqttMsgSubscribedEventArgs e)
    {
        Debug.Log("订阅" + e.MessageId);
    }

                        //发布消息
                         if (client != null && publish_chanel.text != "")
            {
                client.Publish(publish_chanel.text, System.Text.Encoding.UTF8.GetBytes(publish_content.text), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);
            }

                        //接受消息
                           private void Client_MqttMsgPublishReceived(object sender, uPLibrary.Networking.M2Mqtt.Messages.MqttMsgPublishEventArgs e)
    {
        string message=System.Text.Encoding.UTF8.GetString(e.Message);
        receive_message = message;
        Debug.Log("接收到消息是"+message);
    }

主要的方法都在上面了,而且我测试过了,信息谁可以接受到的,如果大家还想设置更多条件,可以在我上面发的开发文档链接中继续探索。

相关推荐

Iamlonely / 0评论 2013-01-23