来自PLC的C#UDP消息无法在Unity3D中接收,但在Wireshark

时间:2018-05-22 14:41:54

标签: c# sockets unity3d udp wireshark

我有一台PLC通过以太网电缆直接连接到运行Unity3d的Win10笔记本电脑。我的目标是使用UDP连接将数据从PLC发送到Unity模型。

目前,PLC每秒发送一次消息,并且在Wireshark中可见。

Unity半部分正在运行接收线程。它能够通过本地127.0.0.1 IP连接接收。我还有一个在Unity中实现的发送器来测试它并且它按预期工作。

什么不起作用,是从PLC接收指向与内部连接相同的端口的消息。

到目前为止我......

  • ...将以太网端口设置为静态IP(192.168.0.41)
  • ...打开防火墙中UDP通信的端口,这应该不是问题。
  • ...更改了接收端口(当前设置为8052)
  • ...尝试了客户端设置的各种变化,没有任何改变。
  • ...通过不同的主题和评论部分进行研究和挖掘,但没有成功。虽然我发现其他人遇到了同样的问题,但没人发布答案。

Unity3d C#接收代码(缩写为相关部分):

private void init()
{
   port = 8052;

        receiveThread = new Thread( new ThreadStart(ReceiveData));
        receiveThread.IsBackground = true;
        receiveThread.Start();
    }

    private void ReceiveData()
    {
        // create a client
        client = new UdpClient(port);
        while (true)
        {
            // if an Error occours the program doesn't crash
            try
            {
                // Create connection point and receiving client + receiving bytes
                IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, port);
                byte[] data = client.Receive(ref anyIP);

                print("Number of bytes: " + data.Length.ToString());

                /*
                 * use the received data
                 */

            }
            catch (Exception err)
            {
                //Output if receiving experienced an error
                print(err.ToString());
            }
        }
    }
}

我认为可能是问题所在:

  • 还有另一层可以阻止我未考虑的防火墙旁边的连接
  • 客户端设置需要与接收来自外部源的消息不同。
  • 需要异步UDP客户端

(接收)代码基于: Simple UDP implementation

另外一个问题,因为我对网络很陌生:如果Wireshark可以看到该软件包,那么它是否已经超过了防火墙和其他可能的阻塞层?或者Wireshark在更低的通信层上寻找什么?

提前谢谢!

Wireshark截图: Multiple incoming messages Details of one message

1 个答案:

答案 0 :(得分:0)

因此,在经历了一次非常令人沮丧的旅程之后,我发现了一个不太好的解决办法,但是完成了工作:

我编写了一个python脚本,它打开一个套接字,接收外部数据并通过本地IP转发给Unity。这很有效。

以下是代码:

# Import libraies
import socket
import time

# Set send IP adress and port
UDP_IP = "127.0.0.1"
UDP_PORT_Rec = 8052
UDP_PORT_Unity = 8055

print("Receiving on Port:" + str(UDP_PORT_Rec))
print("Sending to IP:" + UDP_IP + ":" + str(UDP_PORT_Unity))

# Set socket to send udp messages and bind port
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.bind(('',UDP_PORT_Rec));

## Keep sending message from file location
while True:
    data, addr = sock.recvfrom(1024) #buffer size, hopefully no problem if too big
    print("Received")

    sock.sendto(data, (UDP_IP, UDP_PORT_Unity))
    print("Send")

对您的问题解决有用的工具:

  • 安装Wireshark!它可能是跟踪互联网流量的最佳工具。对于普通应用程序,Wireshark中可见的包可能不可见!
  • 使用Packet Sender生成和接收流量。该应用程序使用基本方法来接收包 - 如果可以,那么您的程序也应该能够。
  • 如果您的套接字正在运行,请与netstat -aon核对。
  • 完成:检查防火墙设置。

感谢Trevor和Programmer的帮助。