问题
After a couple weeks of frustration I was finally able to send a string from a Python client to a Hololens server. The code is below and runs perfectly. However, I was wondering if someone experienced with sockets could help me modify this code to send an openCV webcam frame (so basically just send an image) from Python to the Hololens. I've been trying but the image data does not seem to be received in the C# script.
Thank you so much.
Hololens Server Code:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
#if !UNITY_EDITOR
using Windows.Networking;
using Windows.Networking.Sockets;
using Windows.Storage.Streams;
#endif
//Able to act as a reciever
public class UniversalSampleTutorial : MonoBehaviour
{
public String _input = "Waiting";
#if !UNITY_EDITOR
StreamSocket socket;
StreamSocketListener listener;
String port;
String message;
#endif
// Use this for initialization
void Start()
{
#if !UNITY_EDITOR
listener = new StreamSocketListener();
port = "9090";
listener.ConnectionReceived += Listener_ConnectionReceived;
listener.Control.KeepAlive = false;
Listener_Start();
#endif
}
#if !UNITY_EDITOR
private async void Listener_Start()
{
Debug.Log("Listener started");
try
{
await listener.BindServiceNameAsync(port);
}
catch (Exception e)
{
Debug.Log("Error: " + e.Message);
}
Debug.Log("Listening");
}
private async void Listener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
{
Debug.Log("Connection received");
try
{
while (true) {
using (var dw = new DataWriter(args.Socket.OutputStream))
{
dw.WriteString("Hello There");
await dw.StoreAsync();
dw.DetachStream();
}
using (var dr = new DataReader(args.Socket.InputStream))
{
dr.InputStreamOptions = InputStreamOptions.Partial;
await dr.LoadAsync(12);
var input = dr.ReadString(12);
Debug.Log("received: " + input);
_input = input;
}
}
}
catch (Exception e)
{
Debug.Log("disconnected!!!!!!!! " + e);
}
}
#endif
void Update()
{
this.GetComponent<TextMesh>().text = _input;
}
}
Python Client (need to send image from here instead of string)
import asyncio
#THIS CODE WORKS SENDING STRING MESSAGE TO HOLOLENS
async def tcp_echo_client(message, loop):
reader, writer = await asyncio.open_connection('192.168.1.110', 9090, loop=loop)
print('Send: %r' % message)
writer.write(message.encode())
data = await reader.read(100)
print('Received: %r' % data.decode())
print('Close the socket')
writer.close()
message = 'hello there frend'
loop = asyncio.get_event_loop()
loop.run_until_complete(tcp_echo_client(message, loop))
loop.close()
EDIT: Here is the image code I have been working on. It doesn't work yet, I'm unsure if I'm receiving the byte array correctly: https://gist.github.com/jryebread/3961e890375fcc8a64c8ac3d279ec9fa
回答1:
I have figured out how to send the image. I ended up sending the date from the python client as a string base64 encoded and decoded the string on the hololens server script.
https://gist.github.com/jryebread/2bdf148313f40781f1f36d38ada85d47
来源:https://stackoverflow.com/questions/51411832/hololens-tcp-sockets-python-client-to-hololens-server