web-dev-qa-db-ja.com

Linux、GSM、nmcli-2つのGSMモデムと接続の操作

私は次のような状況にあります。

私は2つのUSBモデム(1つはHuwawei LTEモデム、1つはZTE 3Gモデム))と2つの異なるプロバイダー(具体的にはオレンジと再生)の2つの異なるSIMカードを持っています。

Network Managerを使用して、2つの接続を作成し、各接続を特定のデバイスにバインドしたいと思います。ただし、この接続は、両方が同時に接続されている場合、ZTEデバイスにバインドされている1つのモデム(/ dev/cdc-wdm0としてリストされている)のみを使用しているようです。また、おそらくいくつかの/ dev/ttyUSBデバイスへのシンボリックリンクである2つのデバイスがあります-/ dev/gsmmodemと/ dev/gsmmodem2。

私が達成したいのは、次の状況です。

  1. 接続A-モデムHuwaweiLTE、プロバイダーOrange、名前orange_primaryは、nmcli con uporange_primaryを実行して起動します。失敗した場合、nmcli呼び出しは失敗します。

  2. 接続B-モデムZTE3G、プロバイダーPlay、名前play_backup、nmcli con upplay_backupを実行して接続します。失敗した場合、nmcli呼び出しは失敗します。

私が今持っているもの:

どちらの接続も/ dev/cdc-wdm0としてリストされているZTE3Gモデムを使用し、このモデムにはPlay Simカードがありますが、nmcli con up orangeを呼び出すと、APNを信じているため、このモデム/ simcard /プロバイダーを介して接続します。名前とアクセス番号はどちらも同じです。

Debian 8(Jessie)でnmcli0.9.10.0を使用しています。

3
Paweł Sopel

OK、Pythonを使用してnmcliとmmcliのドキュメントを掘り下げることで問題を解決しました。

したがって、基本的に、nmcliのUSBモデム接続は、デフォルトでは特定のデバイスにバインドされていません。これは、マシンを再起動したり、デバイスを接続し直したりするたびに、ポート(/ dev/ttyUSB29など)が変更される可能性があるためです。

以下を実行することにより、そのようなバインディングを作成することができます。

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

私の場合は次のようになります。

nmcli con modify orange_primary connection.interface-name ttyUSB23

ただし、目的のモデムが/ dev/ttyUSB23から実際に利用できる場合にのみ機能します。

ただし、mmcli(Modem Manager Client、nmcliと混同しないでください)と呼ばれるツールがあります。これにより、任意の時点でどのデバイスがどの仮想ポートに接続されているかを把握できます。接続されているすべてのモデムを一覧表示するには、次のように呼び出すだけです。

mmcli -L

これにより、現在接続されているすべてのモデムとその番号のリストが返されます。

モデムに関するすべての詳細を取得するには、使用可能なポートを含む現在のステータスを次のように呼び出します。

mmcli -m modem_number

ここで、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接続名にマップし、接続の1つを確立するたびにこのスクリプトを実行します。

3
Paweł Sopel

このブログ投稿 に投稿されたシェルスクリプト(nmcliコマンドに基づく)があります。それは非常に簡単です:

最初のモデムを接続してから実行します。

nmcli -p con

シェルスクリプトのUUIDと接続名を置き換えます。たとえば、orange.sh、実行可能にするchmod +x orange.sh

接続を開始するには:

orange.sh start

ステータスを確認するには:

orange.sh status

接続を停止するには:

orange.sh stop

同じ手順に従って、2番目のモデム用の新しいスクリプトを作成します。

これは、ソースを含むシェルスクリプトです。

# 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
3
GAD3R