天天看點

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);

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