android下除錯3G之自動撥號
本章簡單講述下android實現自動撥號的功能,該功能利用了系統啟動的rild的服務來實現,因為rild的服務是殺不死的,所以利用這一點,可以使撥號失敗或網路斷掉後自動重撥,來增強上網的可靠性。這裡只實現撥號功能,把ril庫實現的一些功能都去掉了。
一、修改rild程式原始碼
把 .../hardware/ril裡面的檔案全部刪掉,建立rild資料夾,把以下面程式碼放到新建的資料夾下。
1、rild.c
#define LOG_TAG "RILD" #include <unistd.h> #include <pthread.h> #include <utils/Log.h> #include <sys/types.h> #include <sys/stat.h> #include "ril_fun.h" int main(int argc, char *argv[]) { int opt; int err; pthread_t tid; char buf[PROPERTY_VALUE_MAX]; static int device_fd; static char * device_path = NULL; umask(S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH); while ( -1 != (opt = getopt(argc, argv, "d:"))) {//用來分析main函式傳遞的命令列引數 switch (opt) { case 'd': device_path = optarg; ALOGD("Opening tty device %s\n", device_path); break; default: ALOGD("Not tty device"); goto done; } } device_fd = device_open(device_path);//開啟裝置節點 device_init(device_fd);//初始化裝置節點 property_set("ctl.stop", PPPD_SERVICE_NAME);//設定pppd_gprs屬性為停止 request_setup_datacall(device_fd);//繼續執行撥號 pthread_create(&tid,NULL,ip_detection,(void *)device_fd);//建立查詢IP執行緒,使斷網後重新撥號 done: while(1){ sleep(0x00ffffff); } return 0; }
2、ril_fun.c
#define LOG_TAG "RIL" #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <termios.h> #include <sys/select.h> #include "ril_fun.h" #define PPPD_EXIT_CODE "net.gprs.ppp-exit" #define PPP_NET_LOCAL_IP "net.ppp0.local-ip" #define PPP_SYSFS_RETRY 5 #define PPP_OPERSTATE_PATH "/sys/class/net/ppp0/operstate" static int pppd_started = 0; int device_open(char *device_path) { int device_fd = -1; while (device_fd < 0) { if (device_path != NULL) { device_fd = open (device_path, O_RDWR);//開啟串列埠AT模組的裝置 } if (device_fd < 0) { ALOGD ("opening AT interface. retrying..."); sleep(3); } } return device_fd; } void device_init(int device_fd) { struct termios options; tcgetattr(device_fd, &options);//獲取串列埠屬性 cfsetispeed(&options, B115200);//設定接收波特率 cfsetospeed(&options, B115200);//設定傳送波特率 options.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|IGNCR|ICRNL|IXON); options.c_cflag &= ~PARENB; //無奇偶校驗位 options.c_cflag &= ~CSTOPB; //停止位為1位 options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; //資料位為8位 options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); tcsetattr(device_fd,TCSANOW,&options); } int at_send_command(int device_fd, char *cmd) { int ret; ret = write(device_fd, cmd, strlen(cmd)); return ret; } void request_setup_datacall(int device_fd) { const char *apn = "cmnet"; char *cmd = NULL; int err; ALOGD("requesting data connection to APN '%s'", apn); if(pppd_started) { ALOGD("Stop existing PPPd before activating PDP"); property_set("ctl.stop", PPPD_SERVICE_NAME);//設定pppd_gprs屬性為停止 pppd_started = 0; } err = at_send_command(device_fd, "at$qcpdplt=0"); asprintf(&cmd, "AT+CGDCONT=1,\"IP\",\"%s\",,0,0", apn);//設定PDP上下文 err = at_send_command(device_fd, cmd); free(cmd); if (err < 0 ) { ALOGD("AT Send Command error!"); } err = property_set(PPPD_EXIT_CODE, "");//設定net.gprs.ppp-exit為空 if (err < 0) { ALOGW("Set PPPD_EXIT_CODE failed!"); goto ppp_error; } err = property_set(PPP_NET_LOCAL_IP, "");//設定net.ppp0.local-ip為空 if (err < 0) { ALOGW("Set PPPD_NET_LOCAL_IP failed!"); goto ppp_error; } err = property_set("ctl.start", PPPD_SERVICE_NAME);//設定pppd_gprs屬性為啟動 pppd_started = 1; if (err < 0) { ALOGW("Can not start PPPd"); goto ppp_error; } ALOGD("PPPd started"); return; ppp_error: at_send_command(device_fd, "AT+CGACT=0,1");//PDP上下文去啟用 if(pppd_started) { property_set("ctl.stop", PPPD_SERVICE_NAME); pppd_started = 0; } } void *ip_detection(void *arg) { int fd; int err; int device_fd = (int)arg; char buffer[20]; char exit_code[PROPERTY_VALUE_MAX]; static char local_ip[PROPERTY_VALUE_MAX]; static int pppd_started = 0; sleep(2); while(1){ property_get(PPPD_EXIT_CODE, exit_code, "");//獲取pppd的退出狀態 if(strcmp(exit_code, "") != 0) {//檢測pppd是否異常退出 ALOGW("PPPd exit with code %s", exit_code); request_setup_datacall(device_fd);//繼續執行撥號 goto done; } fd = open(PPP_OPERSTATE_PATH, O_RDONLY);//讀取/sys/class/net/ppp0/operstate來監控資料網路資料的狀態 if (fd >= 0) { buffer[0] = 0; read(fd, buffer, sizeof(buffer)); close(fd); ALOGW("buffer = %s", buffer); if(!strncmp(buffer, "up", strlen("up")) || !strncmp(buffer, "unknown", strlen("unknown"))) { memset(local_ip,'\0',sizeof(local_ip)); err = property_get(PPP_NET_LOCAL_IP, local_ip, "");//獲取IP if (err < 0) { ALOGW("Get PPPD_NET_LOCAL_IP failed!"); } if(!strcmp(local_ip, "")) { ALOGW("PPP link is up but no local IP is assigned. Will retry times after %d seconds",PPP_SYSFS_RETRY); property_set("ctl.stop", PPPD_SERVICE_NAME);//如果沒有IP停止pppd } else { ALOGD("PPP link is up with local IP address %s", local_ip); } } else { ALOGW("PPP link status in %s is %s. Will retry times after %d seconds", \ PPP_OPERSTATE_PATH, buffer, PPP_SYSFS_RETRY); property_set("ctl.stop", PPPD_SERVICE_NAME);//如果資料網路資料的狀態不對停止pppd } } else { ALOGW("Can not detect PPP state in %s. Will retry times after %d seconds", \ PPP_OPERSTATE_PATH ,PPP_SYSFS_RETRY); request_setup_datacall(device_fd);//繼續執行撥號 } done: sleep(PPP_SYSFS_RETRY); } return NULL; }
3、ril_fun.h
#ifndef _RIL_FUN_H_ #define _RIL_FUN_H_ #include <unistd.h> #include <utils/Log.h> //ALOG*() #include <cutils/properties.h> //property_set() #define PPPD_SERVICE_NAME "pppd_gprs" /************************************************************* * 功能: 開啟串列埠裝置檔案 * 引數: device_path: 串列埠裝置檔名 * 返回值: 串列埠裝置檔案描述符 **************************************************************/ int device_open(char *device_path); /************************************************************* * 功能: 初始化裝置節點 * 引數: device_fd: 串列埠裝置檔案描述符 * 返回值: 無 **************************************************************/ void device_init(int device_fd); /************************************************************* * 功能: 傳送AT指令函式 * 引數: device_fd: 串列埠裝置檔案描述符 * cmd:AT命令 * 返回值: ret:狀態 **************************************************************/ int at_send_command(int device_fd, char *cmd); /************************************************************* * 功能: 建立撥號函式 * 引數: device_fd: 串列埠裝置檔案描述符 * 返回值: 無 **************************************************************/ void request_setup_datacall(int device_fd); /************************************************************* * 功能: 建立查詢IP執行緒 * 引數: arg: void型別指標 * 返回值: NULL **************************************************************/ void *ip_detection(void *arg); #endif
4、Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
rild.c \
ril_fun.c
LOCAL_SHARED_LIBRARIES := \
libcutils \
libdl
LOCAL_LDLIBS += -lpthread
LOCAL_MODULE:= rild
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
上述檔案新增好後,進行編譯,在編譯前如果之前編譯過要進行清理,執行make clean
二、把下面的指令碼放到板子的/etc/ppp下
1、init.gprs-pppd
#!/system/bin/sh
# An unforunate wrapper script
# so that the exit code of pppd may be retrieved
PPPD_PID=
/system/bin/setprop "net.gprs.ppp-exit" "" #設定net.gprs.ppp-exit為空
/system/bin/log -t pppd "Starting pppd"
/system/bin/pppd connect 'chat -v -s -r "/var/log/chat.log" -f "/etc/ppp/3gdata_call.conf"' disconnect \
'chat -r "/var/log/chat.log" -t 30 -e -v "" +++ATH "NO CARRIER"' /dev/ttyUSB3 115200 mru 1280 mtu 1280 \
nodetach debug dump defaultroute usepeerdns novj novjccomp crtscts user card password card noipdefault ipcp-accept-local \
ipcp-accept-remote linkname ppp0
PPPD_EXIT=$? #獲得執行命令後的返回值
PPPD_PID=$! #最後執行的後臺程序的PID
/system/bin/log -t pppd "pppd exited with $PPPD_EXIT"
/system/bin/setprop "net.gprs.ppp-exit" "$PPPD_EXIT" #把返回值設定給net.gprs.ppp-exit
注:指令碼中的/dev/ttyUSB3為模組USB串列埠的Modem口。
2、3gdata_call.conf
ABORT "NO CARRIER"
ABORT "NO DIALTONE"
ABORT "ERROR"
ABORT "NO ANSWER"
ABORT "BUSY"
TIMEOUT 120
"" at
OK atd*99***1#
CONNECT
三、修改ini.rc指令碼
開啟 .../device/fsl/imx6/etc/init.rc按照如下紅色框進行修改
新增修改新加入檔案許可權的語句。
注:/dev/ttyUSB2是模組USB串列埠的AT口。
到此,就可以進行打包 make snod ,燒寫映象進行測試了。
可以用命令:logcat -b radio 檢視rild 輸出的資訊進行除錯。如果一切正常會打印出IP(或用命令 necfg 檢視IP),有IP後用命令 ping 202.108.22.5 (百度IP)看下網路是否能ping通。如果能ping通證明自動撥號已經成功。此時用命令 ps檢視rild和pppd程序號,用命令kill -9 <程序號> 殺死隨便一個程序,在5s之後看看是不是該程序又運行了。
相關推薦
android下除錯3G之自動撥號
本章簡單講述下android實現自動撥號的功能,該功能利用了系統啟動的rild的服務來實現,因為rild的服務是殺不死的,所以利用這一點,可以使撥號失敗或網路斷掉後自動重撥,來增強上網的可靠性。這裡只實現撥號功能,把ril庫實現的一些功能都去掉了。 一、修改ri
android下除錯3G之Ril庫分析
一、基本架構概述 Android RIL (Radio Interface Layer)提供了Telephony服務和Radio硬體之間的抽象層。RIL負責資料的可靠傳輸、AT命令
android下除錯3G之gpio控制3G上電
如果是自己開發的板子,需要用GPIO引腳控制3G模組開機/關機時,下面的文章會對你有所幫助,是以處理器IMX6和中興MG3732模組為例介紹。 一、引腳連線 處理器的gpio3_GPIO[9]連線3G模組的ON/OFF(29)引腳來控制3G的開機/
android下除錯音效卡驅動之概述
在Android中音訊系統使用的是ALSA系統架構。ASoC--ALSA System on Chip ,是建立在標準ALSA驅動層上,為了更好地支援 嵌入式處理器和移動裝置中的音訊Cod
android下除錯音效卡驅動之總結
1、在除錯中出現問題後,首先看I2C通訊有沒有問題,wm8960暫存器的設定是靠I2C來完成,另外I2C通訊不成功在開發板中是沒 有音效卡相關的裝置節點。 a、首先檢視Machi
android下除錯音效卡驅動之wm8960介紹二
三、LINPUT輸入通道介紹 有關LINPUT的主要配置如下: R32的bit8(LMN1)置1:LINPUT1連線PGA; R0
android下除錯音效卡驅動之wm8960介紹一
經過了一段時間的Android下wm8960驅動的除錯,終於實現錄音和播放功能了,在除錯過程中有了一些心得,與大家分享一 下,由於能力有限,錯誤之處還望海涵和指教。 一、總述
Android下jni開發之ndk的使用(下載、配置、編譯遇到的問題)
Android下jni開發之ndk的使用 一、簡介 JNI和NDK很多Android開發初學者沒有搞明白這個問題,JNI是Java呼叫Native機制,是Java語言自己的特性全稱為Java Native Interface,類似的還
Android動態除錯so之dump記憶體資料
1.配置環境 一臺已root手機 IDA pro6.6 Android SDK 準備工作: 1.1把Android SDK新增到環境變數中 1.2把已root手機的系統中關鍵so拖到本地,必要時可以靜態讀取,獲取系統函式的偏移地址。 例如把手機系統的system/lib的檔案拖到本地debugging資料
Android下除錯.so庫類的bug
在做dlna應用時遇到系統無法播放視訊和音訊檔案,列印了一些debug資訊, I/DEBUG ( 795): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** I/DEBUG ( 7
Android——4.2 - 3G移植之路之 reference-ril .pppd 撥號上網 (三)
而且 init.rc nal null ann 源代碼分析 suggest cdma 初始化 Android的RIL機制中的 reference-ril.c 即為廠商提供的驅動接口。這個驅動源代碼各個廠商都是有提供的,網上也有下載。我如今用的就是huawe
巧婦能為少米之炊(1)——Android下小內存下的生存之道
直接內存 -a 響應時間 分區 popu 身邊 執行 人的 算法 常常聽到身邊用安卓的朋友抱怨手機卡頓,內存動不動就快沒了。而Google聲稱在512M的內存下也能流暢執行Android 4.4。究竟它做了什麽? 總結一下它主要做了四件事: 1.優化內核,使用Activ
Android面試題3之描寫敘述下Android的系統架構
都是 csdn 進行 功能 驅動程序 libraries sso 封裝 rar 描寫敘述下Android的系統架構: Android系統從下往上分為Linux內核層(linux kerner),執行庫(runtime library),應用程序框架層,
A*算法之在U3d下實現簡單的自動尋路
engine ati mat param erp ane 自動尋路 lose var 前言: 算法簡介: A*搜尋算法俗稱A星算法。A*算法是比較流行的啟發式搜索算法之一,被廣泛應用於路徑優化領域[。它的獨特之處是檢查最短路徑中每個可能的節點時引入了全局信息,對當前節點
Android 掛逼 修煉之行---支付寶螞蟻森林能量自動收取外掛開發原理解析
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
android影象處理系列之六--給圖片新增邊框(下)-圖片疊加
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
JQuery中使用select2外掛功能之自動完成下拉框動態載入匹配(本地資料與遠端資料結合)
前言 最近專案中遇到一個問題:前端載入頁面的時候某些頁面載入速度很慢,耗時很久;有些頁面載入的飛快;因為上面所說的頁面都是由同一個程式動態生成的,利用多執行緒同步機制完成不同的前端頁面;因此當時就斷定不是程式的大問題;應該是處理資料部分存在問題;在chrome瀏覽器一測;還真的是大資料的問題
QT之Android下獲取手機感測器資料學習筆記
QT += core gui sensors positioning 其中sensors是獲取手機上感測器資料的元件,positioning是獲取位置資訊的元件 1、獲取陀螺儀感測器資料 #include <QGyroscope> QGyroscope *gyrosco
Ubuntu下使用adb和USB連線的方式進行android裝置除錯
Ubuntu下使用adb和USB連線的方式進行android裝置除錯 摘要:Ubuntu下使用adb和USB連線的方式進行android裝置除錯1、執行命令:sudovi /etc/udev/rules.d/51-Android.rules ,建立51
how to mount /system as read/write in android? 在除錯RK3288的OV2718的驅動時,需要remount /system目錄為rw以push檔案到/system/lib/hw目錄下,常規的是用adb登入上去後以root許可權執行mount -o re
在除錯RK3288的OV2718的驅動時,需要remount /system目錄為rw以push檔案到/system/lib/hw目錄下,常規的是用adb登入上去後以root許可權執行mount -o remount,rw /system即可,然而在拿的新板子後這麼做失效了,於是百