
Można tutaj znaleźć parę programów do zarządzania łączem, sprawdzania CID i LAC, jednak w większości bazują one na dostępie do urządzenia poprzez wvdial/gammu, tymczasem NetworkManager wraz z ModemManagerem "po prostu działają", ale nie dostarczają dostępu do tych funkcji o które nam chodzi, jak kody USSD i sprawdzanie BTSa.
Okazuje się jednak, że w samych usługach jednak przewidziano coś więcej niż daje klikalny intefejs, i użycie w/w funkcji jest możliwe za pośrednictwem ModemManagera (czyli na przykład wtedy, kiedy NM zajął nam oba porty i sprawdzenie tego komendami AT nie wchodzi w grę) jest możliwe.
Jak tego dokonać?
Należy użyć mechanizmu dbus.
Najprościej pogrzebać w tej usłudze za pośrednictwem programu D-feet.
Należy za jego pomocą połączyć się z System Bus (szyną systemową, nie sesji),
następnie wejść w org.freedesktop.ModemManager.
Tam ujrzymy ścieżki obiektów /org/freedesktop/ModemManager (ogólną dla usługi)
oraz dla każdego modemu /org/freedesktop/ModemManager/Modems/<id modemu>.
Dla każdego modemu znajdziemy szereg intefejsów dbus w ścieżce obiektu:
org.freedesktop.ModemManager.Modem.USSD - pozwala wysyłać USSD i odbierać wiadomości zwrotne
org.freedesktop.ModemManager.Modem.Location - służy "lokalizacji" - tutaj metodą GetLocation() dostaniemy CID i LAC BTSa (po uprzednim włączeniu metodą Enable - w polu parameters należy wpisać "1","1")
org.freedesktop.ModemManager.Modem.Gsm.Network metodą GetSignalQuality pozwoli nam na sprawdzenie CSQ - wynik w formie znormalizowanej (%) - wg wzoru (CSQ*100)/31 gdzie CSQ przyjmuje od 0-31.
Można za pomocą tego mechanizmu zmienić PIN, itd itp.
Po co to piszę? Jako użytkownik NetworkManagera (choć w sumie wcale nie przepadam za tymi rozwiązaniami) uważam że przydałoby się narzędzie uzupełniające to, czego NetworkManager jako taki nie potrafi, a co przewidziano w ModemManagerze. Oczywiście nadal bylibyśmy ograniczeni ModemManagerem, ale byłby to jakiśtam krok naprzód.
Prawdopodobnie na swoje potrzeby niebawem napiszę jakieś proste narzędzie które wykorzystuje wspomniane metody, jeśli będzie się do tego nadawało oczywiście podzielę się

[ Dodano: 2011-08-06, 19:30 ]
Jak powiedział, tak zrobił. Na ten moment mamy sprawdzanie siły sygnału z nieudaną próbą przeliczenia spowrotem na CSQ, MCC, MNC, LAC i CID.
Niestety, wszystko wskazuje na to, że dane są pobierane z opóźnieniem (dużym?) i po zmianie BTSa występują rozbieżności względem tego co mówi AT+CREG? i dane z ModemManagera.
Program w perlu:
Kod: Zaznacz cały
#!/usr/bin/perl
#(C) by boskar 2011
use strict;
use warnings;
use Net::DBus;
my $bus = Net::DBus->system;
my $service = $bus->get_service("org.freedesktop.ModemManager");
my $object = $service->get_object("/org/freedesktop/ModemManager/Modems/0");
my $object_netw = $object->as_interface("org.freedesktop.ModemManager.Modem.Gsm.Network");
print "Siła sygnału znormalizowana: " . $object_netw->GetSignalQuality() . "\n";
my $csq = $object_netw->GetSignalQuality() * 31 / 100;
print "CSQ: " . $csq . "\n" ;
my $object_loc = $object->as_interface("org.freedesktop.ModemManager.Modem.Location");
$object_loc->Enable("1","1");
my $laccid = $object_loc->GetLocation();
my %hasz = %{$laccid};
my $string = $hasz{2};
my @laccidy = split ( /,/, $string);
print "MCC: " . $laccidy[0] . "\n" ;
print "MNC: " . $laccidy[1] . "\n" ;
print "LAC w hex: " . $laccidy[2] . "\n" ;
print "CID w hex: " . $laccidy[3] . "\n" ;
print "LAC w dec: " . hex($laccidy[2]) . "\n" ;
print "CID w dec: " . hex($laccidy[3]) . "\n" ;
Wynik jego działania:
Kod: Zaznacz cały
$ ./bts.pl
Siła sygnału znormalizowana: 6
CSQ: 1.86
MCC: 260
MNC: 02
LAC w hex: XXXX
CID w hex: XXXX
LAC w dec: XXXXX
CID w dec: XXXXX
