Linux, GSM, nmcli - работа с двумя модемами и соединениями GSM

1469
Paweł Sopel

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

У меня есть два 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
GAD3R

В этом постеnmcli опубликован скрипт оболочки (на основе команды) . это очень просто:

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

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 ” 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ł Sopel 6 лет назад 0
К сожалению, этот скрипт, хотя и очень полезный, не решает мою основную проблему назначения подключений к физическим устройствам. Я понял, как ее решить, и скоро опубликую решение. Paweł Sopel 6 лет назад 0
2
Paweł Sopel

Хорошо, я решил проблему, копаясь в документах 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 | 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 to /dev/ ()".format( modem['connection'], modem['port'], modem['name'] )  extern("nmcli con modify id '' connection.interface-name ".format( modem['connection'], modem['port'] )) 

Чтобы настроить скрипт для вашей текущей ситуации, просто измените modems_to_conns так, чтобы он отображал имена модемов, возвращаемые mmcli, на ваши имена соединений nmcli и запускайте этот скрипт каждый раз, когда вы хотите установить одно из соединений.