我有兩架 3DR Solo 無人機。他們在無人機和控制器中都配備了 ARM 計算機,運行 busybox Linux。
據我了解:預設情況下,控制器充當無線接入點。它具有 SSID:SoloLink。此圖顯示了預設設定:
控制器是帶有兩個天線的東西,螢幕上顯示“SOLO”,而實際的無人機/無人機是 X 形的東西。
這工作正常,我可以直接 ssh 進入控制器 ( ) 並使用 ( )進入實際的獨奏ssh [email protected]
ssh [email protected]
我可以從 3DR 的 github 頁面上的 python 實用程式執行命令:(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
網絡,然後我可以從一個中央源監視/控制兩架無人機,並且飛行員可以在需要時在環路中進行控制。
任何幫助或谷歌條款將不勝感激。我在網路方面沒有太多經驗,我一直在尋找與網路相關的命令和術語。
答案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 路線。所以,你可以嘗試這個(如果你的路由器和獨奏控制器支援它):
您的192.168.1.1
AP 中需要一條路由。來源可以是任意,目標可以是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
) 並查看是否可以解決問題。