linux下要实现3G拨号上网,除了3G网卡和对应的3G卡外,软件上需要对应的网卡驱动和pppd拨号程序,pppd拨号程序一般较容易得到,如果是嵌入式平台,交叉编译即可,编译过程中可能会遇到一些错误,但都不是大问题,一般很容易解决。而3G网卡驱动对于刚接触的人来说可能稍微难一点,大部分的3G模块内核中已经得到支持。如果不幸内核中没有得到支持,那么自己添加支持也是很容易的。下面介绍两种驱动3G网卡的方法。
linux内核中USB-GSM模块的驱动主要是drivers/usb/serial/options.c文件。看了此文件会非常明了,对一个3G网卡的支持主要就是两个参数,一个是厂商ID,一个是设备ID,只要3G网卡可以被USB识别,那么我们很容易得到这个USB设备的设备ID和厂商ID,得到之后,我们把这两个参数添加进option.c文件重新编译得到option.ko,那么这个3G网卡一般就能正常工作了。
第二种方法是使用usb-modeswitch来是3G网卡正常工作。这种方法我没有实际使用过,下面是从网上看到的一篇文章,可以作位参考。
我的3G上网卡是华为 E1750,操作系统是openSUSE 11.2,之前只能在虚拟机运行的Windows里上3G,感觉这样实在不方便,于是想到了直接在Linux里连接3G网络。 1. software http://www.draisberghof.de/usb_modeswitch/
usb-modeswitch
usb-modeswitch-data libusb
2. install
安装软件 root# tar jxvf usb-modeswitch-1.1.3.tar.bz2 root# cd usb-modeswitch-1.1.3/ root# make install
root# tar jxvf usb-modeswitch-data-20100707.tar.bz2
root# cd usb-modeswitch-data-20100707/ root# make install then upgrade libusb to the lastest version. root# cp /usr/share/doc/packages/ppp/scripts/pon /usr/local/sbin root# cp /usr/share/doc/packages/ppp/scripts/poff /usr/local/sbin root# chmod ug+x /usr/local/sbin/pon /usr/local/sbin/poff
接下来,接上3G上网卡,可以看到 lsusb 输出的结果多了"USB Modem"字样。
root# lsusb ... Bus 002 Device 010: ID 12d1:1001 Huawei Technologies Co., Ltd. E620 USB Modem ... 3. configure 建立3个PPP配置文件。 root# cat /etc/ppp/peers/wcdma nodetach lock /dev/gsmmodem 115200 user "card" password "card" crtscts show-password usepeerdns noauth noipdefault novj novjccomp noccp defaultroute ipcp-accept-local ipcp-accept-remote connect '/usr/sbin/chat -s -v -f /etc/ppp/peers/wcdma-chat-connect' disconnect '/usr/sbin/chat -s -v -f /etc/ppp/peers/wcdma-chat-disconnect'
root# cat /etc/ppp/peers/wcdma-chat-connect
ABORT 'NO CARRIER' ABORT 'ERROR' ABORT 'NO DIALTONE' ABORT 'BUSY' ABORT 'NO ANSWER' '' \rAT OK \rATZ OK \rAT+CGDCONT=1,"IP","3gnet",,0,0 OK-AT-OK ATDT*99# CONNECT \d\c root# cat /etc/ppp/peers/wcdma-chat-disconnect ABORT "ERROR" ABORT "NO DIALTONE" SAY "\nSending break to the modem\n" '' "\K" '' "+++ATH" SAY "\nGoodbay\n"
4. connect 拔号连接 root# pppd call wcdma & ...... Serial connection established. Using interface ppp0 Connect: ppp0 <--> /dev/gsmmodem CHAP authentication succeeded CHAP authentication succeeded Could not determine remote IP address: defaulting to 10.64.64.64 not replacing default route to eth0 [10.217.15.1] local IP address 172.27.25.133 remote IP address 10.64.64.64 primary DNS address 202.106.195.68 secondary DNS address 202.106.46.151 Script /etc/ppp/ip-up finished (pid 10543), status = 0x0 手工添加DNS root# echo "nameserver 202.106.46.151" >> /etc/resolv.conf 手工指定默认网关 root# route add default gw 172.27.25.133 测试网络是否可用 root# ping -c 5 www.sina.com.cn PING libra.sina.com.cn (202.108.33.80) 56(84) bytes of data. 64 bytes from 202.108.33.80: icmp_seq=1 ttl=56 time=39.6 ms 64 bytes from 202.108.33.80: icmp_seq=2 ttl=56 time=48.3 ms 64 bytes from 202.108.33.80: icmp_seq=3 ttl=56 time=46.8 ms 64 bytes from 202.108.33.80: icmp_seq=4 ttl=56 time=44.6 ms 64 bytes from 202.108.33.80: icmp_seq=5 ttl=56 time=44.1 ms --- libra.sina.com.cn ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4006ms rtt min/avg/max/mdev = 39.670/44.739/48.330/2.957 ms
5. disconnect root# poff