Как определить, является ли tty, принадлежащий gsm / 3g-модему, портом данных или управления? - PullRequest
6 голосов
/ 29 марта 2011

В настоящее время я пишу небольшой инструмент для роутера linux, который устанавливает соединение wwan (gsm / 3g) при подключении соответствующего модема к его USB-порту.Когда устройство подключено, несколько ttys зарегистрированы, и я в настоящее время веду список производителей и устройств, и какой из их зарегистрированных ttys является портом управления / данных.

Если возможно, я хочу избавиться от этого списка инайти способ как-то проверить зарегистрированные ttys напрямую, чтобы проверить, являются ли они портом управления или портом данных.

Я проверил исходный код wvdial и modem-manager, чтобы увидеть, как эти инструменты обнаруживают правильный порт, но былневозможно найти подходящую информацию.Я также пытался найти информацию в sysfs, чтобы различать порты, но это также не увенчалось успехом.

Ответы [ 3 ]

1 голос
/ 22 мая 2015

Я использую этот скрипт для получения портов данных и управления для USB-ключа 3g.

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

Подключено HuaweiE3131

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
1 голос
/ 24 мая 2014

Вы не можете обнаружить это с помощью внешних средств.Обычной практикой является либо установка правил udev для конкретного производителя и модели модема.Или вы можете последовательно подключиться к каждому tty и проверить с помощью AT-команды, какой это тип порта.

В случае правил udev вы можете выполнить следующий процесс:

1) Определить vid и модемpid 2) На основе vid / pid создайте символические ссылки в / dev / serial / by-id

Например, модем Sierra Wireless MC8795V с vid = 1199 и pid 683c.Я знаю, что порт 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 такой подход.

0 голосов
/ 02 июня 2018

Это работает для меня:

for device in $(mmcli -L | grep ModemManager | awk '{print $1}'); do
   cport=$(mmcli -m $device | awk '/primary port:/{ print $NF }' | tr -d \')
   ldevices=($(mmcli -m $device | grep "ports:" | pcregrep -o1 "(\w+) \(at\)"))
   dport=$(echo "/dev/${ldevices[@]##$cport}")
   [ -c $dport ] && echo $dport
done
...