android 3G pppd 调试记录。

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 默认是打开拨号上网功能的。 但也有一些手机做了个开关。


你可能感兴趣的:(android 3G pppd 调试记录。)