質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Microsoft HoloLens

Microsoft HoloLensは、マイクロソフト社が開発しているヘッドマウントディスプレイ方式のコンピュータです。拡張現実体験のため透明なレンズを備えています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

4023閲覧

Unity、HoloLens2を用いてUDPの受信を行いたい

Antlia

総合スコア2

Microsoft HoloLens

Microsoft HoloLensは、マイクロソフト社が開発しているヘッドマウントディスプレイ方式のコンピュータです。拡張現実体験のため透明なレンズを備えています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2021/06/10 08:31

前提・実現したいこと

ラズパイ、Unity、HoloLens2を用いてUDP通信の受信を行いたいです。
ラズパイから送信されたデータをUnity、HoloLens2で受信したいのですが現状できていないのでどなたか知恵をお貸しください。
まずはUnityのエディタ上で動作させたいと考えています。

別件ですが受信用とは別に作成したアプリケーションではUnityやHoloLens2からラズパイにUDPを送信するプログラムは正しく動作しています。

発生している問題・エラーメッセージ

ラズパイから送信されたデータが正しく受け取れない Unityのデバッグログに特にエラーは出力されていません

該当のソースコード

Unity側のUDP受信用コード
UDPReceiver.cs

using System.Collections; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using UnityEngine; public class UDPReceiver : MonoBehaviour { public int portNum = 60000; //ポート番号 static UdpClient udpClient; Thread thread; void Start() { udpClient = new UdpClient(portNum); thread = new Thread(new ThreadStart(ThreadProc)); thread.Start(); } void OnApplicationQuit() { thread.Abort(); } private static void ThreadProc() { while (true) { IPEndPoint remoteEP = null; byte[] data = udpClient.Receive(ref remoteEP); string message = Encoding.ASCII.GetString(data); GameManager.Instance.AddUdpMessage(message); } } }

ラズパイのUDP送信コード
UDPSend.py

from socket import # 送信側プログラム # 送信側アドレスの設定 # 送信側IP SrcIP = "192.168.0.118" //ラズパイのIP # 送信側ポート番号 SrcPort = 60000 # 送信側アドレスをtupleに格納 SrcAddr = (SrcIP,SrcPort) # 受信側アドレスの設定 # 受信側IP DstIP = "192.168.0.104" #Unityを用いるPCのIPアドレス、HoloLens2でやるときはHoloLens2のアドレス # 受信側ポート番号 DstPort = 60000 # 受信側アドレスをtupleに格納 DstAddr = (DstIP,DstPort) # ソケット作成 udpClntSock = socket(AF_INET, SOCK_DGRAM) # 送信側アドレスでソケットを設定 udpClntSock.bind(SrcAddr) # 送信データの作成 data = "send data" # バイナリに変換 data = data.encode('utf-8') # 受信側アドレスに送信 udpClntSock.sendto(data,DstAddr)

送受信テストで使用したUDP受信用コード
UDPReceive.py

from socket import * # 受信側プログラム # 受信側アドレスの設定 # 受信側IP SrcIP = "(受信する端末のIPアドレス)" # 受信側ポート番号 SrcPort = 60000 # 受信側アドレスをtupleに格納 SrcAddr = (SrcIP, SrcPort) # バッファサイズ指定 BUFSIZE = 1024 # ソケット作成 udpServSock = socket(AF_INET, SOCK_DGRAM) # 受信側アドレスでソケットを設定 udpServSock.bind(SrcAddr) # While文を使用して常に受信待ちのループを実行 while True: # ソケットにデータを受信した場合の処理 # 受信データを変数に設定 data, addr = udpServSock.recvfrom(BUFSIZE) # 受信データと送信アドレスを出力 print(data.decode(), addr)

試したこと

ラズパイからUDPが送信されているか確認のために、ラズパイ内部での送受信をしてデータが受け取れているか、ラズパイと別のUbuntuPCで送受信ができているか確認を行いましたがデータはちゃんと送受信できていました。
この確認には上記の送受信んの.pyのコードを使用しています。

補足情報(FW/ツールのバージョンなど)

使用環境
Unity2019.4.15
Microsoft HoloLens2
Raspberry pi3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

受信用のコードを下記のものに変更したらHoloLensの方でメッセージが受け取れました。しかし、Unity側でデータを受け取れない原因はわかっていません。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// UnityEvent を利用するため Events を追加
using UnityEngine.Events;

// 引数にByte列を受け取る UnityEvent<T0> の継承クラスを作成する
// UDP受信したバイト列を引数として渡す
// Inspector ビューに表示させるため、Serializable を設定する
[System.Serializable]
public class MyIntEvent : UnityEvent<byte[]>
{
}

public class UDPMessageReceiver : MonoBehaviour
{
/// <summary>
/// UDPメッセージ受信時実行処理
/// </summary>
[SerializeField, Tooltip("UDPメッセージ受信時実行処理")]
private MyIntEvent UDPReceiveEventUnityEvent;

/// <summary> /// UDP受信ポート /// </summary> [SerializeField, Tooltip("UDP受信ポート")] private int UDPReceivePort = 60000; /// <summary> /// UDP受信データ /// </summary> private byte[] p_UDPReceivedData; /// <summary> /// UDP受信イベント検出フラグ /// </summary> private bool p_UDPReceivedFlg; /// <summary> /// 起動時処理 /// </summary> void Start() { // 検出フラグOFF p_UDPReceivedFlg = false; // 初期化処理 UDPClientReceiver_Init(); } /// <summary> /// 定期実行 /// </summary> void Update() { if (p_UDPReceivedFlg) { // UDP受信を検出すればUnityEvent実行 // 受信データを引数として渡す UDPReceiveEventUnityEvent.Invoke(p_UDPReceivedData); // 検出フラグをOFF p_UDPReceivedFlg = false; } } /// <summary> /// UDP受信時処理 /// </summary> private void UDPReceiveEvent(byte[] receiveData) { // 検出フラグONに変更する // UnityEventの実行はMainThreadで行う p_UDPReceivedFlg = true; // 受信データを記録する p_UDPReceivedData = receiveData; } /// <summary> /// UDP受信初期化 /// </summary> private void UDPClientReceiver_Init() { // UDP受信ポートに受信する全てのメッセージを取得する System.Net.IPEndPoint endPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Any, UDPReceivePort); // UDPクライアントインスタンスを初期化 System.Net.Sockets.UdpClient udpClient = new System.Net.Sockets.UdpClient(endPoint); // 非同期のデータ受信を開始する udpClient.BeginReceive(OnReceived, udpClient); } /// <summary> /// UDP受信時コールバック関数 /// </summary> private void OnReceived(System.IAsyncResult a_result) { // ステータスからUdpClientのインスタンスを取得する System.Net.Sockets.UdpClient udpClient = (System.Net.Sockets.UdpClient)a_result.AsyncState; // 受信データをバイト列として取得する System.Net.IPEndPoint endPoint = null; byte[] receiveBytes = udpClient.EndReceive(a_result, ref endPoint); // 受信データを受信時処理に引き渡す UDPReceiveEvent(receiveBytes); // 非同期受信を再開する udpClient.BeginReceive(OnReceived, udpClient); }

}

投稿2021/06/11 12:03

Antlia

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問