2

У меня следующая ситуация.

У меня есть два USB-модема (один модем Huwawei LTE, один модем ZTE 3G) с двумя разными SIM-картами от двух разных провайдеров (оранжевый и play, если быть точным).

Используя Network Manager, я хочу создать два соединения и привязать каждое соединение к определенному устройству. Однако эти соединения, похоже, используют только один модем (в списке /dev /cdc-wdm0), который связан с устройством ZTE, если оба они подключены одновременно. У меня также есть два устройства, которые, вероятно, являются символическими ссылками на некоторые устройства /dev /ttyUSB - /dev /gsmmodem и /dev /gsmmodem2.

То, чего я хотел бы достичь, это следующая ситуация:

  1. Соединение А - модем 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 Card, однако, когда я вызываю nmcli con up orange, он все еще подключается через этот модем / simcard / провайдера, так как я считаю APN имена и номера доступа одинаковы для обоих.

Я использую nmcli 0.9.10.0 на Debian 8 (Джесси).

2 ответа2

3

Есть сценарий оболочки (на основе nmcli команды) , размещенные на этом BlogPost. это очень просто:

Подключите первый модем, затем запустите:

nmcli -p con

Замените UUID и имя соединения в сценарии оболочки, скажем, orange.sh , сделайте его исполняемым chmod +x orange.sh

Чтобы начать соединение:

orange.sh start

проверить статус:

orange.sh status

прекратить соединение:

orange.sh stop

Выполните те же действия, чтобы создать новый скрипт для второго модема.

Это сценарий оболочки, включая исходный код:

# 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

Хорошо, я решил проблему, копаясь в документах nmcli и mmcli с использованием python.

Таким образом, в основном, подключения USB-модема в nmcli по умолчанию не привязаны к конкретному устройству, так как порт (то есть /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 и запускайте этот скрипт каждый раз, когда вы хотите установить одно из соединений.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .