android gprs工作流程,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等

property_set("net.gprs.user", user);

property_set("net.gprs.password", pwd);

property_set("net.gprs.device", device);

property_set("net.gprs.ppp-exit", "");

property_set("ctl.start", "pppd_gprs");4、属性的设置过程在我的上一篇blog有详细阐述http://blog..net/yinlijun2004/article/details/6981954

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

switch(msg.cmd) {

case PROP_MSG_SETPROP:

msg.name[PROP_NAME_MAX-1] = 0;

msg.value[PROP_VALUE_MAX-1] = 0;

if(memcmp(msg.name,"ctl.",4) == 0) {

if (check_control_perms(msg.value, cr.uid, cr.gid)) {

handle_control_message((char*) msg.name + 4, (char*) msg.value);

} else {

ERROR("sys_prop: Unable to %s service ctl [%s] uid: %d pid:%d\n",

msg.name + 4, msg.value, cr.uid, cr.pid);

}

根据属性的key值"ctl.start"调用到init.c的handle_control_message函数

void handle_control_message(const char *msg, const char *arg)

{

if (!strcmp(msg,"start")) {

msg_start(arg);

} else if (!strcmp(msg,"stop")) {

msg_stop(arg);

} else {

ERROR("unknown control msg '%s'\n", msg);

}

}

在msg_start中,查找名称为pppd_gprs的服务,这个服务名称其实也是脚本的名称,然后启动改服务,即执行pppd_gprs脚本

static void msg_start(const char *name)

{

struct service *svc;

char *tmp = NULL;

char *args = NULL;

if (!strchr(name, ':'))

svc = service_find_by_name(name);

else {

tmp = strdup(name);

args = strchr(tmp, ':');

*args = '\0';

args++;

svc = service_find_by_name(tmp);

}

if (svc) {

service_start(svc, args);

} else {

ERROR("no such service '%s'\n", name);

}

if (tmp)

free(tmp);

}

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

service pppd_gprs /system/xbin/pppd_gprs

user root

group root

oneshot

disabled6、pppd_gprs脚本读取刚刚已经设置好的apn的属性,执行pppd进程

USER=`/system/bin/getprop net.gprs.user`

PASSWORD=`/system/bin/getprop net.gprs.password`

DEVICE=`/system/bin/getprop net.gprs.device`

/system/bin/setprop net.gprs.ppp-exit ""

/system/bin/pppd -detach $DEVICE 115200 noipdefault noauth debug novj usepeerdns noccp ipcp-no-addresses kdebug 4 defaultroute user $USER password $PASSWORD

/system/bin/setprop net.gprs.ppp-exit $?

#exit $?

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值