嵌入式Linux系統實作3G網卡撥号
本文介紹在嵌入式Linux中,實作3G聯網的基本方法。包括驅動配置,和聯網的過程。也對在PC上實作3G的過程進行了介紹。
硬體:3g usb子產品(華為ce189的3g網卡)+一張sim卡(電信cdma2000)
軟體系統:Linux
主要内容:
一、在pc端确認撥号功能可用
二、在嵌入式端的實作
三、其它
一、在pc端确認撥号功能可用
==================================
在windows下直接插入網卡即可自動安裝其驅動,比較簡單直覺,其實linux下連接配接也很簡單,這裡給出linux下的連接配接方式。
系統:Ubuntu 12.04
1、将sim卡插入3g網卡,再将3g網卡插入pc。
2、對3g網卡進行網絡配置
這裡有圖形和指令行兩種方式。後面在嵌入式系統中會采用指令行方式配置3g資訊。
2.1、圖形方式
通過圖形設定比較直覺,可大緻了解3g配置所需的資訊。
編輯連結->移動寬帶->添加(新連接配接名為china telecom 1)
具體配置:
(1)IP配置:自動(即ppp自動)
(2)移動寬帶:
編号:#777
使用者名:[email protected]
密碼:vnet.mobi
(3)ppp設定:
預設。
即chap、pap等鑒權方式都選中。
(4)連接配接
儲存上述配置後,即可通過點選建立的連接配接"china telecom 1"連上。
(5)确認聯網情況
ifconfig可見網絡的名字為ppp0
通過firefox即可上網。
2.2指令行腳本方式:
通過pppd撥号上網,可以對連接配接過程有更深一步的了解,且使用預先配置好的資訊,無需使用者幹預。如下
(1)pppd對cdma2000的撥号腳本
#cat /etc/ppp/peers/cdma2000ce189
#This is pppd script used by huawei ce189.
/dev/ttyUSB0
115200
crtscts
modem
debug
lock
nodetach
usepeerdns
defaultroute
noipdefault
noauth
user "[email protected]"
password "vnet.mobi"
#lcp-echo-failure 5
#lcp-echo-interval 30
#persist
0.0.0.0:0.0.0.0
connect '/usr/sbin/chat -s -v -f /etc/ppp/cdma2000-connect-chat'
這裡,注意,noauth選項一定要有,這裡"lcp-echo-failure 5"表示5次心跳确認失敗後會終止連接配接、"lcp-echo-interval 30"表示心跳确認時間為30秒,"persist"表示基于前面心跳失敗後,不會終止連接配接而是重新撥号。
(2)pppd撥号腳本調用的chat撥号腳本
#cat /etc/ppp/cdma2000-connect-chat
TIMEOUT 5
ABORT "DELAYED"
ABORT "BUSY"
ABORT "ERROR"
ABORT "NO DIALTONE"
ABORT "NO CARRIER"
"" AT
"OK-+++\c-OK" ATH0
TIMEOUT 40
"" AT
OK ATDT#777
CONNECT ""
這裡,腳本含義參見"man chat",基本每行是" "。
(3)調用pppd撥号腳本:
#pppd call cdma2000ce189
這裡,即調用前面的腳本配置并連接配接上網。結果和圖形的一樣。通過"Ctrl-C"即可斷開連接配接。
至此,即可通過圖形或指令行方式實作3g上網。
二、在嵌入式端的實作
==================================
在嵌入式闆子上實作3G連接配接過程類似,不過需要可運作在嵌入式闆上的工具。
核心版本:2.6.18
1、交叉編譯必要的工具
(1)libusb-1.0.9:
用于編譯usb-modeswitch-2.0.1
(2)usb-modeswitch-2.0.1:
用于切換網卡的模式
(3)usb-modeswitch-data-20130807
用于切換時指定切換的型号。
(4)ppp-2.4.4
用于撥号的pppd,和發送撥号指令的chat程式(可單獨編譯)。
ftp://ftp.samba.org/pub/ppp
以上程式可參考如下Makefile進行編譯:
#cat Makefile
CROSS_TOOL :=/usr/local/montavista/pro/devkit/arm/v5t_le/bin/arm_v5t_le-
CC=$(CROSS_TOOL)gcc
AR=$(CROSS_TOOL)ar
LD=$(CROSS_TOOL)g++
STRIP=$(CROSS_TOOL)strip
CPLUSPLUS=$(CROSS_TOOL)g++
LIBRARY_LINK = $(CROSS_TOOL)ld -o
CUR_DIR:=$(PWD)
THE_SRC:=usb-modeswitch-2.0.1
THE_BUILD:=build_path
THE_INSTALL:=install_path
depend:
mkdir -p ${THE_BUILD}/${THE_BUILD}
mkdir -p ${CUR_DIR}/${THE_INSTALL}
cd ${CUR_DIR}/${THE_BUILD} && ../${THE_SRC}/configure --build=i686 --host=arm-linux --prefix=${CUR_DIR}/${THE_INSTALL}
build:
cd ${CUR_DIR}/${THE_BUILD} && make
install:
cd ${CUR_DIR}/${THE_BUILD} && make install
clean:
cd ${CUR_DIR}/${THE_BUILD} && make clean
rm -rf ${CUR_DIR}/${THE_INSTALL}
rm -rf ${CUR_DIR}/${THE_BUILD}
.PHONY:depend libs clean
關鍵在于CROSS_TOOL和THE_SRC的設定,以及代碼中的Makefile。具體過程省略,請參考參考資料。
2、配置核心
打開ppp相關配置:
Device Drivers --->
[*] Network device support --->
PPP (point-to-point protocol) support
[*] PPP multilink support (EXPERIMENTAL)
[*] PPP filtering
PPP support for async serial ports
PPP support for sync tty ports
打開usb序列槽相關配置:
[*] USB support --->
USB Serial Converter support --->
[*] USB Serial Console device support
[*] USB Generic Serial Driver
USB driver for GSM and CDMA modems
3、确定産品型号
3.1、配置好的核心,先編譯後,啟動系統,插入子產品usbserial.ko、option.ko。
3.2、插入3g網卡,
#lsusb
這樣會顯示相應資訊:
12d1:1505
這裡,若無lsusb指令,可以檢視/sys/bus/usb/devices/下有相應的裝置資訊,其中:
# cat /sys/bus/usb/devices/1-1/idProduct
1505
# cat /sys/bus/usb/devices/1-1/idVendor
12d1
這裡假設是1-1。
3.3、切換網卡模式
可了解為以前usb網卡都被識别為usb存儲類型,這裡切換相當于将usb網卡拔掉,再改變模式再插上,這樣識别成合适的usb類型。
#usb_modeswitch -c /etc/usb_modswitch.d/12d1:1505
切換後檢視切換後的裝置資訊:
# cat /sys/bus/usb/devices/1-1/idProduct
140c
# cat /sys/bus/usb/devices/1-1/idVendor
12d1
這裡,12d1實際是廠商号“華為”,140c實際是該廠商的裝置産品号。
4、修改核心代碼,添加相應裝置:
#vim kernel/drivers/usb/serial/option.c
添加内容:
...
#define HUAWEI_VENDOR_ID 0x12D1
...
#define HUAWEI_PRODUCT_CE189 0x140c
...
static struct usb_device_id option_ids[] = {
...
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_CE189) },
...
};
...
static struct usb_device_id option_ids1[] = {
...
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_CE189) },
...
};
...
5、撥号
5.1、對修改好的核心子產品編譯後,重新開機系統并插入子產品:
#insmod usbserial.ko
#insmod option.ko
5.2、切換3g網卡的usb模式
#usb_modeswitch -c /etc/usb_modswitch.d/12d1:1505
...
[ 124.770000] option 1-1:1.0: GSM modem (1-port) converter detected
[ 124.780000] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
[ 124.790000] option 1-1:1.1: GSM modem (1-port) converter detected
[ 124.800000] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
[ 124.810000] option 1-1:1.2: GSM modem (1-port) converter detected
[ 124.810000] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2
[ 124.830000] option 1-1:1.3: GSM modem (1-port) converter detected
[ 124.830000] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB3
[ 124.850000] option 1-1:1.4: GSM modem (1-port) converter detected
[ 124.860000] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB4
...
#mknod /dev/ttyUSB0 c 188 0
#mknod /dev/ttyUSB1 c 188 1
#mknod /dev/ttyUSB2 c 188 2
#mknod /dev/ttyUSB3 c 188 3
#mknod /dev/ttyUSB4 c 188 4
這裡,根據切換後的提醒,建立相應的通訊裝置節點。
5.3、撥号
按照和pc一樣的方式,建立pppd撥号腳本和chat腳本,并撥号:
#pppd cdma2000ce189
最後會連接配接成功。
5.4、聯網
這裡,拔掉網線,確定隻有3g網絡
# ifconfig
eth0 Link encap:Ethernet HWaddr 74:37:2F:00:00:00
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:338 errors:0 dropped:0 overruns:0 frame:0
TX packets:304 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:166139 (162.2 KiB) TX bytes:39884 (38.9 KiB)
Interrupt:52 Base address:0x7000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1669 (1.6 KiB) TX bytes:1669 (1.6 KiB)
ppp0 Link encap:Point-to-Point Protocol
inet addr:183.41.122.220 P-t-P:183.41.0.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:3 errors:0 dropped:0 overruns:0 frame:0
TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:66 (66.0 B) TX bytes:3164 (3.0 KiB)
路由:
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
183.41.0.1 * 255.255.255.255 UH 0 0 0 ppp0
default * 0.0.0.0 U 0 0 0 ppp0
5.5、ping百度:
# ping
ping: bad address ''
# ping 115.239.210.27
PING 115.239.210.27 (115.239.210.27): 56 data bytes
64 bytes from 115.239.210.27: seq=0 ttl=56 time=2260.913 ms
64 bytes from 115.239.210.27: seq=1 ttl=56 time=1254.671 ms
64 bytes from 115.239.210.27: seq=2 ttl=56 time=250.752 ms
64 bytes from 115.239.210.27: seq=3 ttl=56 time=125.597 ms
這裡可手動設定/etc/resolv.conf,添加百度的dns資訊。
三、其它
==================================
1.裝置識别
在前面“二、在嵌入式端的實作”的第3步,嘗試過直接用3g網卡的裝置資訊添加至option.c,并且不用usb_modeswitch,結果失敗。其實是因為切換後,裝置資訊變了。後再華為的em660上發現,直接修改option.c即可,不用usb_modeswitch。
可做參考,如下:
*修改核心代碼,添加相應裝置:
#vim kernel/drivers/usb/serial/option.c
添加内容:
...
#define HUAWEI_VENDOR_ID 0x12D1
...
#define HUAWEI_PRODUCT_CE189 0x1505
...
static struct usb_device_id option_ids[] = {
...
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_CE189) },
...
};
...
static struct usb_device_id option_ids1[] = {
...
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_CE189) },
...
};
...
*啟動
#insmod usbserial.ko
#insmod option.ko
...
[ 124.780000] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0。
...
#mknod /dev/ttyUSB0 c 188 0
按照提醒,手動建立裝置節點/dev/ttyUSB0,然後采用和pc一樣的撥号腳本,無法撥通,原因是沒有其他通道(/dev/ttyUSB1等)。
2.AT指令調試測試
測試和發送at指令的方法非常簡單,可以自己寫一個小程式寫序列槽檔案。
如有工具如minicom,也可以在minicom下啟動闆子後,直接:
#cat /dev/ttyUSB0&
#echo "at" >/dev/ttyUSB0
等等等。其中,cat表示顯示輸出,echo指明寫入的指令。具體有哪些指令,需要參考相應3G規範手冊。
3.連通性問題
為什麼配置設定了私有位址?
對不同地區電信3g聯網問題:一般配置設定公網ip;有些地區,營運商可能會配置設定私網位址(可能是為了節省ip資源或者安全性),導緻裝置隻能向外通路,無法直接通路裝置;還有些地區,不允許對配置設定的位址進行ping操作;具體政策需視當地營運商而定。
總結一下,大緻如下:
*當地營運商為用戶端裝置配置設定IP是動态的,有時會配置設定私網IP,有時會配置設定公網IP(可能是為了節省IP位址資源)。
*營運商在其内部路由器可能會設定,使得私網IP隻能向外通路,公網IP可以雙向。
*如果裝置作為用戶端向外通路,則不用關心其是否能被外通路,隻需動态配置設定,不用固定ip。
*如果裝置作為伺服器,那麼可能需要固定IP,以確定能被通路到。
*咨詢過電信在深圳的客服,說3G暫無提供固定IP的業務。
為什麼無法連接配接?
檢視是否欠費。
參考資料:
http://blog.csdn.net/haomcu/article/details/7285891
作者:QuietHeart
Email:[email protected]
日期:2013年09月23日