最近弄3G碰到好几个问题,经过查阅相关资料还是被解决了。为了下次不再做重复的工作记录下解决过程,也可方便碰到同样问题的朋友可以参考。
问题一、3G设备文件不存在(检查硬件连接及控制开关时序是否正确);
问题二、设备文件存在,但拨号失败(检查天线连接);
问题三、拨号成功无法正常上网(检查dns配置及route表,ping www.baidu.com,如果返回ping: bad address 'www.baidu.com' 说明dns未正确设置。返回sendto: Network is unreachable 说明route表里没有3g路由)。
解决问题先了解Linux下3G模块的工作流程及模式:内核启来后加载usb 3G模块驱动,当usb 3G模块使能后创建usb转tty的设备文件,再通过设备文件发送AT指令拨号,拨号成功设置DNS及kernel的route表。
确保3G模块正常工作到正常上网至少要确保如下四点:
第一点:3G设备文件正常创建(usbACM0、usbACM1...)
Linux下的usb 3G模块驱动是集成在内核源码里的,我们只需要将配置打开编译到内核里或编译成模块动态加载。这个一般原厂会提供配置说明(点击下载配置说明文件 密码:6987)驱动成功加入到内核里,通过GPIO口打开3G模块就会在dev目录下创建3G设备文件,一般是USBACM*之类的,设备文件名在驱动代码里指定的。
第二点:拨号成功后创建ppp0 3G网卡
首先确保根文件系统移植了pppd拨号工具,如果没有参考博文《pppd的编译过程》。pppd拨号前还得将拨号配置及AT脚本移植到/etc/目录下,若没有请下载AT脚本放入/etc/目录下,tree /etc/ppp/如下
├── peers
│ ├── wcdma
│ ├── wcdma-chat-connect
│ └── wcdma-chat-disconnect
运行pppd call wcdma & ,成功创建ppp0网卡并且获取到DNS文件,失败可能是天线未接信号太弱。pppd call wcdma是调用/etc/ppp/wcdma配置文件进行配置工作模式再调用chat工具进行AT拨号,AT拨号的脚本文件为wcdma-chat-connect,断开是wcdma-chat-disconnect,ppp目录的配置及拨号脚本文件原厂一般会提供(点击下载拨号ppp配置及拨号脚本文件 密码:433a)。
第三点:DNS设置及route表里增加成功
pppd拨号成功会创建ppp0网卡(ifconfig 命令查看当前可用网卡),并获取DNS写入到/etc/ppp/resolv.conf文件,系统默认dns保存在/etc/resolv.conf文件里,只需将/etc/ppp/resolv.conf文件替换/etc/resolv.conf文件就可以,(注意DNS只要指定任意可用的公网DNS服务器就可以,如电信的202.96.134.33等,所以系统默认dns文件可以直接固化成nameserver 202.96.134.33)。如果拨号成功但无法ping通外网IP,说明route表里是否已经成功增加3G路由(route 命令查看当前可用路由)。
第四点:3g资费卡是否欠费停机或过期。
这些都是最近项目里出现的3G上网的问题,希望这些能帮到出现同样问题的朋友。