Linux, GSM, nmcli - ทำงานกับสองโมเด็ม GSM และการเชื่อมต่อ


2

ฉันมีสถานการณ์ต่อไปนี้

ฉันมีโมเด็ม USB สองอัน (โมเด็ม Huwawei LTE หนึ่งตัว, โมเด็ม ZTE 3G หนึ่งอัน) พร้อมด้วยซิมการ์ดที่แตกต่างกันสองอันจากผู้ให้บริการที่ต่างกันสองคน (สีส้มและเล่นได้เฉพาะ)

การใช้ตัวจัดการเครือข่ายฉันต้องการสร้างการเชื่อมต่อสองรายการและผูกการเชื่อมต่อแต่ละครั้งกับอุปกรณ์เฉพาะ อย่างไรก็ตามการเชื่อมต่อนี้ดูเหมือนว่าจะใช้เพียงโมเด็มเดียว (อยู่ในรายการ / dev / cdc-wdm0) ซึ่งถูกผูกไว้กับอุปกรณ์ ZTE หากทั้งสองเชื่อมต่อพร้อมกัน ฉันยังมีอุปกรณ์สองชิ้นที่อาจเชื่อมโยงกับอุปกรณ์ / dev / ttyUSB บางตัว - / dev / gsmmodem และ / dev / gsmmodem2

สิ่งที่ฉันต้องการบรรลุคือสถานการณ์ต่อไปนี้:

  1. การเชื่อมต่อ - โมเด็ม Huwawei LTE, ผู้ให้บริการสีส้ม, ชื่อ orange_primary นำขึ้นมาโดยใช้ nmcli con ขึ้น orange_primary ถ้ามันล้มเหลวการเรียก nmcli ล้มเหลว

  2. การเชื่อมต่อ B - โมเด็ม ZTE 3G, ผู้ให้บริการเล่น, ชื่อ play_backup, ทำให้มีชีวิตชีวาโดยการเรียกใช้ nmcli con up play_backup ถ้ามันล้มเหลวการเรียก nmcli ล้มเหลว

สิ่งที่ฉันมีตอนนี้:

การเชื่อมต่อทั้งสองใช้โมเด็ม ZTE 3G ที่ระบุว่าเป็น / dev / cdc-wdm0 โมเด็มนี้มี Play Sim Card อยู่ แต่เมื่อฉันเรียก nmcli con ขึ้นมาสีส้มก็ยังคงเชื่อมต่อผ่านโมเด็ม / ซิมการ์ด / ผู้ให้บริการนี้เพราะฉันเชื่อว่า APN ชื่อและหมายเลขเข้าใช้เหมือนกันสำหรับทั้งสอง

ฉันใช้ nmcli 0.9.10.0 บน Debian 8 (Jessie)

คำตอบ:


3

มีเชลล์สคริปต์ (ตาม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 ด้วยการใช้งานของหลาม

ดังนั้นโดยทั่วไปแล้วการเชื่อมต่อโมเด็ม USB ใน nmcli จะไม่ถูกผูกไว้กับอุปกรณ์เฉพาะโดยค่าเริ่มต้นเนื่องจากพอร์ต (เช่น / 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

โดยที่หมายเลขโมเด็มคือหมายเลขของโมเด็มที่ส่งคืนโดยคำสั่งก่อนหน้า

โดยการใช้ 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 ของคุณและเรียกใช้สคริปต์นี้ทุกครั้งที่คุณต้องการสร้างการเชื่อมต่อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.