Отправка сообщения сокета на разные соединения UDP с одинаковым IP и портом - PullRequest
0 голосов
/ 04 мая 2018

ОС: Ubuntu 16.04

Я пытаюсь создать программу на Python, которая может управлять несколькими дронами Ryze Tello. Это очень простые дроны, которыми можно управлять, подключив к нему компьютер через UDP-порт Wi-Fi и отправляя текстовые команды.

Например, это простая программа, в которой при подключении к сети Wi-Fi беспилотника он просто отправит команду «взлет» дрону.

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto('command', 0, ('192.168.10.1', 8889))
sock.sendto('takeoff', 0, ('192.168.10.1', 8889))

Теперь моя цель - иметь возможность посылать команды нескольким таким дронам одновременно (например, чтобы они выполняли запланированную «танцевальную» процедуру). К моему компьютеру подключено несколько ключей Wi-Fi, каждый из которых подключен к отдельному дрону. Однако проблема в том, что каждый дрон имеет фиксированный IP и порт, как показано выше. Я попытался использовать SSH в дроне, чтобы изменить его IP, но не повезло, и линия поддержки не была уверена, возможно ли это с Tello. Однако, поскольку на моем компьютере соединения по-прежнему обрабатываются по-разному, должен быть способ отдельно отправлять команды дронам. Что касается того, как, я не уверен, следовательно, почему я прошу о помощи.

1 Ответ

0 голосов
/ 05 мая 2018

Создайте отдельный объект socket для каждого дрона, где каждый socket имеет значение bind(), присвоенное локальному IP-адресу определенного адаптера WiFi, к которому подключен дрон. Затем вы можете sendto() команды через каждый socket по мере необходимости. Даже если у всех дронов одинаковые IP и порт, bind гарантирует, что каждая команда будет отправлена ​​по соответствующей сети WiFi на нужный дрон, на который она нацелена.

Примерно так:

import socket

sock1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock1.bind(('WiFi_1_IP', 8889));
sock2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock2.bind(('WiFi_2_IP', 8889));
sock3 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock3.bind(('WiFi_3_IP', 8889));
...

sock1.sendto('command', 0, ('192.168.10.1', 8889))
sock2.sendto('command', 0, ('192.168.10.1', 8889))
sock3.sendto('command', 0, ('192.168.10.1', 8889))
...

sock1.sendto('takeoff', 0, ('192.168.10.1', 8889))
sock2.sendto('takeoff', 0, ('192.168.10.1', 8889))
sock3.sendto('takeoff', 0, ('192.168.10.1', 8889))
...
...