通过UDP C#发送数据为双浮点数

时间:2016-07-07 00:13:50

标签: c# unity3d udp ip port

大家好,

发布简介我需要帮助转换下面的脚本,通过UDP作为双浮点而不是UTF8发送数据,通过命令'transform.position.x发送数据'在Unity 3D中:)如果您想了解更多信息,请继续阅读。

我的大学硕士项目一直在开发一个赛车模拟器,我已经掌握了所有基础工作,将模拟软件中的车辆位置和旋转数据发送到UDP上的视觉效果,然后在视觉效果中分配输入的数据流对于3D车辆模型的每个位置或旋转矢量。现在,作为一些系统分析的一部分,我正在尝试测量由通信或以低得多的频率运行的可视化软件包导致的任何延迟或延迟。

为了测量这个,我想像正常一样控制视觉环境中的一个对象,然后让另一个单独的脚本获取对象的坐标并将它们直接发送回另一个端口上的模拟软件,这就是我正在使用的脚本麻烦,因为数据需要以双浮点形式发回。

发送和接收UDP脚本最初都来自论坛: https://community.unity.com/t5/Multiplayer-Networking/simple-udp-implementation-send-read-via-mono-c/td-p/154952 我试图修改的UDP发送脚本也显示在下面

目前,在这两个中,只有正在使用接收脚本,当我遇到它时,它已经被修改为接收双浮点数而我正在尝试做的是修改发送脚本以发送一个双浮点数,它们最初都是为了发送和接收UTF8编码文本而编写的。

此外,可视化包是Unity 3D,命令'transform.position.x'是获取对象坐标的那个,所以这将是正在发送的内容,然后我将添加其他位置和旋转我理解了这个方法后的载体。

另外,我应该提一下,我对编码的经验很少,因为这不是我项目的主要部分,但我真的很感激一些帮助,因为我在这方面没有得到任何帮助,现在我已经用完了时间。

非常感谢提前!!

using UnityEngine;
using System.Collections;

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

public class UDPSend : MonoBehaviour {

private static int localPort;

// prefs
private string IP;  // define in init
public int port;  // define in init

// "connection" things
IPEndPoint remoteEndPoint;
UdpClient client;

// gui
string strMessage="";


// call it from shell (as program)
private static void Main()
{
    UDPSend sendObj=new UDPSend();
    sendObj.init();

    // testing via console
    // sendObj.inputFromConsole();

    // as server sending endless
    sendObj.sendEndless(" endless infos \n");

}
// start from unity3d
public void Start()
{
    init();
}

// OnGUI
void OnGUI()
{
    Rect rectObj=new Rect(40,380,200,400);
    GUIStyle style = new GUIStyle();
    style.alignment = TextAnchor.UpperLeft;
    GUI.Box(rectObj,"# UDPSend-Data\n127.0.0.1 "+port+" #\n"
            + "shell> nc -lu 127.0.0.1  "+port+" \n"
            ,style);

    // ------------------------
    // send it
    // ------------------------
    strMessage=GUI.TextField(new Rect(40,420,140,20),strMessage);
    if (GUI.Button(new Rect(190,420,40,20),"send"))
    {
        sendString(strMessage+"\n");
    }      
}

// init
public void init()
{
    // Define end point , from which the messages are sent.
    print("UDPSend.init()");

    // define
    IP="127.0.0.1";
    port=16;

    // ----------------------------
    // Send
    // ----------------------------
    remoteEndPoint = new IPEndPoint(IPAddress.Parse(IP), port);
    client = new UdpClient();

    // status
    print("Sending to "+IP+" : "+port);
    print("Testing: nc -lu "+IP+" : "+port);

}

// inputFromConsole
private void inputFromConsole()
{
    try
    {
        string text;
        do
        {
            text = Console.ReadLine();

            // Send the text to the remote client .
            if (text != "")
            {

                // encode data with the UTF8 encoding to binary .
                byte[] data = Encoding.UTF8.GetBytes(text);

                // Send the text to the remote client .
                client.Send(data, data.Length, remoteEndPoint);
            }
        } while (text != "");
    }
    catch (Exception err)
    {
        print(err.ToString());
    }

}

// sendData
private void sendString(string message)
{
    try
    {
        //if (message != "")
        //{

        // encode data with the UTF8 encoding to binary .
        byte[] data = Encoding.UTF8.GetBytes(message);

        // Send the message to the remote client .
        client.Send(data, data.Length, remoteEndPoint);
        //}
    }
    catch (Exception err)
    {
        print(err.ToString());
    }
}


// endless test
private void sendEndless(string testStr)
{
    do
    {
        sendString(testStr);


    }
    while(true);

}

}

2 个答案:

答案 0 :(得分:2)

感谢您快速给出答案,但我认为这不适用于我的情况,因为模拟软件是基于Modelica的,据我所知,它不适用于UTF8编码,这就是为什么我希望改变它。

然而,在发布之后我有了一个想法并使用Youtube和其他论坛我能够编写一个脚本,将双浮点数转换为整数值并乘以1e6然后发送并接收它们作为整数并且只是划分再次在模拟软件中将它们作为小数点返回。

...然后发现我可以使用该方法将其直接发送为双倍。

我会在这里发布脚本,以防它对任何人都有用:

using UnityEngine;
using System.Collections;

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

public class LatencyTest : MonoBehaviour {

// Use this for initialization
public void Update () {

    // Get coordinates
    double x = transform.position.x;

    // Create byte array for sending
    byte[] coordinates = BitConverter.GetBytes(x);

    // Define IP Address and Port
    string IP = "127.0.0.1";
    int port= 16;
    Socket client;
    IPEndPoint Dymola;

    //Send to IP Address on the port specified above
    Dymola = new IPEndPoint(IPAddress.Parse (IP), port);
    client = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    client.SendTo (coordinates, Dymola);
    //print (coordinates);
}
}

答案 1 :(得分:1)

使用现有的sendString(字符串消息)功能,您可以执行此操作...

sendString(transform.position.x.ToString());

这会将x位置作为UTF8字符串发送,您可以在使用...收到udp消息后将UTF8字符串解析为double。

Double.Parse(string udpMessage);

有关Double.Parse的更多参考,请参阅... https://msdn.microsoft.com/en-us/library/fd84bdyt(v=vs.110).aspx

这可能不是最有效的方法,但应该可以与现有代码一起使用。

编辑:要跟进你如何做到这一点,在一个udp消息中获得整个位置和旋转,你可以做这样的事情......

string message = transform.position.x + "," 
               + transform.position.y + "," 
               + transform.position.z + ","
               + transform.rotation.x + ","
               + transform.rotation.y + ","
               + transform.rotation.z;
sendString(message);

然后在接收方你会这样做......

string[] messageParts = udpMessage.Split(',');
Vector3 position = new Vector3(
                       Double.Parse(messageParts[0]), 
                       Double.Parse(messageParts[1]),
                       Double.Parse(messageParts[2])
                       );
Vector3 rotation = new Vector3(
                       Double.Parse(messageParts[3]), 
                       Double.Parse(messageParts[4]),
                       Double.Parse(messageParts[5])
                       );

等等......祝你好运。