7

私は現在、適切なモデムを USB ポートに差し込むと、wwan (gsm/3g) 接続をセットアップする Linux ルーター用の小さなツールを作成しています。デバイスが接続されると、いくつかの tty が登録され、現在、メーカーとデバイスのリストと、登録されている tty のどれが制御/データ ポートであるかを管理しています。

可能であれば、このリストを削除して、登録された tty を直接調べて、制御ポートかデータ ポートかを確認する方法を見つけたいと考えています。

wvdial と modem-manager のソースコードを調べて、これらのツールがどのように正しいポートを検出するかを確認しましたが、適切な情報を見つけることができませんでした。また、ポートを区別するために sysfs で情報を検索しようとしましたが、これも成功しませんでした。

4

3 に答える 3

1

このスクリプトを使用して、3g USB ドングルのデータ ポートと制御ポートを取得します。

#!/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
    }
}

サンプル出力:

接続された ZTE 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
于 2015-05-22T11:38:10.733 に答える
1

これを外部の手段で検出することはできません。一般的な方法は、特定のモデムの製造元とモデルに対して udev ルールをセットアップすることです。または、各 tty に順次接続し、AT コマンドを使用してポートのタイプを確認することもできます。

udev ルールの場合、次のプロセスに従うことができます。

1) モデムの vid と pid を検出します 2) vid/pid に基づいて、/dev/serial/by-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 経由でこのアプローチが可能かどうかを確認する必要があります。

于 2014-05-24T16:04:12.593 に答える