嵌入式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

用户名:ctnet@mycdma.cn

密码: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 "ctnet@mycdma.cn"

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:quiet_heart000@126.com

日期:2013年09月23日

linux 3g拨号,嵌入式Linux系统实现3G网卡拨号相关推荐

  1. 嵌入式linux学习论坛,嵌入式linux学习路线分享:教你真正好学的嵌入式开发学习路线...

    Linux 是一个开源.免费的操作系统,主要应用于服务器(网站服务器.云计算集群.DNS 等)和嵌入式,同时也被很多程序员用作个人操作系统.Linux 使用 GPL 许可证,允许任何人以任何形式传播其 ...

  2. Linux学习之嵌入式Linux编程文件IO(C语言版)

    Linux学习之嵌入式Linux编程文件IO(C语言版) 一.文件IO常用函数 1.open 2.write 3.read 示例代码: #include <sys/types.h> #in ...

  3. 嵌入式linux结构框图,嵌入式linux系统的结构

    原标题:嵌入式linux系统的结构 1.嵌入式系统的硬件架构 嵌入式系统硬件模型结构,此系统主要由微处理器MPU.外围电路,以及外设组成,微处理器为ARM嵌入式处理芯片,如ARM7TMDI系列及ARM ...

  4. 嵌入式linux 分区挂载,嵌入式linux系统的开发——文件系统的分区和挂载

    前言 当我们新买的硬盘安装在电脑上后,必须要对硬盘分区和文件系统格式化后才能使操作系统能够在分区内正常读写和保存文件.所谓分区即是将硬盘划分为多个空间范围,我们可以在不同的分区内存放不同的文件以便于管 ...

  5. Linux 之八 完整嵌入式 Linux 环境、(交叉)编译工具链、CPU 体系架构、嵌入式系统构建工具

      最近,工作重心要从裸机开发转移到嵌入式 Linux 系统开发,由于之前对嵌入式 Linux 环境并不是很了解,因此,第一步就是需要了解如何搭建一个完整的嵌入式 Linux 环境.现在将学习心得记录 ...

  6. 嵌入式Linux文件提取,嵌入式 Linux系统编程(四)——文件属性

    嵌入式 Linux系统编程(四)--文件属性 一.文件属性概述 Linux 文件的属性主要包括:文件的节点.种类.权限模式.链接数量.所归属的用户和用户组.最近访问或修改的时间等内容.文件属性示例如下 ...

  7. 嵌入式linux+io+优化,嵌入式Linux系统内存优化使用方法研究

    [摘要] 嵌入式系统功能的提高,占用了较大内存空间,继而时常出现运行无响应.基于用户方面看,由于系统内存问题影响运行,针对系统内存与进程应用状态研究,可以调整系统数值与执行文件elf分析,进行系统优化 ...

  8. buildroot:Linux平台构建嵌入式Linux系统的框架

    buildroot是Linux平台上一个构建嵌入式Linux系统的框架.整个Buildroot是由Makefile脚本和Kconfig配置文件构成的.你可以和编译Linux内核一样,通过buildro ...

  9. 嵌入式linux中内核,嵌入式Linux研究-对几种典型的系统的内核配置方案

    摘要 本文主要介绍了几种减裁Linux核心的方法,可以用于.嵌入式服务器的核心配置. By iamafan 1.对于一般PC的普通内核配置 对于一般的用户而言,对于Linux内核的效率和大小的要求 ...

最新文章

  1. vue 使用font-awesome 只需两步
  2. 5、Linux内核模块开发
  3. 2013年蓝桥杯软件大赛预赛java本科b组答案_2013年蓝桥杯软件大赛预赛C本科B组试题...
  4. Python 各种运算符 布尔运算 迭代器
  5. JS基础知识大总结史上最全(已完结~)
  6. 射线法判断点在多边形内适用范围_电力行业NDT无损检测技术应用大盘点!
  7. Ext:Panel之applyTo与renderTo区别
  8. CDA I级学习 - 漏斗模型
  9. 跨界融合,共创智能汽车研发新生态(技术大会诚邀您的莅临)
  10. ffmpeg获取视频封面图片
  11. C++操作http之WinInet详解
  12. python程序设计丁亚涛版_Scribus(出版设计软件)中文免费版
  13. 设计模式系列·王小二需求历险记(二)
  14. 详解如何获取深度学习模型中间层的输出值
  15. 发生房屋租赁合同纠纷如何解决
  16. 无锡设计培训——家装和工装的区别有哪些
  17. 真正懂得珍惜(观《士兵突击》数月之后)
  18. 教育2018CPCI检索一般多久的多重融合性
  19. vue访问本地静态资源文件
  20. javascript时间戳转日期格式以及浏览器时区问题解决

热门文章

  1. 非阻塞IO与阻塞IO
  2. Iphone键盘收齐页面空白问题
  3. 《异世邪君》——奇文共欣赏
  4. iphone录屏在哪里打开?手机上有哪些录制的方法
  5. TCP/IP RFC
  6. Linux服务器配置root用户ssh远程登录
  7. 计算体重指数(C语言编程题)
  8. CSS实现水平垂直居中
  9. 列一些Hbase面试题
  10. 867. 转置矩阵(逐句解释代码)