Hololens TCP Sockets - Python Client to Hololens Server
Asked Answered
P

1

6

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

Preschool answered 18/7, 2018 at 22:26 Comment(0)
P
2

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

Preschool answered 9/8, 2018 at 19:49 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.