C # UDP сообщения от ПЛК не могут быть получены в Unity3D, но видны в Wireshark - PullRequest
0 голосов
/ 22 мая 2018

У меня есть ПЛК, напрямую подключенный через кабель Ethernet к ноутбуку Win10, работающему под управлением Unity3d.Моя цель - отправлять данные из ПЛК в модель Unity с использованием соединения UDP.

В настоящее время ПЛК отправляет сообщения каждую секунду, и они видны в Wireshark.

Половина Unity имеетReceive-Thread работает.Может принимать через локальное IP-соединение 127.0.0.1.У меня также есть отправитель, реализованный в Unity для проверки этого, и он работает как положено.

Что не работает, так это получение сообщений от ПЛК, направленных на тот же порт, что и внутреннее соединение.

Пока что я ...

  • ... установил порт Ethernet на статический 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());
            }
        }
    }
}

Что, я думаю, могло быбыть проблема:

  • Существует еще один уровень, который может заблокировать соединение рядом с брандмауэром, который я еще не рассматривал
  • Настройка клиента должна отличаться для получения сообщений от внешнихsources.
  • Требуется асинхронный UDP-клиент

Код (приема) основан на: Простая реализация UDP .

Дополнительный вопрос, поскольку я совсем новичок в сети: если Wireshark может видеть пакет, не должен ли он уже пройти через брандмауэр и другие возможные уровни блокировки?Или Wireshark смотрит на еще более низкий уровень связи?

Заранее спасибо!

Скриншоты из Wireshark: Несколько входящих сообщений Подробности одного сообщения

1 Ответ

0 голосов
/ 05 июня 2018

Итак, после очень разочаровывающего путешествия я нашел обходной путь, который нехорошо, но выполняет свою работу:

Я написал скрипт на 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, работает ли ваш сокет.
  • Для завершения: Проверьтенастройки брандмауэра.

Спасибо Тревору и Программисту за помощь.

...