Linux, GSM, nmcli-두 개의 GSM 모뎀 및 연결로 작업


2

다음과 같은 상황이 있습니다.

두 개의 다른 공급자 (오렌지 및 특정 재생)의 두 개의 다른 SIM 카드가있는 두 개의 USB 모뎀 (하나의 Huwawei LTE 모뎀, 하나의 ZTE 3G 모뎀)이 있습니다.

Network Manager를 사용하여 두 개의 연결을 작성하고 각 연결을 특정 장치에 바인드하려고합니다. 그러나이 연결은 둘 다 동시에 연결되어있는 경우 ZTE 장치에 바인딩 된 하나의 모뎀 (/ dev / cdc-wdm0으로 표시) 만 사용하는 것 같습니다. 또한 / dev / ttyUSB 장치에 대한 심볼릭 링크 인 / dev / gsmmodem 및 / dev / gsmmodem2의 두 장치가 있습니다.

내가 달성하고자하는 것은 다음과 같은 상황입니다.

  1. 연결 A-모뎀 Huwawei LTE, 공급자 Orange, 이름은 orange_primary nmcli con up orange_primary를 실행하여 가져옵니다. 실패하면 nmcli 호출이 실패합니다.

  2. 연결 B-모뎀 ZTE 3G, 제공자 재생, 이름 play_backup, nmcli con up play_backup을 실행하여 강화하십시오. 실패하면 nmcli 호출이 실패합니다.

내가 지금 무엇을 :

두 연결 모두 / dev / cdc-wdm0으로 나열된 ZTE 3G 모뎀을 사용하며,이 모뎀에는 Play Sim 카드가 있지만 nmcli con 주황색을 호출하면 APN을 믿는 것처럼이 모뎀 / simcard / 제공자를 통해 계속 연결됩니다. 이름과 액세스 번호는 모두 동일합니다.

Debian 8 (Jessie)에서 nmcli 0.9.10.0을 사용하고 있습니다.

답변:


3

이 blogpost에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 {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

정말 고마워. 오늘 확인하고 작동하는지 알려 드리겠습니다!
Paweł Sopel

불행히도이 스크립트는 매우 유용하지만 물리적 장치에 연결을 할당하는 주요 문제를 해결하지는 못합니다. 나는 그것을 해결하는 방법을 알아 냈고 곧 해결책을 게시 할 것입니다.
Paweł Sopel

2

좋아, 나는 파이썬을 사용하여 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 (nmcli와 혼동하지 말고 Modem Manager Client)라는 도구가있어 어떤 순간에 어떤 장치가 어떤 가상 포트에 연결되어 있는지 파악할 수 있습니다. 연결된 모든 모뎀을 나열하려면 다음을 호출하면됩니다.

mmcli -L

현재 연결된 모든 모뎀의 목록이 번호와 함께 반환됩니다.

모뎀에 대한 모든 세부 정보를 얻으려면 사용 가능한 포트를 포함하여 현재 상태입니다.

mmcli -m modem_number

여기서 모뎀 번호는 이전 명령에서 반환 한 모뎀 번호입니다.

grep, 정규 표현식, mmcli 및 nmcli를 사용하면 모뎀이 연결된 포트를 정확하게 결정하고 NetworkManager 연결에 바인딩 할 수 있습니다. 아래에서 작업을 수행하는 간단한 파이썬 스크립트 (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 연결 이름에 맵핑하고 연결 중 하나를 설정할 때마다이 스크립트를 실행하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.