本人使用的TD的模块是LC63**,在上个月的这几天刚拿到板子,折腾了将近一个月,这个板子打电话,上网都没有问题了。
首先还是有必要介绍一下ppp协议了,是TD上网的基础:
PPP是点对点的连接协议。这种连接建立之后,将给两点分别分配IP地址,使用这个IP可以进行两点之间的通讯。互联网最初的“拨号上网”方式说的就是它。因为现在最流行的互联网连接方式是Ethernet,所以PPP大都被很多人遗忘。还有就是PPP出来一个“变种”,被叫做PPPoE,也就是 PPP on Ethernet,这又增加了一个PPP被遗忘的理由.
先说说PPP连接互联网的一种比较常见的方式。
PC—-Modem—-PPP—–RemoteHost—-Internet
PC可以通过某种方式连接到调制解调器,调制解调器负责将数字信号转换成电信号(这个说法有点模糊,可能是音频或者脉冲),用过一组“AT”命令与远程的一台主机通讯,这台主机是接入互联网的,主要负责将你的PC发过来包再次转发。下行流程于上面说的这个过程正好相反。从这个过程来看,PC的配置主要问题集中在
* 如何配置调制解调器Modem
* 如何配置那一组AT命令通讯脚本
正好这两个问题在Linux中有两个简单的工具一一对应,调制解调器的配置可以用过pppd完成,而AT命令的通讯脚本可以交给chat。
现在常见的Linux系统中都自带了pppd的模块,如果没有可以自己下载来手动编译,然后将生成的可以执行文件(pppd,chat 等)放到/usr/sbin/文件夹下即可。
下面就配置系统的pppd吧:
安装完pppd后生成/etc/ppp/目录,修改/etc/ppp/peers/cmnet文件(若没有该文件,可手动建立,文件名不一定为cmnet):
/dev/ttyUSB1
115200
modem
nocrtscts
nocdtrcts
local
debug
nodetach
#nobsdcomp
#nodeflate
#novj
usepeerdns
defaultroute
noipdefault
ipcp-accept-local
ipcp-accept-remote
lock
connect '/usr/sbin/chat -s -v -f /etc/ppp/chat/cmtc-isp'
这些命令如果不明白的,可一到网上搜,很容易找到,就不再说明:
修改/etc/ppp/chat/cmtc-isp文件(本人的系统中没有该chat目录,则手动建立,建立cmtc-isp):
ABORT 'BUSY'
ABORT 'NO CARRIER'
ABORT 'ERROR'
ABORT '+CME ERROR:100'
"" AT
OK AT+CGDCONT=1,"IP","CMNET",,0,0
OK AT+CGEQREQ=1,2,128,2048,0,0,0,0,"0E0","0E0",,0,0
OK AT
OK AT
OK ATS0=0
OK AT
OK AT
OK ATD*98*1#
CONNECT
这个文件中都是一些AT指令,网上也比较多,不再说明。
运行 pppd call cmnet 即可启动pppd脚本程序,如不出意外,会返回以下一些内容
abort on (BUSY)
abort on (NO CARRIER)
abort on (ERROR)
abort on (+CME ERROR:100)
send (AT^M)
expect (OK)
^M
OK
-- got it
send (AT+CGDCONT=1,"IP","CMNET",,0,0^M)
expect (OK)
^M
^M
OK
-- got it
send (AT+CGEQREQ=1,2,128,2048,0,0,0,0,"0E0","0E0",,0,0^M)
expect (OK)
^M
^M
OK
-- got it
send (AT^M)
expect (OK)
^M
^M
OK
-- got it
send (AT^M)
expect (OK)
^M
^M
OK
-- got it
send (ATS0=0^M)
expect (OK)
^M
^M
OK
-- got it
send (AT^M)
expect (OK)
^M
^M
OK
-- got it
send (AT^M)
expect (OK)
^M
^M
OK
-- got it
send (ATD*98*1#^M)
expect (CONNECT)
^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
^ORIG: 1,2^M
^M
+PCD: 1,1^M
^M
CONNECT
-- got it
Serial connection established.
using channel 1
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB1
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x8181f1b> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x28 <mru 1500> <asyncmap 0xffffffff> <auth pap> <magic 0x11223344> <pcomp> <accomp>]
No auth is possible
sent [LCP ConfRej id=0x28 <auth pap>]
rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x8181f1b> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x29 <mru 1500> <asyncmap 0xffffffff> <magic 0x11223344> <pcomp> <accomp>]
sent [LCP ConfAck id=0x29 <mru 1500> <asyncmap 0xffffffff> <magic 0x11223344> <pcomp> <accomp>]
sent [CCP ConfReq id=0x1 <deflate 15> <deflate(old#) 15>]
sent [IPCP ConfReq id=0x1 <compress VJ 0f 01> <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns3 0.0.0.0>]
rcvd [LCP ProtRej id=0x2a 80 fd 01 01 00 0c 1a 04 78 00 18 04 78 00]
Protocol-Reject for 'Compression Control Protocol' (0x80fd) received
sent [IPCP ConfReq id=0x1 <compress VJ 0f 01> <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns3 0.0.0.0>]
rcvd [IPCP ConfReq id=0x2b <addr 192.168.0.1>]
sent [IPCP ConfAck id=0x2b <addr 192.168.0.1>]
rcvd [IPCP ConfRej id=0x1 <compress VJ 0f 01> <ms-dns3 0.0.0.0>]
sent [IPCP ConfReq id=0x2 <addr 0.0.0.0> <ms-dns1 0.0.0.0>]
rcvd [IPCP ConfNak id=0x2 <addr 10.170.57.106> <ms-dns1 211.136.17.108>]
sent [IPCP ConfReq id=0x3 <addr 10.170.57.106> <ms-dns1 211.136.17.108>]
rcvd [IPCP ConfAck id=0x3 <addr 10.170.57.106> <ms-dns1 211.136.17.108>]
local IP address 10.170.57.106
remote IP address 192.168.0.1
primary DNS address 211.136.17.108
我也到google里面搜了一些,发现有的TD需要用户名和密码,我的这个不需要也可以上网,也不知道为啥啦。
看到pppd call cmnet成功返回ip和DNS后说明pppd成功了,此时如果系统中的eth0这个设备启动了,则需要通过
ifconfig eth0 down命令将其关闭,避免两个上网的端口冲突。
再设置ppp0端口的路由为系统的默认路由,命令如下:
route del default
route add default ppp0
将得到的DNS存到 /etc/resolve.conf文件中 nameserver 211.136.17.108(注:如果TD设备的文档中已给出这个DNS,则可以在运行pppd之前就放到resolve.conf这个文件中)
现在pppd成功启动了,很多人都会用ping这个命令去试一下网络是否通了,但是ping是行不通的。因为我们每次运行pppd这个程序返回的ip都是网内的动态ip,可以连接到公共网,但公共网却无法返回回来,所需只能通过浏览器的方式来测试网络是否已通 。需要设置网络的代理,代理如下:10.0.0.172 80。设置之后输入url即可访问网站了。
其中还有一个小问题:
本人一开始没哟考虑这个usbserial模块的问题,导致后来运行pppd call cmnet的时候老是出现如下的错误:
Serial connection established.
Couldn't get channel number: Inappropriate ioctl for devic
后来想了好久才明白是这个usbserial的问题
所以需要从新编译这个模块,这就涉及到linux驱动的问题了,如有不明白linux驱动的需要查找一些书来看一看了。
1.下载内核(注:下载的内核不一定要和系统的内核版本完全相同,我下载的内核版本就和系统的版本不一样),解压内核
2.copy当前内核配置文件至内核源代码目录下,
cp /boot/config-$(uname -r) /usr/src/linux-2.6.28/.config(即到/boot目录下找一个config开头的配置文件,将其复制到解压后的内核目录下,修改文件名为:.config即可)
3.为编译模块创建配置文件。
cd /usr/src/linux-source-2.6.24/ && make oldconfig
通过make oldconfig可以减少很多不必要的选择,使用系统当前的配置作为新内核默认的配置,也可以运行make menuconfig 等命令
4.对内核源码中的usbserial.c修改
usbserial.c进行修改,修改usb_serial_probe()函数中buffer_size = 4096;好像共有4个地方需要修改
5.编译修改后的模块(这里实际上编译了所有的USB串口模块,但至少比编译整个内核快得多)
make -C /lib/modules/$(uname -r)/build M=/usr/src/linux-2.6.28/drivers/usb/serial
/lib/modules/..../build为系统目录,如我的是:/lib/modules/2.6.32.10-90.fc12.i686.PAE/build。
后面一个目录为当前编译的usbserial模块的目录。
6.备份当前使用的usbserial.ko,然后将上步生成的usbserial.ko copy到/lib/modules/kernel/drivers/usb/serial/
如果找不到内核中usbserial.ko的位置,可以通过locate usbserial.ko指令找到
大概的过程和问题就这样了,终于搞定了!!!!!!!!!!