私は 3DR Solo UAV を 2 機持っています。ドローンとコントローラーの両方に ARM コンピューターが搭載されており、busybox Linux を実行しています。
私が理解しているところによると、デフォルトではコントローラーはワイヤレス アクセス ポイントとして機能します。SSID は SoloLink です。次の図はデフォルトの設定を示しています。
コントローラーは 2 本のアンテナを備え、画面に「SOLO」と表示されているもので、実際の UAV/ドローンは X 字型のものです。
これはうまく動作し、コントローラ( )に直接ssh接続でき、( )を使用して実際のソロに直接ssh接続できます。ssh [email protected]
ssh [email protected]
3DR の github ページにある Python ユーティリティからコマンドを実行して、github.com/3drobotics/solo-cli/blob/master/soloutils/wifi.py
コントローラに別の WiFi ネットワークに接続するように指示できます (評判のせいでリンクは 2 つしか表示できません)。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 を再構成し、新しい WiFi ネットワークに接続するように wpa_supplicant を構成し、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 ドローンにアクセスできるようにしたいです。コントローラーに 2 つのインターフェイスがあることは理解していますが、それらをブリッジする方法がわかりません。
この目的は、別のペアを同じネットワークに接続しubnt
、1 つの中央ソースから 2 台の UAV を監視/制御し、必要に応じてパイロットがループに参加して制御できるようにすることです。
助けや Google 用語があればありがたいです。私はネットワークの経験があまりなく、ネットワークに関連するコマンドや用語を検索するのに何度も迷い込んでしまいました。
答え1
実は、私の意見を聞きたい友人からこの記事へのリンクをもらったので、ここでもシェアします。
ここでの問題は、ルートが見つからないことです。IP 192.168.1.76
(または任意の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 を持つデバイスを見つけ、トラフィックを直接送信します。
あるサブネットから別のサブネットに移動するには、ルートを定義する必要があります。さらに、戻るルートも定義する必要があります。したがって、次の方法を試すことができます (ルーターと Solo コントローラーがサポートしている場合)。
APにルートが必要です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
) に追加して、問題が解決するかどうかを確認します。