我有两架 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
) 并查看是否可以解决问题。