2011-03-29 25 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 
相關問題