MQTT通信协议在Unity中的应用之——JS实现

一直以来在工业领域研究,根据数字孪生的要求,需要打通网络,从CLP到IOT到Dass到虚拟工厂(三维可视化),为了打通控制与反控制的状态,需要打通网络通信,对于Unity首先想到的肯定是Socket通信,这也是很多开发人员所熟悉的方法,但是MQTT通信协议在工业通信中使用很普遍,所以今天我就对MQTT通信协议在Unity使用做介绍
我这边因为要上云端,所以,我测试了两套方案
1.通过JS实现MQTT通信,再通过Unity与JS交互,实现通信
首先需要paho-mqtt.js,jquery.min.js两个脚本,网上有很多,如果是精通JS的也可以自己写,大家都知道用来干嘛的。
下面是实现连接和信息通信的代码

    <script src="./jquery.min.js"></script>
    <script src="./paho-mqtt.js"></script>
        <scrpt>
           //MQTT连接
    //选中订阅主题
    var selectedTopics = [];
    //选中发布主题
    var currentTopic;
      //客户端选项
    var option = {
        "ServerUri": "127.0.0.1",
        "ServerPort": 61623,
        "UserName": "admin",
        "Password": "password",
        "ClientId": "",
        "TimeOut": 5,
        "KeepAlive": 100,
        "CleanSession": false,
        "SSL":false
    }

      //客户端
    var client;

      //连接
    function connectFun(){
        option .ClientId = guid();
        client = new Paho.Client(option.ServerUri, option.ServerPort, option.ClientId);
        client.onConnectionLost = onConnectionLost;
        client.onMessageArrived = onMessageArrived;
        client.connect({
            invocationContext: {
                host: option.ServerUri,//IP地址
                port: option.ServerPort,//端口号
               path: client.path,
                clientId: option.ClientId//标识
            },
            timeout: option.TimeOut,//连接超时时间
            keepAliveInterval: option.KeepAlive,//心跳间隔
            cleanSession: option.CleanSession,//是否清理Session
            useSSL: option.SSL,//是否启用SSL
            userName: option.UserName,  //用户名
            password: option.Password,  //密码
            onSuccess: onConnect,//连接成功回调事件
            onFailure: onError//连接失败回调事件
        });
    }

    //断开连接
    function disConnect(){
        //client.disconnect();
    }

    //订阅
    function onSubscrip(sub)
    {
        if (!client) {
            gameInstance.SendMessage("GameAPP","OnException","请连接服务");
            //alert("失败");
            return;
        }

        selectedTopics.push(sub);
        client.subscribe(selectedTopics,0x02);
        //alert("订阅:" + sub);
        gameInstance.SendMessage("GameAPP","OnException","订阅频道:" + sub);
    }

            //发布
    function onRele(sub,info)
    {
        if (!client) {
            gameInstance.SendMessage("GameAPP","OnException","请连接服务");
            return;
        }

        var message = new Paho.Message(info);
        currentTopic = sub;
        message.destinationName = currentTopic;
        //client.send(message)
        client.publish(currentTopic,info,0x02,false);

        gameInstance.SendMessage("GameAPP","OnException","发布消息:" + info);

    }

         //接收消息事件
    function onMessageArrived(data) {
        gameInstance.SendMessage("GameAPP","OnGetInfo","接收消息:" + data.payloadString);
        //alert("消息:" + data.payloadString);
    } 

    //连接断开事件
    function onConnectionLost(e) {
        if (e.errorCode !== 0) {
           gameInstance.SendMessage("GameAPP","OnException","发布消息:" + e.errorCode);
        }
    }

    //连接成功回调事件
    function onConnect()
    {
        gameInstance.SendMessage("GameAPP","OnException","连接成功!");
    }

    function onError(e){
        gameInstance.SendMessage("GameAPP","OnException","连接失败,请重新连接,");
    }

    //生成GUID
    function guid() {
        function S4() {
            return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
        }
        return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
    }

        </script>

只需要将接受的信息发给Unity,或者从Unity获取的信息发出。

原文地址:https://blog.51cto.com/myselfdream/2486066

时间: 2024-11-08 08:55:24

MQTT通信协议在Unity中的应用之——JS实现的相关文章

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

上一篇讲解了MQTT协议在JS实现,通过和Unity3D交互实现通信,因为对JS不是特别精通,所以讲得比较粗略.这一篇中,介绍Unity3D 实现MQTT协议通信,将细致讲解过程MQTT是IBM开源的一个通讯方式,是一个基于TCP的发布订阅协议,MQTT使用类似MQ常用的发布/订阅模式,起到应用程序解耦,异步消息,削峰填谷的作用.优点: 使用发布/订阅模式,提供一对多的消息发布,使消息发送者和接收者在时间和空间上解耦. 二进制协议, 网络传输开销非常小(固定头部是2字节). 灵活的Topic订阅

Unity中CS脚本于JS脚本交互

这里需要注意的是被调用的脚本必须放在 "Standard Assets". "Pro Standard Assets" 和"Plugins" 这三个文件夹中的任何一个里,而调用它的脚本不能在一个目录文件夹中,否则无法编译通过,原因是Unity会最先编译这三个文件夹,"Editor"目录里的脚本稍后编译,其他的脚本最后编译(既 CS调用JS,CS脚本放在其他文件家中,JS脚本要放在 如上三个文件夹中先编译:JS调用CS,JS脚本

在Unity中使用事件/委托机制(event/delegate)进行GameObject之

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 一对多的观察者模式机制有什么缺点? 如果你对如何在Unity中使用事件/委托机制还不太了解,建议您查看我的前一篇文章:[Unity3D技巧]在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 在前一篇博客里面,我们写到

unity中三种调用其他脚本函数的方法

第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名().很不实用-- 第二种,GameObject.Find("脚本所在物体名").SendMessage("函数名");  此种方法可以调用public和private类型函数 第三种,GameObject.Find("脚本所在物体名").GetComponent<脚本名>().函数名();此种方法只可以调用public类型函数 unity中三种调用其他脚本函数的

关于Unity中的NGUI和UGUI

用Unity开发2D游戏,有三套关系 1.GUI:Unity本身的对象 2.NGUI:以前在Unity中广泛来做2D的,是第三方的包,需要安装 3.UGUI:Unity5.X后,Unity找到NGUI的作者,开发了UGUI,变成内置于Unity中的包,官方主推 所有的元素都在Unity的UI工具栏 3D做2D游戏的方法: 1: 使用正交摄像机;2: 使用透视摄像机,将2D元素移动到合适的距离. 例如设计分辨率为 960x640, 得到在3D世界里面一个图片的大小w*h米,将这个图片移动到一定的距

Unity中使用协程进行服务端数据验证手段

近期在做项目中的个人中心的一些事情,用户头像上传,下载,本地缓存,二级缓存,压缩,这些都要做,麻雀虽小五脏俱全啊,也是写的浑浑噩噩的, 当我们在上传用户头像的时候,向服务端发送上传头像请求之前,一般都会做一次验证,向服务端获取token验证信息,来确保非法上传,如果不做这个那么会有非法用户上传非法图像,使你的服务器 带来未知的灾难. 而验证的逻辑很好写,并没有什么难度,比如: Server.SendMessage("获取token"); Client.Receive(string to

C#中的yield return与Unity中的Coroutine(协程)(下)

Unity中的Coroutine(协程) 估计熟悉Unity的人看过或者用过StartCoroutine() 假设我们在场景中有一个UGUI组件, Image: 将以下代码绑定到Image 1 using UnityEngine; 2 using System.Collections; 3 using System.Threading; 4 using UnityEngine.UI; 5 6 public class CoroutineDemo : MonoBehaviour { 7 8 //

【Unity技巧】Unity中的优化技术

写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得的~Digital Tutors是一个非常棒的教程网站,包含了多媒体领域很多方面的资料,非常酷!除此之外,还参考了Unity Cookie中的一个教程.还有很多其他参考在下面的链接中. 这篇文章旨在简要地说明一下常见的各种优化策略.不过对每个基础有非常深入地讲解,需要的童鞋可以自行去相关资料. 还有一些我认为非常好的参考文章: Performance Optimization for Mobile Devices

在Unity中定义统一的对象搜索接口

我们经常要在Unity中以各种方式搜索对象.比如按名字搜索.按tag.layer或者是查找名字为xxx开头的对象. 本文是介绍以一种统一的接口来搜索对象. 1.定义统一的搜索接口 /// <summary> /// 游戏对象搜索接口 /// </summary> public interface IGameObjectFinder { /// <summary> /// 搜索 /// </summary> /// <param name="r