Hololens的应用需要与其他设备通信的时候,UDP是比较方便的一种方式,Unity3d 2017.3 C#开发的时候可以用Windows.Networking.Sockets.DatagramSocket 类来接收、发送UDP消息,简单快捷。

.net 的System.net.Socket对象应该也可以,但是只支持部分方法,一开始没走通所以我没继续测试下去。

开发的时候注意两个地方:

1、DatagramSocket.MessageReceived 事件不在主线程运行,所以在这个事件中不能操作UI的东西,比如给文本框赋值,否则报错。

2、Unity Build的时候Player Settings要勾选 PrivateNetworkClientServer,注意跟InternetClientServer不一样。因为我是在局域网测试,一开始只是勾选了InternetClientServer,结果无法接收消息。

---------------------------------------

下面是网上找的一个UDP收发消息的类:

using UnityEngine;

using System;

using System.IO;

using System.Text;

using System.Linq;

using HoloToolkit.Unity;

using System.Collections.Generic;

using UnityEngine.Events;

#if !UNITY_EDITOR

using Windows.Networking.Sockets;

using Windows.Networking.Connectivity;

using Windows.Networking;

#endif

[System.Serializable]

public class UDPMessageEvent : UnityEvent

{

}

public class UDPCommunication : Singleton

{

[Tooltip("port to listen for incoming data")]

public string internalPort = "12345";

[Tooltip("IP-Address for sending")]

public string externalIP = "192.168.17.110";

[Tooltip("Port for sending")]

public string externalPort = "12346";

[Tooltip("Send a message at Startup")]

public bool sendPingAtStart = true;

[Tooltip("Conten of Ping")]

public string PingMessage = "hello";

[Tooltip("Function to invoke at incoming packet")]

public UDPMessageEvent udpEvent = null;

private readonly Queue ExecuteOnMainThread = new Queue();

#if !UNITY_EDITOR

//we've got a message (data[]) from (host) in case of not assigned an event

void UDPMessageReceived(string host, string port, byte[] data)

{

Debug.Log("GOT MESSAGE FROM: " + host + " on port " + port + " " + data.Length.ToString() + " bytes ");

}

//Send an UDP-Packet

public async void SendUDPMessage(string HostIP, string HostPort, byte[] data)

{

await _SendUDPMessage(HostIP, HostPort, data);

}

DatagramSocket socket;

async void Start()

{

if (udpEvent == null)

{

udpEvent = new UDPMessageEvent();

udpEvent.AddListener(UDPMessageReceived);

}

Debug.Log("Waiting for a connection...");

/**

*关键点一:创建使用UDP的网络通信对象:DatagramSocket,然后添加接收消息的事件MessageReceived

*/

socket = new DatagramSocket();

socket.MessageReceived += Socket_MessageReceived;

HostName IP = null;

try

{

var icp = NetworkInformation.GetInternetConnectionProfile();

IP = Windows.Networking.Connectivity.NetworkInformation.GetHostNames()

.SingleOrDefault(

hn =>

hn.IPInformation?.NetworkAdapter != null && hn.IPInformation.NetworkAdapter.NetworkAdapterId

== icp.NetworkAdapter.NetworkAdapterId);

/**

* 关键点二:绑定IP和监听端口,IP如果传null好像不行。

*/

await socket.BindEndpointAsync(IP, internalPort);

}

catch (Exception e)

{

Debug.Log(e.ToString());

Debug.Log(SocketError.GetStatus(e.HResult).ToString());

return;

}

if (sendPingAtStart)

SendUDPMessage(externalIP, externalPort, Encoding.UTF8.GetBytes(PingMessage));

}

private async System.Threading.Tasks.Task _SendUDPMessage(string externalIP, string externalPort, byte[] data)

{

using (var stream = await socket.GetOutputStreamAsync(new Windows.Networking.HostName(externalIP), externalPort))

{

using (var writer = new Windows.Storage.Streams.DataWriter(stream))

{

writer.WriteBytes(data);

await writer.StoreAsync();

}

}

}

#else

// to make Unity-Editor happy :-)

void Start()

{

}

public void SendUDPMessage(string HostIP, string HostPort, byte[] data)

{

}

#endif

static MemoryStream ToMemoryStream(Stream input)

{

try

{ // Read and write in

byte[] block = new byte[0x1000]; // blocks of 4K.

MemoryStream ms = new MemoryStream();

while (true)

{

int bytesRead = input.Read(block, 0, block.Length);

if (bytesRead == 0) return ms;

ms.Write(block, 0, bytesRead);

}

}

finally { }

}

// Update is called once per frame

void Update()

{

/**

* 关键点四:由主线程触发事件,避免外面调用的类可能出错。

*/

while (ExecuteOnMainThread.Count > 0)

{

ExecuteOnMainThread.Dequeue().Invoke();

}

}

#if !UNITY_EDITOR

private void Socket_MessageReceived(Windows.Networking.Sockets.DatagramSocket sender,

Windows.Networking.Sockets.DatagramSocketMessageReceivedEventArgs args)

{

Debug.Log("GOT MESSAGE FROM: " + args.RemoteAddress.DisplayName);

//Read the message that was received from the UDP client.

Stream streamIn = args.GetDataStream().AsStreamForRead();

MemoryStream ms = ToMemoryStream(streamIn);

byte[] msgData = ms.ToArray();

/**

* 关键点三:接收到数据用事件发送出去,这里只是把触发事件的代码放到队列ExecuteOnMainThread中。

* 是因为接收函数是多线程的,跟Unity主线程不一样,自己开发的时候如果在这里给文本框赋值会报错!

*/

if (ExecuteOnMainThread.Count == 0)

{

ExecuteOnMainThread.Enqueue(() =>

{

Debug.Log("ENQEUED ");

if (udpEvent != null)

udpEvent.Invoke(args.RemoteAddress.DisplayName, internalPort, msgData);

});

}

}

#endif

}

然后是Player Settings截图:

Hololens连接mysql_Hololens开发笔记:UDP接收数据相关推荐

  1. 基于BC95的数据转发,利用Python实现UDP接收数据,TCP转发数据

    基于BC95的数据转发,利用Python实现UDP接收数据,TCP转发数据 文章信息 环境信息 系统概览 基于Python的UDP(服务端)数据接收 1. UDP接受的数据如何读取 文章信息 撰写日期 ...

  2. 【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )

    文章目录 I UDP 信息发送接收原理 II UDP 发送和接收端口相同 III UDP 发送信息代码示例 IV UDP 接收信息代码示例 V UDP 服务器端代码示例 VI UDP 客户端代码示例 ...

  3. iOS开发- 蓝牙后台接收数据(BLE4.0)

    最近在做一个蓝牙相关的项目, 需要在应用进入后台, 或者手机属于锁屏状态的情况下, 仍然保持蓝牙连接, 并且能正常接收数据. 本来以后会很麻烦, 但是学习了下..发现就2步而已.简单的不能再简单了. ...

  4. 微信小程序应用开发赛全国三等奖总结,以及关键点汇总,开发基本功系列(含云开发笔记、wxcharts数据可视化)

    在华南赛区近千支队伍里以第四名脱颖而出,成为唯一一支入围国赛的专科队伍. 当时是专科大二,省赛作品提交剩下两个月左右我们才报名,然后开始学小程序,边学边开发,没想到第一次参加比赛就拿到国奖,兴奋了好久 ...

  5. LWIP Socket UDP接收数据无法获取IP地址信息

    项目场景: STM32H743平台FreeRTOS下使用LWIP,在使用socket接口操作udp: 问题描述 接收UDP数据时不能获取远端IP和端口号 struct sockaddr_in sera ...

  6. 25. Python语言 Web 开发 之 Socket 编程 · 第一章 UDP发送与接收数据

    UDP发送与接收数据 本章主题 关键词 前导: 计算机网络的发展及基础网络概念 两台电脑的通信 IP地址介绍及分类 IP地址与IP协议 Windows 和 Linux 查看网卡信息 IP地址分类 以太 ...

  7. Android开发-连接开发板蓝牙模块发送和接收数据

    帮同学写一个连接小车蓝牙模块遥控小车的APP,在网上搜阅了很多资料,大概了解了蓝牙的工作原理,再经历了种种BUG后终于是成功连上了小车蓝牙,并可以发送数据,小车可以接收到,测试的蓝牙是Arduino小 ...

  8. 手把手教你Android手机与BLE终端通信--连接,发送和接收数据

    假设你还没有看上一篇 手把手教你Android手机与BLE终端通信--搜索,你就先看看吧,由于这一篇要接着讲搜索到蓝牙后的连接.和连接后的发送和接收数据. 评论里有非常多人问假设一条信息特别长,怎么不 ...

  9. 罗技方向盘SDK开发笔记

    这段时间因为项目需求,接触到了罗技G29方向盘的SDK开发,能够参考的资料比较有限,一路磕磕碰碰遇见不少问题,硬着头走了下去,不过最后还是成功了,写下这篇笔记来记录下我的开发过程,也给有需要的人参考, ...

最新文章

  1. ICCV 2013的人脸特征点检评测及代码
  2. 为什么java安装卡在满格_Java面试总结(JVM)
  3. NTU课程笔记:MAS 714 algorithm and theory of computing(1):introduction
  4. 入选2020爱分析银行和零售数字化转型代表厂商,永洪科技有哪些经典案例可以借鉴?
  5. android 默认开关,android默认设置的开关
  6. RabbitMQ消费消息幂等性问题
  7. 复选框 全选 全不选 反选 实现
  8. 使用.bat文件或者是cmd里面运行.jar文件
  9. lua——赢三张牌型处理相关算法(上)——牌值数据
  10. 利用属性观察器实现数据绑定
  11. python itertools combination_Python itertools.combinations 和 itertools.permutations 等价代码实现...
  12. python学习day02
  13. 企业为什么要做高端网站优化呢?
  14. linux RAID10测试
  15. 一、Multisim软件介绍
  16. 2.9 使用快捷键快速隐藏和显示行列 [原创Excel教程]
  17. java课题研究方法和技术途径_开题报告中的拟采取的研究方法技术路线和技术关键...
  18. 用matlab产生chu序列和frank序列
  19. centos7文件同步服务器,教你在 Centos7 中使用 Unison 同步文件
  20. 全国三级流域空间分布矢量数据下载方式

热门文章

  1. UCache灾备云SaaS 定义
  2. vue - props 声明数组和对象
  3. HKC(红裤衩)5大亮点, 揭秘HKC(红裤衩)的大体框架
  4. WebService简单实例(一通百通)
  5. 小鱼厨子养成记(一):7月
  6. think-webpack 1.0.0 发布
  7. 一份最简单的Mapbar地图源代码
  8. 普歌灵鹄团队java面试题和计算机网络面试题:
  9. 基于深度学习的高精度牙齿健康检测识别系统(PyTorch+Pyside6+YOLOv5模型)
  10. 十三、熵编码CAVLC:1、编码原理