3G/4G 上网常见问题
本帖主要发布 3g 上网的各种问题及解决方法,以后有新的问题及处理方法都将在此帖发
布
在说各种 3G 问题之前,先说下如何获取 3g 相关的日志信息,因为几乎所有的问题都能从
LOG 中找到些线索。
一、 3G 相关日志信息的获取
1、使用串口捕捉 LOG 信息:
A、打开串口,输入:
logcat –b radio &
logcat –s pppd CHAT &
此时串口屏幕上会不断打印出捕捉到的信息
B、插入 Dongle 或者开启 modem,把出问题的流程走一遍
C、把串口输出的信息保存成文件
2、使用 adb 工具捕捉LOG 信息:
A、打开 adb shell: adb shell
B、输入命令
$ logcat –b radio > /cache/radio.log &
深圳市新创云智能科技有限公司
$logcat –s pppd CHAT > /cache/pppd.log &
如果你有 root 权限,还可以捕捉 kernel 的打印:
# cat /proc/kmsg > /cache/kernel.log &
C、插入 Dongle 或者开启 modem,把出问题的流程走一遍
D、退出 adb shell,把机器中的 log 文件 pull 到本地
$ exit
adb pull /cache/*.log d:
3、使用 android 应用捕捉 LOG 信息,如 aLogcat,请参考文档《通过 alogcat 获取 Radio 日
志信息.pdf》
二、 3G 无法使用(1) – 无法找到modem 设备
3G 出现问题,通常应先检查系统是否识别到了 modem 设备,可用如下命令确认:
ls/dev/ttyU*
或者
ls/dev/ttyA*
如果在/dev 下没有找到 ttyU* 或者ttyA* 设备,此时可通过观察内核 LOG 来定位问题:
1. USB设备枚举失败或者系统根本就没有发现 USB 设备,此时应检查硬件
电路
2. USB枚举成功,但没有注册到 ttyUSB 或者 ttyACM 设备,此时应检查你的内核:
a). 你的内核没有开启 u***serial 功能
b). 你的内核代码中的 u***serial 相应驱动中没有添加该设备的 VID/PID,请修改
kernel/drivers/u***/serial/op
tion.c,在数组 staticstruct u***_device_id option_ids[] 的末
尾添加上新设备的 VID/PID
3. USB枚举成功,且相关配置且 ID 都已添加,但还是不出来 ttyUSB 或者 ttyACM 设备,此时
可观察系统是否有对它执行 u*** mode switch,可通过 logcat:
#logcat –s Vold vold &
观察是否有调用了 u***_modeswitch 程序,如果没有执行,则检查如下:
a). 检查一些必要的文件是否存在:
ls/system/bin/u***_modeswitch
ls/etc/u***_modeswitch.sh
ls/etc/u***_modeswitch.d/[VID_PID] #[VID_PID]应替换成你的 modem 的
VID/PID,如: 12d1_1001
如果是缺少了 u***_modeswitch、u***_modeswitch.sh 等文件,则可能是你的
深圳市新创云智能科技有限公司
gingerbread/device/rockchip/sdkDemo/BoardConfig.mk中的配置存在问题,请确认
BOARD_RADIO_DATAONLY:= true
如果是缺少了/etc/u***_modeswitch.d/[VID_PID],请告知我!
b).VOLD 中关于 u***_modeswitch 这部分的代码没有被编译,你可查看 Vold 的 log 中是
否有“Start Misc devices Manager…” 的字样,如果没有这串字符,请检查你的
gingerbread/system/vold/下的内容。
通常,3G 问题中,不出来 ttyUSB 或者ttyACM 设备,主要就是上述的那些情况
三、 3G 无法使用(2) – 有找到modem 设备,但信号一直打叉
当系统已经识别到你的 modem,但状态栏上的信号图标却一直是打叉的,此时你应做如下检查:
1. 先检查系统中的 rildaemon 是否已经正常启动。查看 radio 的 LOG,若是不断打印字符串
"Donot switch user to radio",则可能是你的库的名称不对,请确定文件/default.prop 中的
"rild.libpath="所指定的 ril 库与你实际使用的 ril 库是否一致,若不一致,请修改。例如:
我在/default.prop 中指定了使用的库是
"rild.libpath=/system/lib/libril-rk29-mid.so",但是我实际使用的 RIL库是
/system/lib/libril-rk29-dataonly.so,此时需要修改/default.prop的内
容: "rild.libpath=/system/lib/libril-rk29-dataonly.so"
2. 此 modem 在我们的系统中是否支持?这可以通过查看《3G_Support_List》, 或者找下 radio
的 LOG 中是否有”Not support modem” 的字样出现。如果检查的结果是不支持的 modem,请联系我。
3. 信号图标旁边出现一个SIM 卡的图标,表示没有找到 SIM 卡或者 SIM 卡有问题,此时你应检
查:
a) SIM卡是否插正确
b) 是否插入了不适合的 SIM卡,比如你用的 WCDMA modem,却插入了电信的 SIM卡。
c) SIM卡座是否出问题了?可联系硬件。
4. 该 SIM 卡已经欠费停机,所以信号一直是打叉的。可联系当地客服咨询。
5.Modem 硬件出现问题,导致无法正常
通信。此种情况可更换 modem 再行测试。可将 LOG 发给
我。
四、 3G 无法使用(3) – 有信号,但无法连接上数据网络。
当系统已经识别到你的 modem,且状态栏上的信号图标已经不再打叉了,说明你的 modem 已经
初始化完成,但状态栏上没有出现新图标如”E” 、”G” 、”3G” 等数据连接的图标,说明没有连接
上数据网络,此时应做如下检查:
深圳市新创云智能科技有限公司
1. 没有勾选上“已启用数据”,可从【设置】->【无线和网络】->【移动网络】,勾选【已启
用数据】。
2. 缺少拨号所需要的一些程序。可查看如下:
ls/system/bin/pppd
ls/system/bin/chat
ls/etc/ppp/
call-pppd
ip-down
ip-up
ip-up-***
3.kernel 未开启 ppp 协议栈。可查看下系统中是否存在文件:/dev/ppp,如果没有这个文件,
说明你的 kernel 没有开启 ppp 协议栈,请如下配置
深圳市新创云智能科技有限公司
4. PS 服务(即数据业务)受限,导致无法上网。可先咨询客户看该 SIM 卡是否已开通数据业
务,且是否已欠费。
5. 缺少 APN(Access Point Name), APN 信息由各个运营商提供,目前在系统中默认放置的是
中国大陆的运营商的 APN,如果你要在其它国家或港/澳/台使用,需添加 APN:
a). 手动设置 APN
进入【设置】->【无线和网络】->【移动网络】->【接入点名称】, 选择新建,然
后手动填入 APN 的信息
b). 添加默认 APN
修改文件 android/frameworks/base/core/res/res/xml/apns.xml, 在其中添加
APN,然后生成新固件
通过以上步骤,若还是无法拨号成功,请发 LOG 给我
五、 3G 无法使用(4) – 已经有3G3G 图标,但是无法打开网页
当系统已经识别到你的 modem,且状态栏上的信号图标已经不再打叉了,而且也已经出现了数
据连接的图标(如 3G),但使用 browser 却发现打不开网页。请做如下检查:
请先检查 ppp 网络接口是否存在:
#busybox ifconfig
ppp0 Linkencap:Point-to-Point Protocol
inetaddr:10.119.45.174 P-t-P:192.200.1.21 Mask:255.255.255.255
UPPOINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RXpackets:4 errors:0 dropped:0 overruns:0 frame:0
TXpackets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0txqueuelen:3
RXbytes:58 (58.0 B) TX bytes:135 (135.0 B)
A.ppp0 存在,说明 3G 网络连接还存在,此时再作如下检查:
使用 ping 命令来检查网络情况:
# ping-c 4
www.baidu.com
a).PING 网络正常,则可能是上层浏览器的问题,请检查或者更换其它浏览器
b).PING 不通,则可能是当前的网络存在异常,比如信号弱、或者网络堵涩等
B.ppp0 不存在,说明 3G 网络连接已经断开,但上层没有接收到相应消息,错误认为 3G
连接还存在。
深圳市新创云智能科技有限公司
在最新的 ril 库中,使用一个线程来轮询 pppd 进程状态,当 pppd 异常退出时,ril
主动上报消息给上层,由上层查询 3G 的连接情况,并以查询结果更新 3G 状态。
另外,目前测试还发现 CDMA、TD-SCDMA 的modem,在系统进入睡眠前如果已经建立了数据连接,
在系统从睡眠中被唤醒之后,其数据连接不可用,AT 指令也无法发送,对于这些模块,可在建立数
据连接后,禁止系统进入睡眠。
六、 3G 无法使用(5) – 3G 与WIFI/Ethernet 的冲突
有发现如下现象:当系统中开启了 3G 及 wifi 后,当 Wifi 连接成功后,3G 的数据连接最终会
被断开,这没有问题;但是,当把 wifi、3G 等网络设备全部关闭后,再次打开 3G,发现 3G 在注册
网络成功后,不会自动去拨号上网,而必须手动点击两次【设置】->【无线和网络】->【移动网络】
->【已启用数据】, 方能正常上网。
修改代码:
frameworks/base/telephony/java/com/android/internal/telephony/DataConnectionTracker.jav
a
importjava.util.ArrayList;
+/*BEGIN: Added by cmy, 2011/7/5 PN:[bug 110705001] */
+importandroid.content.Context;
+importandroid.net.IConnectivityManager;
+importandroid.os.ServiceManager;
+/*END: Added by cmy, 2011/7/5 PN:[bug 110705001] */
/**
*{@hide}
*
@@-297,6 +302,19
@@ public abstract class DataConnectionTracker extends Handler {
break;
caseEVENT_RADIO_AVAILABLE:
+ /*BEGIN: Added by cmy, 2011/7/5 PN:[bug 110705001] */
+ if (Settings.Secure.getInt(phone.getContext().getContentResolver(),
+Settings.Secure.MOBILE_DATA, 1) == 1)
+ {
+Settings.Secure.putInt(phone.getContext().getContentResolver(),
+Settings.Secure.MOBILE_DATA, 0);
+ try{
+IConnectivityManager.Stub.asInterface(ServiceManager.
+getService(Context.CONNECTIVITY_SERVICE)).setMobileDataEnabled(true);
+ }catch (Exception e) {
+ }
深圳市新创云智能科技有限公司
+ }
+ /*END: Added by cmy, 2011/7/5 PN:[bug 110705001] */
onRadioAvailable();
break;
此 BUG 在补丁【rk29_gingerbread_3g_patch_20110628_v2】中已有修正。
七、 使用 3G3G 的一些默认行为、以及如何修改
1. 当系统中同时启用 3G、WIFI时,默认优先使用 WIFI 连接,而原有的 3G 连接会
被断开。如何改变它们的优先级?
修改代码:frameworks/base/core/res/res/values/config.xml,其中红色数
字便是优先级,数字越大,优先级超高
- "wifi,1,1,1"
- "mobile,0,0,0"
- "mobile_mms,2,0,2"
- "mobile_supl,3,0,2"
- "mobile_hipri,5,0,3"
- "eth,7,7,7"
深圳市新创云智能科技有限公司
2. 当 3G 打开后,系统会根据所注册的网络,自动切换系统的语言、时区等。不过,
如果你曾经手动设置过系统的语言、时区等,则 3G 打开后不会自动切换它们。如何设置
以保持系统的语言、时区不因 3G 而改变?
修改代码:
frameworks/base/telephony/java/com/android/internal/telephony/MccTable.java,
public static void updateMccMncConfiguration(PhoneBasephone, String mccmnc)
{
if (!TextUtils.isEmpty(mccmnc)) {
......
if(mcc != 0) {
setTimezoneFromMccIfNeeded(phone,mcc); // 设置时区
setLocaleFromMccIfNeeded(phone, mcc); // 设置语言
setWifiChannelsFromMcc(phone, mcc); //设置 Wifi 频道
}
......
}
}