Android pppd_gprs脚本启动过程

来源:互联网 发布:淘宝上买双肩包的店铺 编辑:程序博客网 时间:2024/04/24 14:31

android的gprs的上网过程:

1、在ril层中打开模块对应的数据业务设备,比如/dev/ttyUSB3

2、往数据设备发送AT+CGDCONT命令指定对应apn,发送ATDT*98*1#等拨号指令

3、上述AT指令返回OK之后,就可以启动pppd_gprs脚本了,启动之前,先设置好apn的属性,例如user,pwd,device等

view plain
  1. property_set("net.gprs.user", user);  
  2. property_set("net.gprs.password", pwd);  
  3. property_set("net.gprs.device", device);  
  4. property_set("net.gprs.ppp-exit""");  
  5.   
  6. property_set("ctl.start""pppd_gprs");  
4、属性的设置过程在我的上一篇blog有详细阐述http://blog.csdn.net/yinlijun2004/article/details/6981954

看property_service.c中void handle_property_set_fd(int fd)函数的代码

view plain
  1. switch(msg.cmd) {  
  2. case PROP_MSG_SETPROP:  
  3.     msg.name[PROP_NAME_MAX-1] = 0;  
  4.     msg.value[PROP_VALUE_MAX-1] = 0;  
  5.   
  6.     if(memcmp(msg.name,"ctl.",4) == 0) {  
  7.         if (check_control_perms(msg.value, cr.uid, cr.gid)) {  
  8.             handle_control_message((char*) msg.name + 4, (char*) msg.value);  
  9.         } else {  
  10.             ERROR("sys_prop: Unable to %s service ctl [%s] uid: %d pid:%d\n",  
  11.                     msg.name + 4, msg.value, cr.uid, cr.pid);  
  12.         }  

根据属性的key值"ctl.start"调用到init.c的handle_control_message函数
view plain
  1. void handle_control_message(const char *msg, const char *arg)  
  2. {     
  3.     if (!strcmp(msg,"start")) {  
  4.         msg_start(arg);  
  5.     } else if (!strcmp(msg,"stop")) {  
  6.         msg_stop(arg);  
  7.     }  else {    
  8.         ERROR("unknown control msg '%s'\n", msg);  
  9.     }         
  10. }          

在msg_start中,查找名称为pppd_gprs的服务,这个服务名称其实也是脚本的名称,然后启动改服务,即执行pppd_gprs脚本
view plain
  1. static void msg_start(const char *name)  
  2. {  
  3.     struct service *svc;  
  4.     char *tmp = NULL;  
  5.     char *args = NULL;  
  6.       
  7.     if (!strchr(name, ':'))  
  8.         svc = service_find_by_name(name);  
  9.     else {  
  10.         tmp = strdup(name);  
  11.         args = strchr(tmp, ':');  
  12.         *args = '\0';  
  13.         args++;  
  14.       
  15.         svc = service_find_by_name(tmp);  
  16.     }   
  17.           
  18.     if (svc) {  
  19.         service_start(svc, args);  
  20.     } else {  
  21.         ERROR("no such service '%s'\n", name);  
  22.     }         
  23.     if (tmp)  
  24.         free(tmp);  
  25. }     

5、pppd_gprs服务在初始化脚本init.XX.rc中定义,由parser.c解析到service_list中

view plain
  1. service pppd_gprs /system/xbin/pppd_gprs  
  2.     user root  
  3.     group root  
  4.     oneshot  
  5.     disabled  
6、pppd_gprs脚本读取刚刚已经设置好的apn的属性,执行pppd进程
view plain
  1. USER=`/system/bin/getprop net.gprs.user`  
  2. PASSWORD=`/system/bin/getprop net.gprs.password`  
  3. DEVICE=`/system/bin/getprop net.gprs.device`  
  4. /system/bin/setprop net.gprs.ppp-exit ""  
  5. /system/bin/pppd -detach $DEVICE 115200 noipdefault noauth debug novj usepeerdns noccp ipcp-no-addresses kdebug 4 defaultroute user $USER password $PASSWORD  
  6. /system/bin/setprop net.gprs.ppp-exit $?  
  7. #exit $?  

7、执行pppd_gprs脚本以后,ril层读取/sys/class/net/ppp0/operstate来监控数据网络数据的状态。


转自:http://blog.csdn.net/yinlijun2004/article/details/7007046





原创粉丝点击