我目前正在为linux路由器编写一个小工具,当我将合适的调制解调器插入它的USB端口时,它可以建立wwan (gsm/3g)连接。当插入设备时,注册了几个ttys,我目前维护着制造商和设备的列表,以及它们注册的ttys中哪一个是控制/数据端口。
如果可能的话,我想摆脱这个列表,并找到一种方法,以某种方式直接探测注册的tty,以检查它们是控制端口还是数据端口。
我检查了wvdial和modem-manager的源码,看看这些工具如何检测正确的端口,但找不到合适的信息。我还尝试在sysfs中查找信息以区分端口,但也没有成功。
发布于 2014-05-25 00:04:13
您无法通过外部手段检测到这一点。通常的做法是为特定的调制解调器制造商和型号设置udev规则。或者,您可以顺序连接到每个tty,并通过AT命令验证它是哪种类型的端口。
在使用udev规则的情况下,您可以遵循以下流程:
1)检测调制解调器vid和pid 2)基于vid/pid在/dev/串行/by-id中创建符号链接
例如,具有vid = 1199和pid 683c的with无线MC8795V调制解调器。我知道端口3总是AT命令通道。因此,您可以在末尾使用-AT创建一个后修复的符号链接。
在检测via 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采用这种方法。
发布于 2015-05-22 19:38:11
我使用此脚本获取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
}
}示例输出:
互联中兴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发布于 2018-06-02 09:50:11
这对我来说很有效:
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
donehttps://stackoverflow.com/questions/5477882
复制相似问题