У меня есть два 3DR Solo UAV. Они имеют ARM-компьютеры как в дроне, так и в контроллере, работающие под управлением busybox Linux.
Насколько я понимаю: По умолчанию контроллер работает как беспроводная точка доступа. Имеет SSID:SoloLink. На этой картинке показана настройка по умолчанию:
Контроллер представляет собой штуку с двумя антеннами, на экране которой написано «SOLO», а сам БПЛА/дрон представляет собой штуку в форме буквы X.
Это отлично работает, и я могу напрямую подключиться по ssh к контроллеру ( ) и к самому solo с помощью ( )ssh [email protected]
ssh [email protected]
Я могу запустить команду из утилиты python на странице 3DR на github: github.com/3drobotics/solo-cli/blob/master/soloutils/wifi.py
(извините, из-за своей репутации я могу дать только 2 ссылки), чтобы сообщить контроллеру о необходимости подключения к другой сети WiFi. Я настраиваю Ubiquity PicoStation в качестве маршрутизатора и использую SSID:ubnt. Чтобы подключить контроллер к сети, ubnt
я подключаюсь к SoloLink
сети и запускаю solo wifi --name=ubnt
. По сути, это создает скрипт bash и запускает его:
if [ "$#" -lt "2" ]; then
echo "Usage: `basename $0` timeout_in_seconds command" >&2
echo "Example: `basename $0` 2 sleep 3 || echo timeout" >&2
exit 1
fi
cleanup()
{{
trap - ALRM #reset handler to default
kill -ALRM $a 2>/dev/null #stop timer subshell if running
kill $! 2>/dev/null && #kill last job
exit 124 #exit with 124 if it was running
}}
watchit()
{{
trap "cleanup" ALRM
sleep $1& wait
kill -ALRM $$
}}
watchit $1& a=$! #start the timeout
shift #first param was timeout for sleep
trap "cleanup" ALRM INT #cleanup after timeout
"$@"& wait $!; RET=$? #start the job wait for it and save its return value
kill -ALRM $a #send ALRM signal to watchit
wait $a #wait for watchit to finish cleanup
exit $RET #return the value
SCRIPT
cat > /tmp/setupwifi.sh << 'SCRIPT'
# Delete old files
rm /mnt/rootfs.rw/lib/modules/3.10.17-rt12-*/kernel/net/ipv4/netfilter/iptable_filter.ko || true
/etc/init.d/hostapd stop
killall wpa_supplicant || true
killall udhcpc || true
cat <<EOF > /etc/wpa_client.conf
network={{
{credentials}
}}
EOF
echo 1 > /proc/sys/net/ipv4/ip_forward
sed -i.bak 's/dhcp-option=3.*/dhcp-option=3,10.1.1.1/g' /etc/dnsmasq.conf
sed -i.bak 's/dhcp-option=6.*/dhcp-option=6,8.8.8.8/g' /etc/dnsmasq.conf
/etc/init.d/dnsmasq restart
sleep 2
echo 'connecting to the internet...'
wpa_supplicant -i wlan0 -c /etc/wpa_client.conf -B
/tmp/timeout.sh 15 udhcpc -i wlan0 || {{
echo -e "\\nerror: wrong credentials or couldn't connect to wifi network!\\n"
ifconfig wlan0 down
}}
/etc/init.d/hostapd start
sleep 3
wget -O- http://example.com/ --timeout=5 >/dev/null 2>&1
if [[ $? -ne '0' ]]; then
echo ''
echo 'error: could not connect to the Internet!'
echo 'please check your wifi credentials and try again.'
else
echo 'setting up IP forwarding...'
insmod /lib/modules/3.10.17-rt12-*/kernel/net/ipv4/netfilter/iptable_filter.ko 2>/dev/null
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -A FORWARD -i wlan0 -o wlan0-ap -j ACCEPT
iptables -A FORWARD -i wlan0-ap -o wlan0 -j ACCEPT
echo ''
echo 'success: Solo is now connected to the Internet.'
echo 'if your computer does not yet have Internet access, try'
echo "disconnecting and reconnecting to Solo's wifi network."
fi
SCRIPT
chmod +x /tmp/timeout.sh
chmod +x /tmp/setupwifi.sh
bash /tmp/setupwifi.sh > /log/setupwifi.log 2>&1
(часть {credentials} нужна потому, что этот скрипт находится в большой строке в скрипте Python, и он заменяет эту часть на учетные данные, которые я ему передаю)
Кажется, он включает пересылку, перенастраивает dnsmasq, настраивает wpa_supplicant для подключения к моей новой сети WiFi, запускает wpa_supplicant, а затем перенастраивает iptables для пересылки трафика с интерфейсов wlan0
на wlan0-ap
интерфейсы и наоборот. Последнее if/else
выражение там я изменил так, чтобы оно не делало wget, а просто запускало else
блок.
Это работает нормально, и я могу получить доступ к контроллеру из ubnt
сети. Моя настройка теперь выглядит так:
Я могу нормально подключиться по ssh к контроллеру, но не вижу Solo в сети. Я пробовал с ноутбука, но вижу только маршрутизатор ( ), контроллер ( ) и себя ( ).ssh [email protected]
nmap -sP 192.168.1.1/24
192.168.1.1
192.168.1.6
192.168.1.76
Вот где я застрял
Я хочу иметь возможность доступа к дрону Solo с компьютера. Я понимаю, что на контроллере есть два интерфейса, но я не понимаю, как их соединить.
Цель этого заключается в том, чтобы я мог подключить еще одну пару к той же ubnt
сети, а затем контролировать/управлять двумя БПЛА из одного центрального источника, а пилот может быть в курсе событий и при необходимости взять управление на себя.
Буду признателен за любую помощь или термины Google. У меня нет большого опыта в работе с сетями, и я прошел много кроличьих нор, ища команды и термины, связанные с сетями.
решение1
На самом деле ссылку на эту статью мне дал приятель, который хотел узнать мое мнение. Я поделюсь ею и здесь.
Проблема здесь в отсутствии маршрутов. Чтобы ваш 192.168.1.76
IP (или любой другой 192.168.1.x
IP) добрался до 10.1.1.x
, ему нужно знать дорогу. IP в одной подсети (например, [ 10.1.1.1
и 10.1.1.10
] или [ 192.168.1.76
и 192.168.1.1
]) не нуждаются в маршруте для связи; они используют широковещательную рассылку для поиска устройства с заданным IP и отправляют свой трафик напрямую.
Чтобы перейти из одной подсети в другую, вам нужно определить маршрут. Кроме того, вам нужно определить маршрут BACK. Итак, вы можете попробовать это (если ваш маршрутизатор и контроллер solo поддерживают это):
Вам нужен маршрут в вашей 192.168.1.1
точке доступа. Источник будет любым, пункт назначения будет 10.1.1.0/24
, а следующий переход будет 192.168.1.6
- контроллер Solo. Контроллер знает об обеих сетях, поэтому если вы отправляете трафик, предназначенный для 10.1.1.10
, то Soloдолженуже знаете, как туда добраться, идолженотправьте его дальше. Кроме того, поскольку сам контроллер фактически является сетевым шлюзом для дрона ( 10.1.1.1
), и онтакжезная о 192.168.1.0/24
подсети, что туда не потребуется никакого маршрута - подразумевается обратный маршрут.
Добавьте этот маршрут к вашему маршрутизатору ( any>10.1.1.0/24>192.168.1.6
) и посмотрите, решит ли это проблему.