android 3G pppd 调试记录。

1.  JAVA 部分
android/development/data/etc/apns-conf_sdk.xml   --->  system/etc/apns-conf.xml
注意 apns 的版本,

      apn="3gnet"
      mcc="460"
      mnc="01"
      proxy=""
      port=""
      user=""
      server=""
      password=""
      type="default,supl"
 />


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

更多相关文章

  1. Android获取设备信息
  2. ANDROID 单元测试
  3. Android 9.0 Launcher源码分析(三)——Launcher的布局与多设备适配
  4. Android下单元测试
  5. Android 单元测试链接整理
  6. 如何进行Android单元测试
  7. Android接口定义语言(AIDL)

随机推荐

  1. 通过Android Studio查看SDK源码
  2. 转帖并消化:Android中一种使用AttributeS
  3. AlterDialog详细讲解
  4. Android中Activity界面展示与跳转及数据
  5. Android Intent (2) Serializable vs Par
  6. push研究——Apache Mina探索初步
  7. Could not find *****/adb.exe!的解决方
  8. 解决Android Studio连不上Android设备真
  9. 诺基亚推出Android平板N1和Z Launcher
  10. Android(安卓)动画