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

更多相关文章

  1. Android之系统给我们提供的常见的Activity
  2. Android不是一个商业成功的产品?
  3. android客户端控制树莓派GPIO点亮LED灯
  4. android程序实现简单拨号器功能
  5. android短信发送
  6. Android之发送短信和接收验证码
  7. Android(安卓)BroadcastReceiver 简介
  8. Android应用的LinearLayout中嵌套RelativeLayout的布局用法
  9. android 短信发送

随机推荐

  1. [置顶] ArcGIS发布最新的 ArcGIS Runtime
  2. Android(安卓)RoboGuice 使用指南(15):In
  3. Android中如何让手机屏幕不待机
  4. android 开源播放器与编码器
  5. 如何编译libcurl
  6. Android(安卓)LCD(一):LCD基本原理篇
  7. Android(安卓)Studio3.1.2使用总结
  8. 配置android开发环境eclipse获取ADT获取
  9. Android(安卓)RecyclerView 多布局与混排
  10. Android圆形的ImageView