Eu tenho dois UAVs 3DR Solo. Eles têm computadores ARM no drone e no controlador rodando o busybox Linux.
Pelo que entendi: por padrão, o controlador atua como um ponto de acesso sem fio. Possui o SSID:SoloLink. Esta imagem mostra a configuração padrão:
O controlador é aquele com duas antenas e diz "SOLO" na tela e o UAV / drone real tem o formato de X.
Isso funciona bem e posso fazer ssh diretamente no controlador ( ) e no solo real com ( )ssh [email protected]
ssh [email protected]
Posso executar um comando de um utilitário python na página do github do 3DR: github.com/3drobotics/solo-cli/blob/master/soloutils/wifi.py
(desculpe, só posso ter 2 links por causa da minha reputação) para informar ao controlador para se conectar a outra rede WiFi. Configurei um Ubiquity PicoStation para funcionar como roteador e ter o SSID:ubnt. Para conectar o controlador à ubnt
rede eu me conecto à SoloLink
rede e executo o solo wifi --name=ubnt
. O que isso basicamente faz é criar um script bash e executá-lo:
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
(a parte {credenciais} é porque este script está em uma string grande em um script python e substitui essa parte pelas credenciais que eu passo)
Parece habilitar o encaminhamento, reconfigurar o dnsmasq, configurar o wpa_supplicant para conectar-se à minha nova rede WiFi, iniciar o wpa_supplicant e, em seguida, reconfigurar o iptables para encaminhar o tráfego para wlan0
as wlan0-ap
interfaces e vice-versa. A última if/else
instrução lá eu modifiquei para que ela não fizesse o wget e apenas executasse o else
bloco.
Isso funciona bem e posso acessar o controlador pela ubnt
rede. Minha configuração agora se parece com:
Posso fazer ssh para o controlador perfeitamente, mas não vejo o Solo na rede. Tentei no laptop e só vejo o roteador ( ), o controlador ( ) e eu ( ).ssh [email protected]
nmap -sP 192.168.1.1/24
192.168.1.1
192.168.1.6
192.168.1.76
É aqui que estou preso
Quero poder acessar o drone Solo pelo computador. Entendo que existem duas interfaces no controlador, mas não entendo como conectá-las.
O objetivo disso é que eu possa conectar outro par à mesma ubnt
rede e então monitorar/controlar dois UAVs a partir de uma fonte central e um piloto possa estar no circuito para assumir o controle, se necessário.
Qualquer ajuda ou termos do Google serão apreciados. Não tenho muita experiência com redes e já passei por muitas tocas de coelho pesquisando comandos e termos associados a redes.
Responder1
Na verdade, fui vinculado a este artigo por um amigo que queria minha opinião - vou compartilhá-la aqui também.
O problema aqui é a falta de rotas. Para que o seu 192.168.1.76
IP (ou qualquer 192.168.1.x
IP) chegue 10.1.1.x
, ele precisa saber o caminho. IPs na mesma sub-rede (por exemplo, [ 10.1.1.1
e 10.1.1.10
] ou [ 192.168.1.76
e 192.168.1.1
]) não precisam de uma rota para se comunicar; eles usam um broadcast para encontrar o dispositivo com um determinado IP e enviar seu tráfego diretamente.
Para ir de uma sub-rede para outra sub-rede, é necessário definir uma rota. Além disso, você deve definir uma rota de volta. Então, você pode tentar isso (se o seu roteador e o controlador solo suportarem):
Você precisa de uma rota no seu 192.168.1.1
AP. A origem seria qualquer, o destino seria 10.1.1.0/24
e o próximo salto seria 192.168.1.6
- o controlador Solo. O controlador está ciente de ambas as redes, portanto, se você enviar tráfego destinado a 10.1.1.10
, o Solodevejá sabe como chegar lá edeveenvie junto. Além disso, porque o próprio controlador é, efetivamente, o gateway de rede para o drone ( 10.1.1.1
), e étambémciente da 192.168.1.0/24
sub-rede, que nenhuma rota seria necessária lá - a rota de volta está implícita.
Adicione essa rota ao seu roteador ( any>10.1.1.0/24>192.168.1.6
) e veja se isso resolve o problema.