Linux、GSM、nmcli - 使用两个 GSM 调制解调器和连接

Linux、GSM、nmcli - 使用两个 GSM 调制解调器和连接

我有以下情况。

我有两个 USB 调制解调器(一个是华为 LTE 调制解调器,一个是中兴 3G 调制解调器),带有来自两个不同供应商(具体来说是橙色和播放)的两张不同的 SIM 卡。

使用网络管理器,我想创建两个连接并将每个连接绑定到特定设备。但是,这些连接似乎只使用一个调制解调器(列为 /dev/cdc-wdm0),如果两个调制解调器同时连接,则该调制解调器将绑定到 ZTE 设备。我还有两个设备,它们可能是某些 /dev/ttyUSB 设备的符号链接 - /dev/gsmmodem 和 /dev/gsmmodem2。

我想要实现的是以下情况:

  1. 连接 A - 调制解调器 Huwawei LTE,提供商 Orange,名称为 orange_primary,通过运行 nmcli con up orange_primary 来启动它。如果失败,nmcli 调用失败。

  2. 连接 B - 调制解调器 ZTE 3G,提供商 Play,名称为 play_backup,通过运行 nmcli con up play_backup 将其启动。如果失败,nmcli 调用失败。

我现在拥有的:

两个连接都使用 ZTE 3G 调制解调器,列为 /dev/cdc-wdm0,该调制解调器有 Play Sim 卡,但是当我调用 nmcli con up orange 时,它​​仍然通过该调制解调器/SIM 卡/提供商进行连接,因为我相信 APN 名称和接入号码对于两者是相同的。

我在 Debian 8(Jessie)上使用 nmcli 0.9.10.0。

答案1

有一个基于nmcli命令的 shell 脚本发布在这篇博文.非常简单:

连接第一个调制解调器然后运行:

nmcli -p con

替换 shell 脚本上的 UUID 和连接名称,使其orange.sh可执行chmod +x orange.sh

要开始连接:

orange.sh start

检查状态:

orange.sh status

停止连接:

orange.sh stop

按照相同的步骤为第二个调制解调器创建一个新的脚本。

这是包含源代码的 shell 脚本:

# SCRIPT BEBINGS FROM HERE
#!/bin/bash

# Source: http://aithinking.wordpress.com/2012/06/13/startingstopping-mobile-broadband-services-in-linux/
# To get the connection name (id) and connection uuid, execute the following command
# nmcli -p con
# Replace defaultConnection and defaultConnectionsUUID with your own settings

defaultConnection=”Dialog GSM Postpaid”
defaultConnectionsUUID=daad515c-b1e7-4a5c-a139-669a1d28304a

interval=2

case “$1” in

start)

echo “Starting the mobile broadband connection: ” $defaultConnection ” (UUID – ” $defaultConnectionsUUID “)”
while true; do

LC_ALL=C nmcli -t -f TYPE,STATE dev | grep -q “^gsm:disconnected$”

if [ $? -eq 0 ]; then

echo “Device Found: ” $defaultConnection
break
else
echo “Device is not found. Retrying in ” $interval ” seconds.”
sleep $interval

fi

done
echo “Starting Wireless WAN”
nmcli -t nm wwan on
echo “Connecting ” $defaultConnection
nmcli -t con up uuid $defaultConnectionsUUID
echo “Successfully Connected”

;;

stop)

echo “Stopping the mobile broadband connection: ” $defaultConnection ” (UUID – ” $defaultConnectionsUUID “)”
nmcli -t con down uuid $defaultConnectionsUUID
echo “Stopping Wireless WAN”
nmcli -t nm wwan off
echo “Successfully Disconnected”

;;
status)

LC_ALL=C nmcli -t -f TYPE,STATE dev | grep -q “^gsm:disconnected$”
if [ $? -eq 0 ]; then
echo “Device not found or GSM disconnected”
else
echo “GSM Connected”
fi

;;
*)

echo “Mobile Broadband Startup Service”
echo $”Usage: $0 {start|stop|status}”
echo “”
echo “IMPORTANT!”
echo “Edit this script to replace the values for defaultConnection and defaultConnectionsUUID with your gsm connection details”
echo “We found the following Connections list (ONLY GSM TYPE) for your system”
echo ==================================
echo Connection list
echo ==================================
echo ID UUID TYPE
echo ———————————-
nmcli -p -f NAME,UUID,TYPE con | grep gsm
exit 1

esac
exit 0

# SCRIPT ENDS HERE

答案2

好的,我已经通过使用 python 研究 nmcli 和 mmcli 文档解决了这个问题。

因此基本上,nmcli 中的 USB 调制解调器连接默认并不绑定到特定设备,因为端口(即 /dev/ttyUSB29)可以在机器重新启动或设备插入时随时更改。

可以通过运行以下命令创建此类绑定:

nmcli con modify 'conn name' connection.interface-name 'device port'

就我的情况来说可能是:

nmcli con modify orange_primary connection.interface-name ttyUSB23

但只有当所需的调制解调器确实可以通过 /dev/ttyUSB23 获得时,它才会起作用

但是,有一个名为 mmcli(调制解调器管理器客户端,不要与 nmcli 混淆)的工具,可以确定哪个设备在任意时刻连接到哪个虚拟端口。要列出所有连接的调制解调器,只需调用:

mmcli -L

这将返回所有当前连接的调制解调器及其编号的列表。

要获取有关调制解调器的所有详细信息、其当前状态(包括其可用的端口),可以调用:

mmcli -m modem_number

其中调制解调器编号是上一个命令返回的调制解调器的编号。

通过使用 grep、正则表达式、mmcli 和 nmcli,可以精确确定调制解调器所连接的端口并将其绑定到 NetworkManager 连接。下面您可以找到一个简单的 python 脚本(我很不擅长使用 bash,抱歉)来完成这项工作。

import re
from os import popen as extern

modems_to_conns = {
    '[QUALCOMM INCORPORATED] 0': 'orange_primary',
    '[ZTE INCORPORATED] MF626' : 'play_backup'
}

output = extern('mmcli -L').read().split('\n')[2:-2]
output = [x.replace('\t/org/freedesktop/ModemManager1/Modem/','') for x in output]

modems = []

for line in output:
    currentModem = {}
    currentModem['no'] = line.split(' ')[0]
    currentModem['name'] = line.replace(currentModem['no'] + ' ','')

    port = extern('mmcli -m {0} | grep \'primary port\''.format(currentModem['no'])).read().replace('\n','')
    port = re.findall('\'[^\']*\'',port)[0].replace('\'','')
    currentModem['port'] = port
    currentModem['connection'] = modems_to_conns[currentModem['name']]

    modems.append(currentModem)

for modem in modems:
    print "Assigning connection {0} to /dev/{1} ({2})".format(
        modem['connection'],
        modem['port'],
        modem['name']
    )

    extern("nmcli con modify id '{0}' connection.interface-name {1}".format(
        modem['connection'],
        modem['port']
    ))

要根据您的当前情况调整脚本,只需修改 modems_to_conns 以将 mmcli 返回的调制解调器名称映射到您的 nmcli 连接名称,并在每次想要建立其中一个连接时运行此脚本。

相关内容