Linux, GSM, nmcli - Arbeiten mit zwei GSM-Modems und Verbindungen

1403
Paweł Sopel

Ich habe eine folgende Situation.

Ich habe zwei USB-Modems (ein Huwawei LTE-Modem, ein ZTE 3G-Modem) mit zwei verschiedenen SIM-Karten von zwei verschiedenen Anbietern (orange und speziell zu spielen).

Mit Network Manager möchte ich zwei Verbindungen herstellen und jede Verbindung an ein bestimmtes Gerät binden. Diese Verbindungen scheinen jedoch nur ein Modem zu verwenden (aufgeführt als / dev / cdc-wdm0), das an ein ZTE-Gerät gebunden ist, wenn beide gleichzeitig verbunden sind. Ich habe auch zwei Geräte, die wahrscheinlich Symlinks zu einigen / dev / ttyUSB-Geräten sind - / dev / gsmmodem und / dev / gsmmodem2.

Was ich erreichen möchte, ist folgende Situation:

  1. Verbindung A - Modem Huwawei LTE, Anbieter Orange, Name orange_primary, indem es nmcli con up orange_primary ausführt. Wenn dies fehlschlägt, schlägt der Aufruf von nmcli fehl.

  2. Verbindung B - Modem ZTE 3G, Anbieter Play, Name play_backup. Bringen Sie es auf, indem Sie nmcli con up play_backup ausführen. Wenn dies fehlschlägt, schlägt der Aufruf von nmcli fehl.

Was ich jetzt habe:

Beide Verbindungen verwenden ein ZTE 3G-Modem, das als / dev / cdc-wdm0 aufgeführt ist. Dieses Modem verfügt über eine Play Sim-Karte. Wenn ich jedoch nmcli con up orange anrufe, stellt es immer noch eine Verbindung über dieses Modem / eine Simcard / einen Provider her, wie ich an den APN glaube Namen und Zugangsnummern sind für beide gleich.

Ich verwende nmcli 0.9.10.0 unter Debian 8 (Jessie).

2

2 Antworten auf die Frage

3
GAD3R

In diesem Blogpost gibt es ein Shell-Skript (basierend auf dem nmcliBefehl) . es ist sehr einfach :

Verbinden Sie das erste Modem und führen Sie dann Folgendes aus:

nmcli -p con 

Ersetzen Sie die UUID und den Verbindungsnamen im Shellskript, zum Beispiel orange.sh, machen Sie es ausführbarchmod +x orange.sh

So starten Sie die Verbindung:

orange.sh start 

um den Status zu überprüfen:

orange.sh status 

um die Verbindung zu beenden:

orange.sh stop 

Führen Sie die gleichen Schritte aus, um ein neues Skript für das zweite Modem zu erstellen.

Dies ist das Shell-Skript einschließlich der Quelle:

# 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 
Vielen Dank. Ich werde das heute sicher überprüfen und Sie wissen lassen, ob es funktioniert! Paweł Sopel vor 6 Jahren 0
Unglücklicherweise löst dieses Skript, obwohl sehr nützlich, mein primäres Problem der Zuordnung von Verbindungen zu physischen Geräten nicht. Ich habe herausgefunden, wie ich es lösen kann und werde bald eine Lösung posten. Paweł Sopel vor 6 Jahren 0
2
Paweł Sopel

OK, ich habe das Problem gelöst, indem ich mit Hilfe von Python in nmcli und mmcli docs gesucht habe.

Grundsätzlich sind USB-Modemverbindungen in nmcli nicht standardmäßig an ein bestimmtes Gerät gebunden, da sich der Port (dh / dev / ttyUSB29) bei jedem Neustart des Computers oder beim Ein- und Ausstecken des Geräts ändern kann.

Es ist möglich, eine solche Bindung zu erstellen, indem Sie Folgendes ausführen:

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

In meinem Fall kann es sein:

nmcli con modify orange_primary connection.interface-name ttyUSB23 

Es würde aber nur funktionieren, wenn das gewünschte Modem tatsächlich über / dev / ttyUSB23 verfügbar ist

Es gibt jedoch ein Tool namens mmcli (Modem Manager Client, nicht zu verwechseln mit nmcli), mit dem Sie herausfinden können, welches Gerät zu welchem ​​Zeitpunkt an welchen virtuellen Port angeschlossen ist. Um alle verbundenen Modems aufzulisten, rufen Sie einfach an:

mmcli -L 

Daraufhin wird eine Liste aller aktuell verbundenen Modems mit ihren Nummern zurückgegeben.

Um alle Details über das Modem zu erfahren, ist es der aktuelle Status, einschließlich des Ports, auf dem es verfügbar ist.

mmcli -m modem_number 

Dabei ist die Modemnummer die Nummer des Modems, das vom vorherigen Befehl zurückgegeben wurde.

Mithilfe von grep, regulären Ausdrücken, mmcli und nmcli kann der Port, an den das Modem angeschlossen ist, genau bestimmt und an die NetworkManager-Verbindung gebunden werden. Nachfolgend finden Sie ein einfaches Python-Skript (ich saug an bash, sorry), das die Arbeit erledigt.

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

Um das Skript an Ihre aktuelle Situation anzupassen, ändern Sie einfach modems_to_conns, um die von mmcli zurückgegebenen Modemnamen Ihren nmcli-Verbindungsnamen zuzuordnen, und führen Sie dieses Skript jedes Mal aus, wenn Sie eine der Verbindungen herstellen möchten.