Hololens连接mysql_Hololens开发笔记:UDP接收数据
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接收数据相关推荐
- 基于BC95的数据转发,利用Python实现UDP接收数据,TCP转发数据
基于BC95的数据转发,利用Python实现UDP接收数据,TCP转发数据 文章信息 环境信息 系统概览 基于Python的UDP(服务端)数据接收 1. UDP接受的数据如何读取 文章信息 撰写日期 ...
- 【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )
文章目录 I UDP 信息发送接收原理 II UDP 发送和接收端口相同 III UDP 发送信息代码示例 IV UDP 接收信息代码示例 V UDP 服务器端代码示例 VI UDP 客户端代码示例 ...
- iOS开发- 蓝牙后台接收数据(BLE4.0)
最近在做一个蓝牙相关的项目, 需要在应用进入后台, 或者手机属于锁屏状态的情况下, 仍然保持蓝牙连接, 并且能正常接收数据. 本来以后会很麻烦, 但是学习了下..发现就2步而已.简单的不能再简单了. ...
- 微信小程序应用开发赛全国三等奖总结,以及关键点汇总,开发基本功系列(含云开发笔记、wxcharts数据可视化)
在华南赛区近千支队伍里以第四名脱颖而出,成为唯一一支入围国赛的专科队伍. 当时是专科大二,省赛作品提交剩下两个月左右我们才报名,然后开始学小程序,边学边开发,没想到第一次参加比赛就拿到国奖,兴奋了好久 ...
- LWIP Socket UDP接收数据无法获取IP地址信息
项目场景: STM32H743平台FreeRTOS下使用LWIP,在使用socket接口操作udp: 问题描述 接收UDP数据时不能获取远端IP和端口号 struct sockaddr_in sera ...
- 25. Python语言 Web 开发 之 Socket 编程 · 第一章 UDP发送与接收数据
UDP发送与接收数据 本章主题 关键词 前导: 计算机网络的发展及基础网络概念 两台电脑的通信 IP地址介绍及分类 IP地址与IP协议 Windows 和 Linux 查看网卡信息 IP地址分类 以太 ...
- Android开发-连接开发板蓝牙模块发送和接收数据
帮同学写一个连接小车蓝牙模块遥控小车的APP,在网上搜阅了很多资料,大概了解了蓝牙的工作原理,再经历了种种BUG后终于是成功连上了小车蓝牙,并可以发送数据,小车可以接收到,测试的蓝牙是Arduino小 ...
- 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
假设你还没有看上一篇 手把手教你Android手机与BLE终端通信--搜索,你就先看看吧,由于这一篇要接着讲搜索到蓝牙后的连接.和连接后的发送和接收数据. 评论里有非常多人问假设一条信息特别长,怎么不 ...
- 罗技方向盘SDK开发笔记
这段时间因为项目需求,接触到了罗技G29方向盘的SDK开发,能够参考的资料比较有限,一路磕磕碰碰遇见不少问题,硬着头走了下去,不过最后还是成功了,写下这篇笔记来记录下我的开发过程,也给有需要的人参考, ...
最新文章
- ICCV 2013的人脸特征点检评测及代码
- 为什么java安装卡在满格_Java面试总结(JVM)
- NTU课程笔记:MAS 714 algorithm and theory of computing(1):introduction
- 入选2020爱分析银行和零售数字化转型代表厂商,永洪科技有哪些经典案例可以借鉴?
- android 默认开关,android默认设置的开关
- RabbitMQ消费消息幂等性问题
- 复选框 全选 全不选 反选 实现
- 使用.bat文件或者是cmd里面运行.jar文件
- lua——赢三张牌型处理相关算法(上)——牌值数据
- 利用属性观察器实现数据绑定
- python itertools combination_Python itertools.combinations 和 itertools.permutations 等价代码实现...
- python学习day02
- 企业为什么要做高端网站优化呢?
- linux RAID10测试
- 一、Multisim软件介绍
- 2.9 使用快捷键快速隐藏和显示行列 [原创Excel教程]
- java课题研究方法和技术途径_开题报告中的拟采取的研究方法技术路线和技术关键...
- 用matlab产生chu序列和frank序列
- centos7文件同步服务器,教你在 Centos7 中使用 Unison 同步文件
- 全国三级流域空间分布矢量数据下载方式