Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1019556
  • 博文数量: 244
  • 博客积分: 6820
  • 博客等级: 准将
  • 技术积分: 3020
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-09 21:33
文章分类

全部博文(244)

文章存档

2013年(1)

2012年(16)

2011年(132)

2010年(3)

2009年(12)

2008年(80)

我的朋友

分类: LINUX

2011-08-30 10:55:25

我还是相信linux系统(包括uclinux)中一定有很合理的掉线检测机制。只是还没有找到,没有配置出来用。项目紧,暂时写了个很笨的网络检测脚本,交差先。再慢慢研究。

方法非常笨,连续尝试启动pppd拨号,如果总失败,则间歇一段时间继续尝试;如果拨上号了就自动启动网络检测,保证长期在线,如果检测到网络不通则自动调用重拨。

网络检测用的方法也非常笨,就间歇对GGSN结点ping几个包,不通则认为掉线,启动重拨。

在uclinux中的msh环境中多次尝试了数学运算,无奈只好写成下面那样的循环控制。正常的方法应该是:

LOOP=0
LOOP='expr $LOOP + 1'

这样控制循环的。但是目标板上的msh环境中好不容易调出expr功能,却不支持命令替换,如'Linux Cmd'或$(Linux Cmd),郁闷死了~~无法使变量在循环体中递增或递减。。。只好用字符串来控制了~

在uclinux文件系统中/home/下放ppp-auto-link脚本

#!/bin/sh
######################################################################
RETRY_TIMES=11111
while [ "$RETRY_TIMES" != "$RETRY_TMP" ]; do
ifconfig ppp0 2> /dev/null
if [ $? -ne 0 ]; then         #if ppp0 is not active
#     echo "**************************************************"
#     echo "PPP0 is not active, cleaning the link stuff now..."
     killall pppd 2> /dev/null
     RETRY_TMP=$RETRY_TMP\1
#     echo "Dialing... $RETRY_TMP"
     pppd nodetach call gprs
#     if [ $? -eq 0 ]; then
#      break
#     fi
else
    break
fi
done

if [ "$RETRY_TIMES" == "$RETRY_TMP" ]; then       #after 3times trying,exit
echo ""
echo "------------------------------------------------------------------"
echo "Cann't establish the PPP link!! Wait for retrying after 10 mins..."
echo "------------------------------------------------------------------"
sleep 600        #wait for 10 miniutes, then try again
exec ./ppp-auto-link
fi

echo ""
echo "+++++++++++++++++++++++++++++++++++++++++++++"
echo "PPP0 has been established!"
sleep 5            #wait for a moment before monitoring
exec ./netmonitor


exit 0

以及netmonitor脚本:

#!/bin/sh
DES_TO_MONITOR=192.168.5.1

echo "------------------"
echo "Net monitoring..."
echo "------------------"
while [ 1 ]; do
# echo "**************************************"
echo "pinging $DES_TO_MONITOR"
ping -c 3 $DES_TO_MONITOR 2> /dev/null
if [ $? -eq 0 ]; then #net OK
   echo "Net OK!"
   sleep 600
else
   echo "try again after 5s ..."
   sleep 5
   ping -c 2 $DES_TO_MONITOR 2> /dev/null
   if [ $? -ne 0 ]; then
    echo "Net error! Now starting redialing..."
    killall pppd 2> /dev/null
    exec ./ppp-auto-link
   else
    continue
   fi
fi
done

 

然后把redhat linux中的/etc/ppp/ip-up和ip-down脚本拷到uclinux的/etc/ppp/下,在uclinux的该目录下写ip-up.local脚本,就一句话:

#!/bin/sh
exec /home/netmonitor

ppp连接成功后将自动检查/etc/ppp/ip-up是否存在,不存在则忽略,存在则执行之。killall pppd后也将检测/etc/ppp/ip-down,有则执行,无则忽略。

板子上电后,启动/home/ppp-auto-link&,就可以确保连接了。试验拔掉GPRS电源,能自动检测和重拨上去。实验用,里面的参数尚要修改,如ping的间歇时间等。

不知这样的检测程序是否会很占系统资源。。

阅读(4676) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~