2011-03-29 76 views
4

我正在为一个linux路由器写一个小工具,当我将一个合适的调制解调器插入到它的USB端口时,它将设置wwan(gsm/3g)连接。当设备插入多个ttys进行注册时,我目前维护一个制造商和设备列表,以及他们注册的ttys中的哪一个是控制/数据端口。如何检测属于gsm/3g调制解调器的tty是数据端口还是控制端口?

如果可能我想摆脱这个列表,并找到一种方式来以某种方式直接探测注册的ttys来检查它们是否是控制端口或数据端口。

我检查了wvdial和modem-manager的源代码,看看这些工具如何检测正确的端口,但无法找到合适的信息。我也尝试在sysfs中查找信息以区分端口,但这也不成功。

回答

1

您无法通过外部方式检测到此情况。通常的做法是为特定的调制解调器制造商和型号设置udev规则。或者你可以顺序连接到每个tty并通过AT命令验证它是哪种类型的端口。

在您可以按照此过程中的udev规则的情况下:

1)检测调制解调器VID和PID 2)基于VID/PID创建的/ dev /串口/ ID别

符号链接例如,具有vid = 1199和pid 683c的Sierra Wireless MC8795V调制解调器。我知道端口3总是AT命令通道。因此,您可以创建一个后缀为-AT的符号链接。

在通过AT命令检测的情况下,最好和更常见的方法是执行AT命令以查看tty是否响应。如果您的调制解调器配置为不回应,您应该得到回声或OK。

例如:

AT 
AT 
OK 

如果你得到回应,这意味着你要么找到的AT控制端口或PPP接口。要检查这个只需执行一个ATI命令。如果响应中包含APP1,APP2,APP3,则您点击一个PPP端口。否则,你找到你的AT控制端口。

例如一个AT控制端口:

ATI 
Manufacturer: Sierra Wireless, Incorporated 
Model: MC8795V 
Revision: K2_0_7_46AP C:/WS/FW/K2_0_7_46AP/MSM6290/SRC 2010/10/27 22:15:30 
IMEI: XXXXXXXXXXXXXXX 
IMEI SV: 20 
FSN: D9A2160146410 
3GPP Release 6 
+GCAP: +CGSM,+DS,+ES 


OK 

例如一个PPP端口:

ATI 
Sierra Wireless, Incorporated 
MC8795V 
APP1 

OK 

一个字的警告,但。在Sierra Wireless模块​​的情况下,他们清楚地显示哪个端口是哪个端口。在其他制造商的情况下,您需要检查USB接口指南,看看是否可以通过ATI采取这种方法。

1

我使用这个脚本来获取3g USB dongle的数据和控制端口。

#!/bin/sh 

. /usr/share/libubox/jshn.sh 

for a in `ls /sys/bus/usb/devices`; do 
    local vendor product 
    [ -z "$usb" -a -f /sys/bus/usb/devices/$a/idVendor -a -f /sys/bus/usb/devices/$a/idProduct ] || continue 
    vendor=$(cat /sys/bus/usb/devices/$a/idVendor) 
    product=$(cat /sys/bus/usb/devices/$a/idProduct) 
    echo Vendor $vendor, Product $product 
    [ -f /lib/network/wwan/$vendor:$product ] && { 
     usb=/lib/network/wwan/$vendor:$product 
     devicename=$a 
     echo usb: $usb devicename: $devicename 
    } 
done 

[ -n "$usb" ] && { 
    local old_cb control data 

    json_set_namespace wwan old_cb 
    json_init 
    json_load "$(cat $usb)" 
    echo "$(cat $usb)" 

    json_select 
    json_get_vars desc control data 
    json_set_namespace $old_cb 

    [ -n "$control" -a -n "$data" ] && { 
     ttys=$(ls -d /sys/bus/usb/devices/$devicename/${devicename}*/tty* | sed "s/.*\///g" | tr "\n" " ") 

     ctl_device=$(echo $ttys | cut -d" " -f $((control + 1))) 
     [ -n "$ctl_device" ] && ctl_device=/dev/$ctl_device 
     dat_device=$(echo $ttys | cut -d" " -f $((data + 1))) 
     [ -n "$dat_device" ] && dat_device=/dev/$dat_device 
     echo control_device: $ctl_device, data_device: $dat_device 
    } 
} 

样本输出:

连中兴MF667

Vendor 1a40, Product 0101 #this is usb hub 
Vendor 19d2, Product 0016 
usb: /lib/network/wwan/19d2:0016 devicename: 1-1.2 
{ 
     "desc": "ONDA MF110/ZTE", 
     "control": 1, 
     "data": 2 
}} 
control_device: /dev/ttyUSB1, data_device: /dev/ttyUSB2 

连接华为E3131

Vendor 1a40, Product 0101 #this is usb hub 
Vendor 12d1, Product 1506 
usb: /lib/network/wwan/12d1:1506 devicename: 1-1.2 
{ 
     "desc": "Huawei E367/E398", 
     "control": 2, 
     "data": 0 
}} 
control_device: /dev/ttyUSB2, data_device: /dev/ttyUSB0 
相关问题