您的位置:首页 > 移动开发 > Android开发

android 3G pppd 调试记录。

2010-09-27 17:39 435 查看
android 3G pppd 调试记录。

1. J***A 部分

android/development/data/etc/apns-conf_sdk.xml ---> system/etc/apns-conf.xml

注意 apns 的版本,

<apns version="6">

<apn carrier="中国联通 3g 网络 (China Unicom)"

apn="3gnet"

mcc="460"

mnc="01"

proxy=""

port=""

user=""

server=""

password=""

type="default,supl"

/>

</apns>

android/packages/providers/TelephonyProvider/src/com/android/providers/telephony/TelephonyProvider.java

文件中:

public void onCreate(SQLiteDatabase db)

会根据 system/etc/apns-conf.xml 创建

/data/data/com.android.providers.telephony/databases/telephony.db

而pppd 拨号时候需要依赖 telephony 所提供的 apn 等。

2. drvier 部分。

我的 3G 模块是 moto 的 HTM1000, USB 接口。3G 驱动简单点说就是一个 usb 转串口的驱动。

模块提供 2 个 tty 设备, 一个用来发送 AT 指令, 一个用于 pppd 拨号。

3. C 部分。

cd android/hardware/ril/

3.1, 先说说 rild/radiooptions.c

这是一个测试程序,

perror("Usage: radiooptions [option] [extra_socket_args]/n/

0 - RADIO_RESET, /n/

1 - RADIO_OFF, /n/

2 - UNSOL_NETWORK_STATE_CHANGE, /n/

3 - QXDM_ENABLE, /n/

4 - QXDM_DISABLE, /n/

5 - RADIO_ON, /n/

6 apn- SETUP_PDP apn, /n/

7 - DEACTIVE_PDP, /n/

8 number - DIAL_CALL number, /n/

9 - ANSWER_CALL, /n/

10 - END_CALL /n");

}

可以用来测试接打电话等。

选项 6 可以用来测试 pppd 拨号。

3.2 rild/rild.c

如果有权限问题, 可以直接修改 init.rc 直接给 rild root 权限。

main 函数中会读取 /proc/cmdline 中的 android.ril= 来决定 tty设备的名称。

所以不用那么麻烦了, 直接写成自己的设备名称就行了。

arg_overrides[1] = "-d";

arg_overrides[2] = "/dev/ttyMOT1";

3.3 reference-ril/reference-ril.c

拨号流程清参考另一篇文章。

asprintf(&cmd, "AT+CGACT=0,%d", s_defultPDPCid);

err = at_send_command(cmd, NULL);

free(cmd);

asprintf(&cmd, "AT+CGDCONT=%d,/"IP/",/"%s/",,0,0", s_defultPDPCid, apn);

err = at_send_command(cmd, NULL);

free(cmd);

也 就相当于发送: 'AT+CGDCONT=1 “ip", "3gnet", 0,0'

这点很重要,

接下来本来是需要发送 "ATD*99***1#" 可是我的情况很怪异,

用 /dev/ttyMOT0 可以 成功,并且 pppd 也能成功, 但用 /dev/ttyMOT1 就不能成功, 无耐之下。。

只好让 /dev/ttyMOT1 作为 rild 使用的接口。

/dev/ttyMOT0 作为 pppd 的接口,并且 "ATD*99***1#"由 /dev/ttyMOT0 去发送, 无奈之下只好再移植一个 chat .

接下来:

property_set("net.ppp0.status", "0");

asprintf(&cmd, "/system/bin/pppd connect '/system/bin/chat -esvf /system/etc/Talk.chat' user %s password %s /dev/ttyMOT0 115200 crtscts modem novj noipdefault nobsdcomp usepeerdns defaultroute noauth debug nodetach dump &",(username == NULL) ? "any" : username, (password == NULL) ? "any" : password);

err = system(cmd);

LOGD("Launch: %s and ret is: %d!", cmd, err);

free(cmd);

/* wait for system update property */

for(iretry=0; iretry<ppp_retry; iretry++)

{

sleep(2);

property_get("net.ppp0.status", pppstatus, NULL);

LOGD("net.ppp0.status = %s/n", pppstatus);

if(atoi(pppstatus) > 0)

break;

}

由于 pppd 不会立即返回,所以只好 修改 pppd如果连接成功则

property_set("net.ppp0.status", "1");

#cat /system/etc/Talk.chat

ABORT 'BUSY'

ABORT 'NO ANSWER'

ABORT 'ERROR'

TIMEOUT 20

'' 'ATZ'

OK ATDT*99***1#

CONNECT ""

pppd 连接成功以后会 设置网关和 dns 等。



另外, android 默认是打开拨号上网功能的。 但也有一些手机做了个开关。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: