Linux, GSM, nmcli - trabalhando com dois modems GSM e conexões

2

Eu tenho uma situação a seguir.

Eu tenho dois modems USB (um modem Huwawei LTE, um modem 3G ZTE) com dois cartões SIM diferentes de dois provedores diferentes (laranja e reproduzir para ser específico).

Usando o Network Manager Eu quero criar duas conexões e vincular cada conexão a um dispositivo específico. No entanto, essas conexões parecem usar apenas um modem (listado como / dev / cdc-wdm0) que é vinculado ao dispositivo ZTE se ambos estiverem conectados ao mesmo tempo. Eu também tenho dois dispositivos que provavelmente são links simbólicos para alguns dispositivos / dev / ttyUSB - / dev / gsmmodem e / dev / gsmmodem2.

O que eu gostaria de alcançar é seguir a situação:

  1. Conexão A - modem Huwawei LTE, provedor Orange, nome orange_primary exibindo-o executando nmcli con up orange_primary. Se falhar, a chamada nmcli falhará.

  2. Conexão B - modem ZTE 3G, provedor Play, nome play_backup, ligando-o executando nmcli con up play_backup. Se falhar, a chamada nmcli falhará.

O que eu tenho agora:

Ambas as conexoes usam o modem ZTE 3G, listado como / dev / cdc-wdm0, este modem tem um Play Sim Card, mas quando eu ligo para o nmcli com laranja, ele ainda conecta via modem / simcard / provider, como eu Acreditamos que os nomes e números de acesso da APN são os mesmos para ambos.

Eu estou usando nmcli 0.9.10.0 no Debian 8 (Jessie).

    
por Paweł Sopel 10.07.2017 / 15:58

2 respostas

2

OK, eu resolvi o problema cavando em nmcli e mmcli docs com um uso de python.

Portanto, basicamente, as conexões de modem USB em nmcli não são, por padrão, vinculadas a um dispositivo específico, pois a porta (por exemplo, / dev / ttyUSB29) pode ser alterada a qualquer momento que a máquina for reiniciada ou novamente.

É possível criar essa ligação executando:

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

No meu caso, pode ser:

nmcli con modify orange_primary connection.interface-name ttyUSB23

Mas isso só funcionaria se o modem desejado estivesse disponível via / dev / ttyUSB23

No entanto, existe uma ferramenta chamada mmcli (Modem Manager Client, para não confundir com nmcli), que permite descobrir qual dispositivo está conectado a qual porta virtual em um dado momento. Para listar todos os modems conectados, basta ligar:

mmcli -L

Que retornará a lista de todos os modems conectados no momento com seus números.

Para obter todos os detalhes sobre o modem, seu status atual, incluindo a porta em que está disponível, pode ser chamado:

mmcli -m modem_number

Onde o número do modem é o número do modem retornado pelo comando anterior.

Usando grep, expressões regulares, mmcli e nmcli, é possível determinar com precisão a porta à qual o modem está conectado e ligá-lo à conexão do NetworkManager. Abaixo você pode encontrar um script python simples (eu chupo no bash, desculpe) que faz o trabalho.

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']
    ))

Para ajustar o script para sua situação atual apenas modifique os modems_to_conns para mapear nomes de modem como retornados por mmcli para seus nomes de conexão nmcli e execute este script toda vez que você quiser estabelecer uma das conexões.

    
por 11.07.2017 / 16:18
3

Há um shell script (baseado no comando nmcli ) publicado em este post de blog . é muito simples:

Conecte o primeiro modem e execute:

nmcli -p con

Substitua o UUID e o nome da conexão no script de shell, digamos orange.sh , torne-o executável chmod +x orange.sh

Para iniciar a conexão:

orange.sh start

para verificar o status:

orange.sh status

para parar a conexão:

orange.sh stop

Siga os mesmos passos para criar um novo script para o segundo Modem.

Este é o script de shell, incluindo a fonte:

# 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
    
por 11.07.2017 / 09:57