3DR Solo Drone WiFi-связь

3DR Solo Drone WiFi-связь

У меня есть два 3DR Solo UAV. Они имеют ARM-компьютеры как в дроне, так и в контроллере, работающие под управлением busybox Linux.

Насколько я понимаю: По умолчанию контроллер работает как беспроводная точка доступа. Имеет SSID:SoloLink. На этой картинке показана настройка по умолчанию: Стандартная настройка Solo

Контроллер представляет собой штуку с двумя антеннами, на экране которой написано «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сети. Моя настройка теперь выглядит так: Настройка Solo с маршрутизатором Я могу нормально подключиться по ssh к контроллеру, но не вижу Solo в сети. Я пробовал с ноутбука, но вижу только маршрутизатор ( ), контроллер ( ) и себя ( ).ssh [email protected]nmap -sP 192.168.1.1/24192.168.1.1192.168.1.6192.168.1.76

Вот где я застрял

Я хочу иметь возможность доступа к дрону Solo с компьютера. Я понимаю, что на контроллере есть два интерфейса, но я не понимаю, как их соединить.

Цель этого заключается в том, чтобы я мог подключить еще одну пару к той же ubntсети, а затем контролировать/управлять двумя БПЛА из одного центрального источника, а пилот может быть в курсе событий и при необходимости взять управление на себя.

Буду признателен за любую помощь или термины Google. У меня нет большого опыта в работе с сетями, и я прошел много кроличьих нор, ища команды и термины, связанные с сетями.

решение1

На самом деле ссылку на эту статью мне дал приятель, который хотел узнать мое мнение. Я поделюсь ею и здесь.

Проблема здесь в отсутствии маршрутов. Чтобы ваш 192.168.1.76IP (или любой другой 192.168.1.xIP) добрался до 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) и посмотрите, решит ли это проблему.

Связанный контент