busybox中需打开:wc,pidof;
busybox中shell下打开getopts
百度搜索“Serial connection established. using channel 1
”包含大量问题解答
2013-12-22 0
个评论
收藏
我要投稿
一.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
linux
中option.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拨号
目前我使用的
e220是
wcdma制式
,ec156是
evdo制式
,其拨号脚本少有不同
(驱动仅仅是设备号码有点点区别
)
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
问题,
本来ppp
的dns
是自动获取的,
但是它保存的路径是/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.75G
(GPRS
)
Cmnet cmwap
无 *98*1# 3G(TD-SCDMA)
中国联通 3gnet
无 *99# 3G(WCDMA)
中国电信 无 card card #777 2G 3G
运营商(ISP)APN
拨号号码帐号密码
中国联通WCDMA(China Unicom)3GNET
*99#空空
中国电信CDMA2000(China Telecom)EVDO网络空#777
ctnet@mycdma.cnvnet.mobi
1X网络空#777
card (CARD)card(CARD)
中国移动 TD-SCDMA(China Mobile)CMNET
*98*1#空空
中国移动 GPRS(China Mobile)CMNET
*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'
(2
)evdo-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
(3
)evdo-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叫做
HSUPA,
R5和
R6版本统称
HSPA。技术总是进化的,到了
R7版本时,
HSPA+出现了,这个版本保持
R...
HSPA
英文全称为HSPA High-Speed Packet Access
。
WCDMA的R99
和R4
系统能够提供的最高上下行速率分别为64kbps
和384kbps
,为了能够与CDMA1XEV-DO
抗衡,WCDMA
在R5
规范中引入了HSDPA
,在R6
规范中引入了HSUPA
,HS-DPA
和HSUPA
合称为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_BINDTODEVICE
是setsockopt
设置中的一种套接口选项.
当套接口被绑定到
指定的网络设备接口之后,只有来自该设备的数据包才会被套接口处理。
在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_REUSEADDR当
socket关闭后,本地端用于该
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] = '