之前在淘宝网上买了3G的无线上网数据卡,USB接口的,分别是移动和电信的,刚买来的时候是可以拨号上网的,过了几个月后就不能拨号上网了,不知道是不是移动或者电信有什么限制;然后又在网上买来sim900a gprs模块进行测试,通过usb转串口芯片cp2102调试gprs模块sim900a的时候,发现拨号到一半的时候,系统就重启了,经过多次测试终于解决了,原来时ppp拨号的时候导致一个喂狗线程没有能够喂狗,从而导致系统复位,把看门狗关闭后就可以正常拨号了,后续进一步分析这个原因并解决它(也可能是gprs模块拨号的时候电流过大将3.3v电压拉跨导致核心板服务,因为3.3v电压输出部分没有加大的储能电容)。
同时还做了下面的调整:
1、设置DNS地址
/etc/ppp 下会由拔号自动产生resolv.conf 文件, 但它和 /etc/resolv.conf 并不是同一个文件,所以有的时候不能解析DNS。一个好办法是,首先保证存在/etc/resolv.conf, 然后在/etc/ppp下创建软链接ln -s /etc/ppp/resolv.conf /etc/resolv.conf这样在拔号成功后,在/etc/resolv.conf中会有类似以下内容:
nameserver 218.201.96.130
nameserver 211.137.191.26
2、关于Linux使用pppd拨号,自动断网,重新拨号功能
脚本如下:auto_pppd.sh
#!/bin/sh
while true;do
ping -w1 news.sina.com.cn >/dev/null 2>&1 || ( killall pppd; date; pppd call ls-gprs &)
sleep 20 #每20秒检测一次
done
可以放在开机脚本
auto_pppd.sh
#!/bin/sh
#扩展
#
dns1="211.95.193.97"
dns2="211.136.20.203"
sleep 8
/bin/pppd call gprs-siem &
sleep 12
while true
do
ping -s 1 -c 1 $dns1 ……去PING第一个DNS
if [ "$?" != "0" ] ……假如PING不通
then
ping -s 1 -c 2 $dns2 ……去PING第二个DNS
if [ "$?" != "0" ] ……假如PING不通
then
killall pppd ……结束PPPD进程
pppd call gprs-siem & ……再去拨号
sleep 12 ……等待12秒
else
sleep 5 ……如果是PING DNS2通的话就直接等待5秒
fi
else
sleep 5 ……如果是PING DNS1通的话就直接等待5秒(一般要设置多长时间去PING请改这里)
fi
done
代码简明!!它相当于在后台时时去PING一个DNS发现真正地掉线,它才会去重新拨号!!此版本经测试通过才发表。
3、这里使用Unix网络编程里面的一个小程序,该客户端建立一个到服务器的TCP连接,然后读取由服务器以直观可读格式简单地送回的当前时间和日期,在程序里面分析时间服务器返回的数据格式,提取出uts时间格式,然后用c语言调用shell命令date -s设置linux系统时间。
代码如下:
#include "unp.h"
int main(int argc, char **argv)
{
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
if (argc != 2)
err_quit("usage: a.out <IPaddress>");
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error");
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(13); /* daytime server */
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
err_quit("inet_pton error for %s", argv[1]);
if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
err_sys("connect error");
while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
recvline[n] = 0; /* null terminate */
if (fputs(recvline, stdout) == EOF)
err_sys("fputs error");
}
if (n < 0)
err_sys("read error");
exit(0);
}
如何在c程序中取得shell脚本中一个变量的值?(准备在c程序中去获取pppd拨号脚本中一个变量,然后在c程序中进行tcp重新连接)
1。将变量的值写到文件中,然后在c中去读。
2。将该变量export出来,在c中用getenv去读。
3。或者也可以考虑使用命名管道。