中兴MF667S WCDMA猫Linux拨号笔记

时间:2022-08-17 15:02:55

  公司最近有个国外有个项目需要用到WCDMA猫,网上简单选型了一下决定使用ZTE的型号MF667S的猫,本以为在Linux下拨号是比较简单的(之前有两款3G猫的调试经验),估计半天能搞定,结果折腾了一周才调通,记录一下调试过程中遇到的坑.

  1,模式切换

  由于现在的猫都有多种模式,目的是为了Windows下的小白用户第一次插入的时候以cdrom或者u盘的模式使用,安装里面自带的驱动后,再由驱动切换到猫的模式.这种方法在Windows下是很方便的,但是到了Linux下就很蛋疼了,需要借助usb_modeswitch来进行模式切换.主页

  下载最新的usb_modeswitch,编译,编辑一下配置文件usb_modeswitch.conf:

DefaultVendor=0x19d2
DefaultProduct=0x1588
TargetVendor=0x19d2
TargetProduct=0x1589
MessageContent="5553424312345678000000000000061e000000000000000000000000000000"
MessageContent2="5553424312345679000000000000061b000000020000000000000000000000"

  其中DefaultVendor和TargetVendor都是0x19d2,这也是ZTE公司的厂商ID,DefaultProduct为0x1588,是插入猫后做为USB模式系统认到的产品ID,可通过lsusb或者cat /proc/bus/usb/devices查看.TargetProduct0x1589是切换为猫后的产品ID,切换后可用lsusb查看.(不过感觉这里可以随便填一个,没什么用).MessageContent从usb_modeswitch主页抄的,试过只用一个MessageContent无法激活,需要MessageContent2一起使用.就这配置文件还踩了一个坑,以前的猫有加个MessageEndPoint=0xa,移植的时候也一同移植过来了,结果发消息怎么都是出错,后来移除后用默认的0x1发现可以切换了-.-.

  配置文件写好了,执行命令:./usb_modeswitch -W -c /etc/usb_modeswitch.conf,得到以下信息

 * usb_modeswitch: handle USB devices with multiple modes
* Version 2.2. (C) Josua Dietze
* Based on libusb1/libusbx ! PLEASE REPORT NEW CONFIGURATIONS ! DefaultVendor= 0x19d2
DefaultProduct= 0x1588
TargetVendor= 0x19d2
TargetProduct= 0x1589
MessageContent="5553424312345678000000000000061e000000000000000000000000000000"
MessageContent2="5553424312345679000000000000061b000000020000000000000000000000"
NeedResponse= Look for target devices ...
found USB ID 1d6b:
found USB ID 1d6b:
found USB ID 1d6b:
found USB ID 1d6b:
found USB ID 1d6b:
found USB ID 1d6b:
found USB ID 1d6b:
found USB ID :
found USB ID 0dfc:
found USB ID 19d2:
vendor ID matched
No devices in target mode or class found
Look for default devices ...
found USB ID 1d6b:
found USB ID 1d6b:
found USB ID 1d6b:
found USB ID 1d6b:
found USB ID 1d6b:
found USB ID 1d6b:
found USB ID 1d6b:
found USB ID :
found USB ID 0dfc:
found USB ID 19d2:
vendor ID matched
product ID matched
Found devices in default mode ()
Access device on bus
Current configuration number is
Use interface number
Use endpoints 0x01 (out) and 0x81 (in) USB description data (for identification)
-------------------------
Manufacturer: ZTE,Incorporated
Product: ZTE Mobile Broadband Station
Serial No.: 1234567890ABCDEF
-------------------------
Looking for active driver ...
OK, driver detached
Set up interface
Use endpoint 0x01 for message sending ...
Trying to send message to endpoint 0x01 ...
OK, message successfully sent
Trying to send message to endpoint 0x01 ...
OK, message successfully sent
Reset response endpoint 0x81
Reset message endpoint 0x01
-> Run lsusb to note any changes. Bye!

  说明已经切换成功了,再cat /proc/bus/usb/devices查看设备信息如下:

T:  Bus= Lev= Prnt= Port= Cnt= Dev#=   Spd= MxCh=
D: Ver= 2.00 Cls=(comm.) Sub= Prot= MxPS= #Cfgs=
P: Vendor=19d2 ProdID= Rev= 0.00
S: Manufacturer=ZTE,Incorporated
S: Product=ZTE Mobile Broadband Station
S: SerialNumber=1234567890ABCDEF
C:* #Ifs= Cfg#= Atr=a0 MxPwr=500mA
A: FirstIf#= IfCount= Cls=(comm.) Sub= Prot=
I:* If#= Alt= #EPs= Cls=(comm.) Sub= Prot= Driver=cdc_ether
E: Ad=(I) Atr=(Int.) MxPS= Ivl=125us
I: If#= Alt= #EPs= Cls=0a(data ) Sub= Prot= Driver=cdc_ether
I:* If#= Alt= #EPs= Cls=0a(data ) Sub= Prot= Driver=cdc_ether
E: Ad=(I) Atr=(Bulk) MxPS= Ivl=0ms
E: Ad=(O) Atr=(Bulk) MxPS= Ivl=0ms
I:* If#= Alt= #EPs= Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
E: Ad=(I) Atr=(Int.) MxPS= Ivl=500us
E: Ad=(I) Atr=(Bulk) MxPS= Ivl=0ms
E: Ad=(O) Atr=(Bulk) MxPS= Ivl=0ms
I:* If#= Alt= #EPs= Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
E: Ad=(I) Atr=(Bulk) MxPS= Ivl=0ms
E: Ad=(O) Atr=(Bulk) MxPS= Ivl=0ms
I:* If#= Alt= #EPs= Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
E: Ad=(I) Atr=(Bulk) MxPS= Ivl=0ms
E: Ad=(O) Atr=(Bulk) MxPS= Ivl=0ms
I:* If#= Alt= #EPs= Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
E: Ad=(I) Atr=(Bulk) MxPS= Ivl=0ms
E: Ad=(O) Atr=(Bulk) MxPS= Ivl=0ms
I:* If#= Alt= #EPs= Cls=(stor.) Sub= Prot= Driver=usb-storage
E: Ad=(I) Atr=(Bulk) MxPS= Ivl=0ms
E: Ad=(O) Atr=(Bulk) MxPS= Ivl=0ms

  ProdID已经切换成1589,自动加载了个cdc_ether驱动,还有4个设备未驱动和一个usb存储.cdc_ether驱动生成了一个usb0的网口设备.至此,说明WCDMA猫已经切换模式成功.

  2,设备映射

  模式切换成功后,由于自动加载了网卡驱动生成了usb0的网口设备,让我又踩了一个坑,以为这是一个纯网卡的模块,论坛上搜索了一番,也没有这个型号猫的明确说明,相近的型号也描述的不清不楚的,试过dhclinet usb0,无效.还有说要访问个gateway授权再分配IP的(纯属扯谈).后来才发现这个usb0的网卡设备完全没用,这个猫是一个传统的usb转串口的猫.

在系统启动的时候rc.local里加上下面的命令:modeprobe usbserial.ko vendor=0x19d2 product=0x1589,再重新执行第一步,OK,串口出来了.

ls /dev/ttyUSB* -l,有时候会生成0-3共4个USB口,有时候会生成0-4共5个USB控制口,不解为什么.

  3,AT拨号

  ttyUSB设备生成后就可以对设备进行AT指令拨号了,由于生成了4-5个USB节点,只好一个个试验哪个节点是猫口,经测试发现,USB0 USB1接收AT指令能返回OK,USB2 USB3直接返回TIMEOUT,说明2,3不是,猫口在0,1之间.继续测试锁定猫口为第一个设备/dev/ttyUSB0.

  接下来就是写脚本了.SCRIPT:

ABORT BUSY
ABORT 'NO CARRIER'
ABORT 'NO DIALTONE'
'' AT+CGDCONT=,"IP","3GNET" OK
ATDT*# CONNECT

pppd 115200 connect "/usr/sbin/chat -f dial.script -v" /dev/ttyUSB0 modem defaultroute

  通过上面的命令和脚本,发送AT+CGDCONT=1,"IP","3GNET"可以得到OK,再发送ATDT*99#却返回ERROR-.-;于是又在论坛摸索了半天,发现有个人遇到了相同的情况,提示在最前面加一条AT+CFUN=1,0(注册网络)果然就不返回ERROR返回CONNECT了.本以为大功告成,谁知道pppd在下一步的时候又提示检测不到本地IP,而且看log,CONNECT之后确实没有返回本地和远程的IP信息.

  在这一步又卡壳了几天,最后想着换一批pppd参数,折腾了几下终于拨上去了-.-;最终的脚本和命令如下:

ABORT BUSY
ABORT 'NO CARRIER'
ABORT 'NO DIALTONE'
'' AT+CFUN=, OK
AT+CGDCONT=,"IP","3GNET" OK
ATDT*# CONNECT

pppd 115200 connect "/usr/sbin/chat -f dial.script -v" /dev/ttyUSB0 ipcp-accept-local ipcp-accept-remote defaultroute usepeerdns

PS:这款猫还有个BUG,每次拨号,必须要拨两次才能成功,第一次拨号ATDT最后还是会返回ERROR,第二次拨号就可以正确的拨上去了-.-,ZTE的东西就是不太靠谱,最后没办法只有在上层应用加个判断,拨号拨两次再检查状态...