android 3G pppd 调试记录。
1. JAVA 部分
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 默认是打开拨号上网功能的。 但也有一些手机做了个开关。