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

2

Eu tenho uma situação a seguir.

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

Usando o Network Manager, 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 está ligado ao dispositivo ZTE se os dois 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 é a seguinte situação:

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

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

O que eu tenho agora:

Ambas as conexões usam o modem ZTE 3G, listado como / dev / cdc-wdm0, este modem possui um Play Sim Card, no entanto, quando eu chamo o nmcli con laranja, ele ainda se conecta através deste modem / cartão sim / provedor, como acredito que o APN nomes e números de acesso são os mesmos para ambos.

Estou usando o nmcli 0.9.10.0 no Debian 8 (Jessie).

Paweł Sopel
fonte

Respostas:

3

Há um script de shell (baseado no nmclicomando) publicado neste post do blog . É muito simples :

Conecte o primeiro modem e execute:

nmcli -p con

Substitua o UUID e o nome da conexão no shell script, digamos orange.sh, torne-o executávelchmod +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 as mesmas etapas 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
GAD3R
fonte
Muito obrigado Hoje vou verificar isso com certeza e informar se funciona!
Paweł Sopel
Infelizmente esse script, apesar de muito útil, não resolve o meu principal problema de atribuir conexões a dispositivos físicos. Eu descobri como resolvê-lo e publicarei uma solução em breve.
Paweł Sopel
2

OK, resolvi o problema cavando nos documentos nmcli e mmcli com o uso de python.

Portanto, basicamente, as conexões de modem USB no nmcli não são vinculadas por padrão a um dispositivo específico, pois a porta (por exemplo, / dev / ttyUSB29) pode mudar a qualquer momento que a máquina é reiniciada ou o dispositivo é conectado e conectado 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 só funcionaria se o modem desejado estivesse realmente 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 chamar:

mmcli -L

O qual 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-se chamar:

mmcli -m modem_number

Onde 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 vinculá-lo à conexão do NetworkManager. Abaixo você pode encontrar um script python simples (eu sugo 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, modifique modems_to_conns para mapear os nomes de modem retornados por mmcli para os nomes de conexão nmcli e execute esse script sempre que desejar estabelecer uma das conexões.

Paweł Sopel
fonte