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);
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 預設是打開撥号上網功能的。 但也有一些手機做了個開關。