Android pppd_gprs脚本启动过程

android的gprs的上网过程:

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

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

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

  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. 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)函数的代码

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

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

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

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

  1. servicepppd_gprs/system/xbin/pppd_gprs
  2. userroot
  3. grouproot
  4. oneshot
  5. disabled
6、pppd_gprs脚本读取刚刚已经设置好的apn的属性,执行pppd进程
  1. USER=`/system/bin/getpropnet.gprs.user`
  2. PASSWORD=`/system/bin/getpropnet.gprs.password`
  3. DEVICE=`/system/bin/getpropnet.gprs.device`
  4. /system/bin/setpropnet.gprs.ppp-exit""
  5. /system/bin/pppd-detach$DEVICE115200noipdefaultnoauthdebugnovjusepeerdnsnoccpipcp-no-addresseskdebug4defaultrouteuser$USERpassword$PASSWORD
  6. /system/bin/setpropnet.gprs.ppp-exit$?
  7. #exit$?

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


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





android的gprs的上网过程:

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

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

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

  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. 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)函数的代码

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

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

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

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

  1. servicepppd_gprs/system/xbin/pppd_gprs
  2. userroot
  3. grouproot
  4. oneshot
  5. disabled
6、pppd_gprs脚本读取刚刚已经设置好的apn的属性,执行pppd进程
  1. USER=`/system/bin/getpropnet.gprs.user`
  2. PASSWORD=`/system/bin/getpropnet.gprs.password`
  3. DEVICE=`/system/bin/getpropnet.gprs.device`
  4. /system/bin/setpropnet.gprs.ppp-exit""
  5. /system/bin/pppd-detach$DEVICE115200noipdefaultnoauthdebugnovjusepeerdnsnoccpipcp-no-addresseskdebug4defaultrouteuser$USERpassword$PASSWORD
  6. /system/bin/setpropnet.gprs.ppp-exit$?
  7. #exit$?

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


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




你可能感兴趣的:(android)