嵌入式Linux下3G USB Modem的使用

2019-07-13 01:16发布

busybox中需打开:wcpidof busyboxshell下打开getopts

百度搜索Serial connection established. using channel 1包含大量问题解答
2013-12-22      0个评论        收藏     dl.jpg 我要投稿 .ARM-Linux ARM-Linux-2.6.17 3G USB Modem:huaweiE220(WCDMA),huaweiEC156(EVDO) arm-linux至少需要支持usb host,usb storage,usbfs,usb serial   .Linux驱动 option.c linuxoption.c就是针对3G modem的驱动,稍作修改即可支持大部分的3G usb modem 目前我的这个版本的USB Option PCMCIA serial driver依赖于USB_SERIAL && USB_OHCI_HCD && PCCARD,所以系统要保证已经选定了这三个选项,如果host不同,可以自行修改USB_OHCI_HCD这个依赖项,我的目前使用isp芯片所以就修改了这个依赖项,总而言之,usb host是必须需要的. 添加对华为e220和华为ec156的支持,option_ids数组中添加子项:
1.      #define HUAWEI_PRODUCT_E220                    0x1003   2.      #define HUAWEI_PRODUCT_EC156                   0x140c  
1.      { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220) },   2.      { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_EC156)},     三.工具 usb_switchmode-1.2.4 这是目前的最新版本,使用这个工具的目的是将默认被识别为存储设备的3g usb modem转换为可以通讯的多个串口设备,以用于ppp拨号连接. 此工具依赖于linusb,全部交叉编译之,.         1.下载并交叉编译libusb-0.1.12:

./configure --build=i686-linux --host=arm-linux --prefix=$PWD/install

make

make -n install  (确定安装目录)

make install    至此,libusb编译完毕. 2.交叉编译usb_switchmode 修改makefile:

cc=arm-linux-gcc

INCLUDEDIR =/home/jay/tools/3G/libusb-0.1.12/install/include

LIBDIR =/home/jay/tools/3G/libusb-0.1.12/install/lib




$(CC) -I $(INCLUDEDIR) -L $(LIBDIR) -o $(PROG) $(OBJS) $(CFLAGS) $(LIBS) $(LDFLAGS) -static

make

顺利通过,至此得到静态编译的usb_switchmode   3.usb_switchmode移到arm linux文件系统中,然后将usb_switchmode.conf文件夹复制进arm linux中的/etc/目录下,这个文件夹下是很多3g usb modem的配置文件.


4.pppd拨号软件 移植pppd2.4.5

./configure

make CC=arm-linux-gcc

需要的东西就是:pppd chat pppdump pppstats下可执行程序pppd, chat, pppdump, pppstats 在嵌入式文件系统下需要建立/etc/ppp/peers文件夹   四.使用 插入3g usb modem的时候会被默认识别为u,此时使用usb_switchmode工具转换,就会绑定到多个串口上去, usb_modeswitch -W -c /etc/usb_modeswitch.d/12d1_1505 其中-W仅仅是显示详细配置信息,-c是指指定配置文件,usb_switchmode自带的配置文件貌似在嵌入式下使用都多多少少有点问题,随后发现,必须要指定 DefaultVendor DefaultProduct两个参数. usb 1-1: new full speed USB device using isp1362-hcd and address 8

usb 1-1: configuration #1 chosen from 1 choice

option 1-1:1.0: Option 3G data card converter detected

usb 1-1: Option 3G data card converter now attached to ttyUSB0

option 1-1:1.1: Option 3G data card converter detected

usb 1-1: Option 3G data card converter now attached to ttyUSB1

option 1-1:1.2: Option 3G data card converter detected

usb 1-1: Option 3G data card converter now attached to ttyUSB2

option 1-1:1.3: Option 3G data card converter detected

usb 1-1: Option 3G data card converter now attached to ttyUSB3

scsi6 : SCSI emulation for USB Mass Storage devices 如果没有ttyUSB0之类的设备节点,可以自己手动建立, mknod /dev/ttyUSB0 c 188 0 mknod /dev/ttyUSB0 c 188 1 .... 之后可以 echo ATZ>/dev/ttyUSB0,如果没有错误,转换基本ok.   最后就剩下ppp拨号 目前我使用的e220wcdma制式,ec156evdo制式,其拨号脚本少有不同(驱动仅仅是设备号码有点点区别) 1.wcdma:
1.      debug   2.      nodetach   3.      lock   4.      /dev/ttyUSB0   5.      115200   6.      user "14522023288"   7.      password "******"   8.      crtscts   9.      show-password   10.   usepeerdns   11.   noauth   12.   noipdefault   13.   novj   14.   novjccomp   15.   noccp   16.   defaultroute   17.   ipcp-accept-local   18.   ipcp-accept-remote   19.   connect '/usr/sbin/chat -s -v -f chat-wcdma-connect'   20.   disconnect '/usr/sbin/chat -s -v -f chat-wcdma-disconnect'  


chat-wcdma-connect:
1.      TIMEOUT 5   2.      ABORT 'NO CARRIER'   3.      ABORT 'ERROR'   4.      ABORT 'NO DIALTONE'   5.      ABORT 'BUSY'   6.      ABORT 'NO ANSWER'   7.      '' /rAT   8.      OK /rATZ   9.      OK /rAT+CGDCONT=1,"IP","3gnet",,0,0   10.   OK-AT-OK ATDT*99#   11.   CONNECT /d/c  


chat-wcdma-disconnect: [html] view plaincopy 1.      ABORT "BUSY"   2.      ABORT "ERROR"   3.      ABORT "NO DIALTONE"   4.      SAY "/nSending break to the modem/n"   5.      '' "/K"   6.      '' "+++ATH"   7.      SAY "/nGoodbay/n"  
2.evdo
1.      debug   2.      nodetach   3.      lock   4.      /dev/ttyUSB0   5.      115200   6.      user "ctnet@mycdma.cn"   7.      password "vnet.mobi"   8.      crtscts   9.      show-password   10.   usepeerdns   11.   noauth   12.   noipdefault   13.   novj   14.   novjccomp   15.   noccp   16.   defaultroute   17.   ipcp-accept-local   18.   ipcp-accept-remote   19.   connect '/usr/sbin/chat -s -v -f /etc/ppp/peers/chat-evdo-connect'   20.   disconnect '/usr/sbin/chat -s -v -f /etc/ppp/peers/chat-evdo-disconnect'  


chat-evdo-connect:
1.      TIMEOUT 60   2.      ABORT 'NO CARRIER'   3.      ABORT 'ERROR'   4.      ABORT 'NO DIALTONE'   5.      ABORT 'BUSY'   6.      ABORT 'NO ANSWER'   7.      '' /rATZ   8.      OK-AT-OK ATD#777   9.      CONNECT /d/c  


chat-evdo-disconnect:
1.      ABORT 'NO CARRIER'   2.      ABORT 'ERROR'   3.      ABORT 'NO DIALTONE'   4.      ABORT 'BUSY'   5.      ABORT 'NO ANSWER'   6.      SAY "/nSending break to the modem/n"   7.      '' "/K"   8.      '' "+++ATH"   9.      SAY "/nGoodbay/n"  
后台拨号使用: pppd call wcdma& pppd call evdo& 电信的ecdo貌似账号密码必须使用ctnet@mycdma.cn vnet.mobi,不能使用电话号码和给定的密码. 如果拨号成功ifconfig可以看到ppp0 ppp0      Link encap:Point-to-Point Protocol  

          inet addr:183.43.180.134  P-t-P:113.115.0.1  Mask:255.255.255.255

          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1

          RX packets:4 errors:0 dropped:0 overruns:0 frame:0

          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:3 

          RX bytes:70 (70.0 B)  TX bytes:64 (64.0 B) 测试网络: # ping www.baidu.com

PING www.a.shifen.com (220.181.111.148): 56 data bytes

64 bytes from 220.181.111.148: icmp_seq=0 ttl=55 time=91.3 ms

64 bytes from 220.181.111.148: icmp_seq=1 ttl=55 time=105.3 ms

64 bytes from 220.181.111.148: icmp_seq=2 ttl=55 time=93.9 ms

64 bytes from 220.181.111.148: icmp_seq=3 ttl=55 time=98.9 ms

64 bytes from 220.181.111.148: icmp_seq=4 ttl=55 time=95.4 ms ping的时候注意屏蔽掉eth0之类的其他网络节点:ifconfig eth0 down 如果无法解析域名,多半应该是dns问题,本来pppdns是自动获取的,但是它保存的路径是/etc/ppp/resolv.conf,但是linux使用的却是/etc/resolv.conf,所以我们建立一个软连接即可: ln -s /etc/ppp/resolv.conf /etc/resolv.conf 至此3G usb modem嵌入式下使用告一段落

断开3G网卡,需要将ppp/script下的poff脚本拷贝到开发板/usr/sbin下,且修改为可执行的权限 断开3G网卡:poff
DNS问题:拷贝/etc/ppp/resolv.conf /etc/resolv.conf

 atd NO CARRIER出错        gsm/gprs模块如果是语音拨号(打电话)格式是ATDT05923434343;<回车>,注意有分号。如果是数据分组拨号(CSD或者GPRS)格式是ATDT*99***1#<回车>,注意回车前没有分号。注意一下。错了肯定会报NO CARRIER,或者NO DIALTONE

这个是每个运行商的拨号中心号码: 运营商名称       接入点               用户名密码       拨号号码                   备注    中国移动          Cmnet cmwap                     *99***1#                    2.5G2.75GGPRS                              Cmnet cmwap                      *98*1#                       3G(TD-SCDMA)    中国联通            3gnet                                    *99#                            3G(WCDMA)    中国电信                                   card  card       #777                           2G  3G   

运营商(ISPAPN 拨号号码帐号密码 中国联通WCDMAChina Unicom3GNET *99# 中国电信CDMA2000China TelecomEVDO网络#777 ctnet@mycdma.cnvnet.mobi 1X网络#777 card (CARD)cardCARD 中国移动 TD-SCDMAChina MobileCMNET *98*1# 中国移动 GPRSChina MobileCMNET *99***1#





各种拨号脚本 A. 联通WCDMA-HSDPA: (1)wcdma:  debug nodetach lock /dev/ttyUSB0 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 chat-wcdma-connect' disconnect '/usr/sbin/chat -s -v -f chat-wcdma-disconnect'
(2) chat-wcdma-connect:  TIMEOUT 5 ABORT 'NO CARRIER' ABORT 'ERROR' ABORT 'NO DIALTONE' ABORT 'BUSY' ABORT 'NO ANSWER' '' AT OK ATZ OK AT+CGDCONT=1,"IP","3gnet",,0,0 OK-AT-OK ATDT*99# CONNECT dc
(3) chat-wcdma-disconnect  ABORT "BUSY" ABORT "ERROR" ABORT "NO DIALTONE" SAY " Sending break to the modem " '' "K" '' "+++ATH" SAY " Goodbay ”

B. 移动TD-CDMA (1)td:  debug logfile /var/log/pppd.log lock /dev/ttyUSB0 115200 user "card" password "card" crtscts connect '/usr/sbin/chat -v -t3 -f td-connect-chat' disconnect '/usr/sbin/chat -s -v -f td-disconnect-chat' show-password usepeerdns noauth noipdefault novj novjccomp noccp defaultroute ipcp-accept-local ipcp-accept-remote

(2) td-connect-chat:  ABORT 'NO CARRIER' ABORT 'ERROR' ABORT 'NO DIALTONE' ABORT 'BUSY' ABORT 'NO ANSWER' '' ATZ OK-AT-OK ATD#777 CONNECT dc

(3) td-disconnect-chat:  ABORT "BUSY" ABORT "ERROR" ABORT "NO DIALTONE" SAY " Sending break to the modem " '' "K" '' "+++ATH" SAY " Goodbay "


C. 电信CDMA1x (1) cdma1x:  debug nodetach lock /dev/ttyUSB0 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 cdma1x-connect-chat' disconnect '/usr/sbin/chat -s -v -f cdma1x-disconnect-chat'
(2) cdma1x-connect-chat:  TIMEOUT 5 ABORT 'NO CARRIER' ABORT 'ERROR' ABORT 'NO DIALTONE' ABORT 'BUSY' ABORT 'NO ANSWER' '' ATZ OK AT^PREFMODE=2 OK-AT-OK ATD#777 CONNECT dc
(3) cdma1x-disconnect-chat:  ABORT "BUSY" ABORT "ERROR" ABORT "NO DIALTONE" SAY " Sending break to the modem " '' "K" '' "+++ATH" SAY " Goodbay ”

D. 电信CDMA2000-EVDO (1) evdo  debug nodetach lock /dev/ttyUSB0 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 evdo-connect-chat' disconnect '/usr/sbin/chat -s -v -f evdo-disconnect-chat'
2evdo-connect-chat  TIMEOUT 5 ABORT 'NO CARRIER' ABORT 'ERROR' ABORT 'NO DIALTONE' ABORT 'BUSY' ABORT 'NO ANSWER' '' ATZ OK-AT-OK ATD#777 CONNECT dc
3evdo-disconnect-chat  ABORT "BUSY" ABORT "ERROR" ABORT "NO DIALTONE" SAY " Sending break to the modem " '' "K" '' "+++ATH" SAY " Goodbay "


HSPA
WCDMA的发展基本可以分为以下几个不同的版本。首先是R99/R4版本,这个版本算是WCDMA的早期版本,现在我们通常也把这个版本叫做WCDMA,这个版本可以提供384Kbps的最高上传速度和2Mbps的最高下载速度。后来WCDMA发展到了R5版本,这时提出了一个技术,就是HSDPA(高速下行分组数据接入技术),这个版本大幅度强化了R99/R4版本的最高下载速度,达到7.2Mbps或者14.4Mbps,我们现在就把这个版本的WCDMA叫做HSDPA。在接下来技术进一步进化,到了R6版本时,提出了HSUPA(高速上行分组数据接入技术),这个技术在保持R5版本的下行速度不变的情况下大幅度强化了HSDPA的最高上行速度,提升到5.76Mbps,我们现在就把R6版本的WCDMA叫做HSUPAR5R6版本统称HSPA。技术总是进化的,到了R7版本时,HSPA+出现了,这个版本保持R...

HSPA英文全称为HSPA High-Speed Packet Access WCDMAR99R4系统能够提供的最高上下行速率分别为64kbps384kbps,为了能够与CDMA1XEV-DO抗衡,WCDMAR5规范中引入了HSDPA,在R6规范中引入了HSUPAHS-DPAHSUPA合称为HSPA HSDPA(高速下行分组接入)在下行链路上能够实现高达14.4Mbit/s的速率。通过新的自适应调制与编码以及将部分无线接口控制功能从无线网络控制器转移到基站中,实现了更高效的调度以及更快捷的重传,HSDPA的性能得到了优化和提升。 HSUPA(高速上行分组接入)在上行链路中能够实现高达5.76Mbit/s的速度。基站中更高效的上行链路调度以及更快捷的重传控制成就了HSUPA的优越性能。 HSPA+(增强型高速分组接入)是HSPA的强化版本。HSPA+HSPA的速度更快,性能更好,技术更先进,同时网络也更稳定,是目前LTE技术运用之前的最快的网络。

setsockopt绑定到特定interface http://hi.baidu.com/lewutian/item/6b8a2c80db48e929110ef314 (转)SOL_BINDTODEVICE SOL_BINDTODEVICEsetsockopt设置中的一种套接口选项.当套接口被绑定到 指定的网络设备接口之后,只有来自该设备的数据包才会被套接口处理。
Linux下,对网络设备的引用是通过struct ifreq来完成.通过设置struct ifreq中的ifr_name[IFNAMSIZ]来指定网络设备接口.举例如下: struct ifreq interface; char *inf = "eth0"; strncpy(interface.ifr_name, inf, IFNAMSIZ);
这样再通过设置: if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,(char *)&interface, sizeof(interface)) < 0) {     close(fd);     return -1; } 就绑定到了接口"eth0",所有数据报的收发都只经过这个接口.
对于SOL_BINDTODEVICE的总结如下:
1       对于TCP套接口、UDP套接口、RAW套接口,可以通过SO_BINDTODEVICE套接口选项将套接口绑定到指定的网络接口上。绑定之后,套接口的所有数据包收发都只经过指定的网络接口; (2       对于PF_PACKET类型的套接口,不能通过SO_BINDTODEVICE绑定到指定的网络接口上,而要通过bind(2)来与特定的网络接口绑定,所用的套接口地址结构为struct sockaddr_ll,此套接口地址结构是链路层的地址结构,独立于具体的网络设备。比如,该地址结构既可以用于表示PPP设备,也能用于表示ethernet设备。 (3        SO_BINDTODEVICE套接口选项只适用于Linux系统。如果要编写运行在多操作系统平台上的程序,不能依赖SO_BINDTODEVICE来完成套接口与具体设备的绑定。
转自:http://blog.chinaunix.net/u2/64516/showart_673646.html 另有一篇比较不错,讲述如何使用setsockopt()getsockopt()及套接口选项 http://hi.baidu.com/goodluckyyc/blog/item/7d3f442d6436b2eb8b1399ba.html
setsockopt()getsockopt()的选项名称选项 意义 期望值 SO_BINDTODEVICE 可以使socket只在某个特殊的网络接口(网卡)有效。 一个字符串给出设备的名称,或者一个空字符串返回默认值 SO_BROADCAST允许广播地址发送和接收信息包,只对UDP有效。布尔型整数 SO_DONTROUTE禁止通过路由器和网关往外发送信息包。可以防止数据离开本地网络,起到安全保护的作用。布尔型整数 SO_KEEPALIVE可以使TCP通信的信息包保持连续性,在连接数很多,而且要持续连接时很有用,减少重新连接服务器的开销。布尔型整数  SO_OOBINLINE可以把收到的不正常数据看成是正常的数据;也就是说,会通过一个标准的对recv()的调用来接收这些数据布尔型整数  SO_REUSEADDRsocket关闭后,本地端用于该socket的端口号立刻就可以被重用。这个可以减少TIME_WAIT的存在布尔型整数  SO_TYPE 重新得到socket类型(例如:SOCK_STREAM SOCK_DGRAM)。只用于getsockopt()整数
原文地址http://neupest.blog.163.com/blog/static/53714126200932331436280/   setsockopt()getsockopt()的选项名称     选项 意义 期望值  SO_BINDTODEVICE 可以使socket只在某个特殊的网络接口(网卡)有效。一个字符串给出设备的名称,或者一个空字符串返回默认值  SO_BROADCAST 允许广播地址发送和接收信息包,只对UDP有效。布尔型整数  SO_DONTROUTE 禁止通过路由器和网关往外发送信息包。可以防止数据离开本地网络,起到安全保护的作用。布尔型整数  SO_KEEPALIVE 可以使TCP通信的信息包保持连续性,在连接数很多,而且要持续连接时很有用,减少重新连接服务器的开销。布尔型整数   SO_OOBINLINE 可以把收到的不正常数据看成是正常的数据;也就是说,会通过一个标准的对recv()的调用来接收这些数据布尔型整数   SO_REUSEADDR socket关闭后,本地端用于该socket的端口号立刻就可以被重用。这个可以减少TIME_WAIT的存在布尔型整数   SO_TYPE 重新得到socket类型(例如:SOCK_STREAM SOCK_DGRAM)。只用于getsockopt()整数   





 多网卡发送数据包 
通常情况,非特殊程序联网,不会指定使用有线还是无线网卡,更不会指定用哪个网卡。假如同时有两块网卡(笔记本就有无线有无线两块),在有线和无线都连上的情况下,使用哪个网线上网,是系统决定的,如果用户自己没对此时行特别设置的话,系统会默认使用有线的。如果你正在使用有图形界面的Linux,在托盘的网络图标就可以设置,把无线网卡禁掉。如果非图形界面,你要告诉大家你是用什么发行版的Linux,假设你两个网卡都可以联网了,那就试下在终端打入以下命令来禁无线网卡: ifconfig wlan0 down 如果执行完后,程序无法联网,就说明你的有线网卡没配置好,你要给大家提供更多的信息,比如可以打入: ifconfig -a把输出粘上来给大家看。 分类: C/C++
方法一: 使用libnet,这里就不介绍了
方法二: 使用原始套接字 >> >>指定网卡发送数据的时候不需要指定网卡IP,只要设置struct ifreg ifr.ifr_name就可以了。 >>例如: >>    struct ifreq ifr; >>    fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); >>    memset(&ifr, 0, sizeof (ifr)); >>    strncpy(ifr.ifr_name, "eth0", sizeof (ifr.ifr_name) -1); >>    ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '