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


2

我有以下情况。

我有两个USB调制解调器(一个Huwawei 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 - 调制解调器中兴通讯3G,提供商播放,命名播放_backup,通过运行nmcli con up play_backup来提升它。如果失败,则nmcli调用失败。

我现在拥有的:

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

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

Answers:


3

此博客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

非常感谢。我今天肯定会检查这个,并告诉你它是否有效!
PawełSopel17年

不幸的是,这个脚本非常有用并不能解决我为物理设备分配连接的主要问题。我已经想出如何解决它,我很快就会发布一个解决方案。
PawełSopel17年

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脚本(我很尴尬,很抱歉)。

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连接名称,并在每次要建立其中一个连接时运行此脚本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.