私は、イーサネット ポート、USB WiFi モジュール、および 3G モジュールを備えた組み込み ARM9 開発ボードを引き継ぎました。つまり、3 つの方法すべてでインターネットにアクセスできます。一般的に使用される方法は、イーサネットと 3G の 2 つで、イーサネット インターネット アクセス方法はさらに多くの方法があります。安定していますが、3G ダイヤルアップ方式は 1 日中も成功しないことがあります。いくつかのブログを読み、その経験に基づいて次の方法を提案しました。
1. eth0を閉じる
ifconfig eth0 down
2. ダイヤルする前にデフォルトルートを削除します。
route del default
3. デフォルト ルートを削除し、ppp0 をデフォルト ルートとして設定します。
route del default
route add default dev ppp0
上記の方法はテストおよび検証されています。最も信頼できる方法は最初の方法ですが、最良の公式は、無限ループの定期チェックをスクリプトに記述することです。インターネットにアクセスできないことが検出されたら、まず pppd をシャットダウンします。プロセスを実行してから 3G モジュールを再起動し、最後に pppd プロセスを再度開始します。
以下は参考スキームです
while true
do
# whatever eth or wlan or ppp
ping -s 1 -c 1 $server > /dev/null
if [ "$?" != "0" ]
then
#echo "OFF TIME is `date +%Y-%m-%d,%H:%M:%S`" >> /path/offinfo
killall pppd
# function for restart 3g module
restart_3gmodule
sleep 15s
# function for start pppd,shut eth0 down here
pppd_call
fi
sleep 300s
done
現在のトラッキング現象によると、原因は依然としてルーティング (カーネル バージョン linux-3.10.x、ppp2.4.7) にある可能性があります。明確な兄弟がいる場合は、コメント エリアでお知らせください。非常に感謝します。 !
次のように、デフォルト ルートを削除するいくつかの操作を含む、動的ネットワーク自動切り替え用のスクリプト ソリューションを提供します。
#!/bin/sh
#check the wired and wireless network reachable
wired=eth0
#wired=wlan0
wireless=ppp0
needRetryTimes=10
needRestartUdhcpc=0
flag=0
while true; do
Gateway=`route|grep 'default'|grep $wired|awk '{print $2}'`
if [ "$Gateway" != "*" ] && [ -n "$Gateway" ]; then
ping -s1 -w1 $Gateway > /dev/null
else
sleep 2s
continue
fi
if [ "$?" != "0" ]; then
let flag++
if [ $flag -lt $needRetryTimes ]; then
echo "we will retry once.." > /dev/null
continue
fi
flag=0
#if wired if default,delete it
if [ -n "`route|grep 'default'|grep $wired`" ];then
echo "route del default $wired" > /dev/null
route del default $wired
fi
if [ $needRestartUdhcpc -eq 1 ]; then
echo "$wired not reachable,so only restart udhcpc once" > /dev/null
kill -9 `ps|grep 'udhcpc'|grep -v grep|awk '{print $1}'`
sleep 1s
/sbin/udhcpc -i $wired -F ZigbeeLinuxGateway -b > /dev/null &
sleep 2s
needRestartUdhcpc=0
fi
#if wireless is not default,add it
if [ -z "`route|grep 'default'|grep $wireless`" ];then
echo "route add default $wireless" > /dev/null
route add default $wireless
fi
echo "wait 2s and retry" > /dev/null
sleep 2s
else
sleep 2s
needRestartUdhcpc=1
fi
done
いくつかの参考記事を添付します。
pppのLinux移植とppp0_tietaoのルーティング設定 - CSDN blog_linux ppp0
Linux pppd-GPRS とイーサネットが同時にオンラインになり、ダイヤルアップのデフォルト ゲートウェイを解決する_chenliang0224 のコラム - CSDN ブログ