我有一台PLC通过以太网电缆直接连接到运行Unity3d的Win10笔记本电脑。我的目标是使用UDP连接将数据从PLC发送到Unity模型。
目前,PLC每秒发送一次消息,并且在Wireshark中可见。
Unity半部分正在运行接收线程。它能够通过本地127.0.0.1 IP连接接收。我还有一个在Unity中实现的发送器来测试它并且它按预期工作。
什么不起作用,是从PLC接收指向与内部连接相同的端口的消息。
到目前为止我......
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());
}
}
}
}
我认为可能是问题所在:
(接收)代码基于: Simple UDP implementation
另外一个问题,因为我对网络很陌生:如果Wireshark可以看到该软件包,那么它是否已经超过了防火墙和其他可能的阻塞层?或者Wireshark在更低的通信层上寻找什么?
提前谢谢!
Wireshark截图: Multiple incoming messages Details of one message
答案 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")
对您的问题解决有用的工具:
netstat -aon
核对。感谢Trevor和Programmer的帮助。