ModemManager i dbus - wersja ~0.4.997

Wszystko na temat internetu za pomocą sieci komórkowych pod systemem Linux.

Moderator: Moderatorzy

ODPOWIEDZ
boskar
Stały użytkownik forum
Posty: 68
Rejestracja: 2010-05-05, 10:24
Lokalizacja: Katowice

ModemManager i dbus - wersja ~0.4.997

Post autor: boskar »

Witam ponownie wszystkich linuksowców, zwłaszcza tych, którym wizja stworzenia klona TopNetinfo pod Linuksa wydaje się świętym graalem ;)

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
Spróbujcie u siebie ;)
boskar
Stały użytkownik forum
Posty: 68
Rejestracja: 2010-05-05, 10:24
Lokalizacja: Katowice

Re: ModemManager i dbus - wersja ~0.4.997

Post autor: boskar »

No i poszedłem krok dalej, robiąc coś co "może już być użyteczne" :D

Tym razem wyświetla LAC i CID w formie ikonki w trayu.

Kod: Zaznacz cały

#!/usr/bin/perl
# (C) by boskar 2011
use strict;
use warnings;
use Net::DBus;
use Glib qw/TRUE FALSE/;
use Gtk2 '-init';
use Gtk2::TrayIcon;
my $icon = Gtk2::TrayIcon->new("LAC/CID");
my $vbox = Gtk2::VBox->new(0,0);
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_mod = $object->as_interface("org.freedesktop.ModemManager.Modem");
$object_mod->Enable("1");
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);
my $lac =  hex($laccidy[2]) ;
my $laclabel = Gtk2::Label->new;
$laclabel->set_markup("<span size=\"x-small\">LAC: $lac </span>");
my $cid =  hex($laccidy[3]) ;
my $cidlabel = Gtk2::Label->new;
$cidlabel->set_markup("<span size=\"x-small\">CID: $cid </span>");
$vbox->pack_start($laclabel,1,1,0);
$vbox->pack_start($cidlabel,0,0,0);
$icon->add($vbox);
$icon->show_all;
Glib::Timeout-> add(1000, sub{ &update_laccid() });
Gtk2->main();
sub update_laccid {
	$laccid = $object_loc->GetLocation();
	%hasz = %{$laccid};
	$string = $hasz{2};
	@laccidy = split ( /,/, $string);
	$lac =  hex($laccidy[2]) ;
	$cid =  hex($laccidy[3]) ;
	$laclabel->set_markup("<span size=\"x-small\">LAC: $lac </span>");
	$cidlabel->set_markup("<span size=\"x-small\">CID: $cid </span>");
	return 1;
}

Efekt widoczny tutaj:
Obrazek


Jak używać?

Zapisać cały kod do pliku tekstowego, nazwać, na przykład laccid.pl (bez żadnych .txt, to skrypt perla w końcu), nadać uprawnienia do wykonywania (chmod +x laccid.pl będąc w katalogu gdzie zapisaliśmy skrypt), i wykonać - na przykład przez ./laccid.pl w konsoli lub też przez gnome'owe Alt-F2. Wyłączamy przez Ctrl C jeśli program został odpalony w konsoli, jeśli inaczej to pozostaje killall laccid.pl.

Pomogę w razie problemów.
boskar
Stały użytkownik forum
Posty: 68
Rejestracja: 2010-05-05, 10:24
Lokalizacja: Katowice

Re: ModemManager i dbus - wersja ~0.4.997

Post autor: boskar »

Witam ponownie.

Mimo zerowego odzewu z Waszej strony rozwijam ten applecik, choćby dla siebie ;)

Wersja publiczna 2:

1. Wyświetla LAC/CID w trayu
2. Po najechaniu wyświetla informacje o BTSie zgodnie z bazą btsearch (tzn "komentarz")
3. Po kliknięciu lewym przyciskiem myszy otwiera w domyślnej przeglądarce mapę btsearch wyzoomowaną na nasz bieżący BTS
4. Po kliknięciu prawym przyciskiem myszy applet się zamyka
5. Przy zmianie BTSa applet wypluwa powiadomienie (dymek poprzez libnotify).
6. Applet do działania wymaga w swoim roboczym katalogu zmodyfikowanej bazy. clf do uzyskania z btsearch.pl (próbowałem korzystać z pełnej bazy w excelu jak top_netinfo, zdecydowanie wydajnościowo nie do zaakceptowania w tym wypadku)
7. Bezczelnie zerżnąłem z citrus modema autorstwa yanana fragmencik kodu pobierający bazy z btsearch - docelowo napiszę to w perlu i zintegruję z resztą kodu.
Mam nadzieję że autor nie ma nic przeciwko, jeśli tak - proszę pisać.


Sam program tutaj do przejrzenia tutaj:
http://paste.debian.net/130056/

do ściągnięcia: http://paste.debian.net/download/130056 (zapisać, najlepiej z rozszerzeniem .pl jak perl, na przykład laccid.pl, nadać uprawnienia wykonywania, właściwie można odpalać dwuklikem)

Oraz skrypcik (90% kodu z citrusmodem) do ściągania bazy z btsearch.pl i modyfikowania jej zgodnie z potrzebami skryptu:
http://paste.debian.net/130048/ i do ściągnięcia: http://paste.debian.net/download/130048

To najlepiej zapisać z rozszerzeniem .sh (np. downloader.sh) i nadać uprawnienia wykonywania, wykonać.

Instrukcja:

1) Ściągnąć oba pliki do jednego katalogu (downloader.sh i laccid.pl), obu nadać uprawnienia wykonywania (w konsoli chmod +x downloader.sh i chmod +x laccid.pl)
2) Uruchomić ./downloader.sh (wymaga zenity)
3) Uruchomić ./laccid.pl (wymaga perla oraz pakietów perla - w debianie:

libgtk2-trayicon-perl
libgtk2-notify-perl
libgtk2-perl
libnet-dbus-perl
libdbd-csv-perl
libdbi-perl


FAQ:
1) Nie widzi mojego modemu.
- Jeśli NetworkManager tez go nie widzi, to normalne. Jeśli widzi a mój program go nie widzi, to zmień zmienną $nrmodemu na inny, (ja korzystam z dwóch modemów, są numerowane po kolei od 0, 1, 2...)
2) Wywala "jakiś błąd"
- Sprawdź czy modem jest włączony, (nie musi być połączony z netem, ale musi być podpięty do sieci, najprościej to rozstrzygnąć po diodach modemu, choć i to zawodzi), czy ma podany PIN... Najpewniej jest po prostu się połączyć :)
- Sprawdź czy baza clf jest na miejscu i czy nazywa się btsearch_m.clf - nazwę można zmienić, jednak trzeba zmienić zawartość zmiennej $bazabts. (Najpewniej i tak nie można jej trzymać w innym katalogu niż samego programu, zostanie to naprawione później)
- Sprawdź czy baza clf zaczyna się nagłówkiem

Kod: Zaznacz cały

MCCMNC;CID;LAC;RNC;POS-LAT;POS-LON;POS-RAT;DESCRIPTION;RFU
Baza nie może zawierać linii //cell list exchange format v3.0//, musi zawierać powyższy nagłówek.

3. Po kliknięciu muszę długo czekać na otwarcie przeglądarki
- Wyszukiwanie w bazie niestety nie jest błyskawiczne, i przy bazie w tym formacie szybsze nie będzie. Rozwiązanie? Zmniejsz bazę generując sobie .clf z btsearch tylko dla Twojego operatora,i podmień nagłówki zgodnie z tym co powyżej.

4. Jakiś błąd SQL (SELECT itd) lub też nie widać opisu BTSa a jedynie same CID/LAC - być może w bazie nie ma Twojego BTSa/używasz złego województwa/masz bazę która nie uwzględnia Twojego operatora...

Najpewniej jednak wywołałeś program z innego katalogu niż bieżący, na ten moment program szuka bazy tylko w bieżącym katalogu (zostanie naprawione niebawem).

5. BTSy zmieniają się często i mam już dość powiadomień
- zmień zmienną notyfikacje na FALSE

6. Korzystam z modułu HSO (option) i mimo że na pewno BTS uległ zmianie program tego nie wykrywa
- bug w ModemManagerze, zgłoszony przeze mnie dalej: https://bugs.launchpad.net/modemmanager/+bug/822293

7. Dlaczego to wymaga NetworkManagera?
- Bo network/modem manager działa poprawnie, i blokuje wszystkie (albo prawie wszystkie) porty modemu, zatem żeby coś z modemu wyciągnąć należy użyć jego pośrednictwa.

8. Jak uruchamiać program przy starcie?
W gnome:
System → preferencje → programy startowe → dodaj.
Nazwa dowolna, byleśmy ją sami zapamiętali, polecenie - wyklikać plik którego zamierzamy używać, komentarz można zostawić pusty, tylko lepiej mieć wtedy skrypt i bazę w swoim katalogu domowym, w innym wypadku baza nie zadziała.

9. Gdzie są screenshoty?
Obrazek



Obrazek
Ostatnio zmieniony 2011-09-16, 16:05 przez boskar, łącznie zmieniany 1 raz.
Cezary
Stały użytkownik forum
Posty: 123
Rejestracja: 2010-11-11, 18:04
Lokalizacja: Warszawa

Re: ModemManager i dbus - wersja ~0.4.997

Post autor: Cezary »

Są też inny użytkownicy :)

Czasami zdarza się że GetLocation() z jakiegoś magicznego powodu nie zwraca danych.
https://eko.one.pl - prawie wszystko o OpenWrt
boskar
Stały użytkownik forum
Posty: 68
Rejestracja: 2010-05-05, 10:24
Lokalizacja: Katowice

Re: ModemManager i dbus - wersja ~0.4.997

Post autor: boskar »

Cóż, kto by się tam dbał o tą część API ModemManagera której nie wykorzystuje żaden program, no poza tym applecikiem ;)

Ale muszę powiedzieć że u mnie nie jest tak źle, dzisiaj też mi nie zwracał danych to się okazało że miałem ustawiony nie ten modem co trzeba.
Cezary
Stały użytkownik forum
Posty: 123
Rejestracja: 2010-11-11, 18:04
Lokalizacja: Warszawa

Re: ModemManager i dbus - wersja ~0.4.997

Post autor: Cezary »

Nie, poziom sygnału jest zwracany. Po prostu lac/cid nie jest. Czasami :)
https://eko.one.pl - prawie wszystko o OpenWrt
boskar
Stały użytkownik forum
Posty: 68
Rejestracja: 2010-05-05, 10:24
Lokalizacja: Katowice

Re: ModemManager i dbus - wersja ~0.4.997

Post autor: boskar »

A MCC/MNC?
W końcu też są odpowiedzią na metodę GetLocation().

A o poziom sygnału pewnie dbają, bo korzysta z tego właściwy NetworkManager i jego applet. A kto wpadł na pomysł standaryzowania poziomu sygnału (CSQ-> %) na tak niskim poziomie to nie wiem.
Cezary
Stały użytkownik forum
Posty: 123
Rejestracja: 2010-11-11, 18:04
Lokalizacja: Warszawa

Re: ModemManager i dbus - wersja ~0.4.997

Post autor: Cezary »

Też nie.
https://eko.one.pl - prawie wszystko o OpenWrt
boskar
Stały użytkownik forum
Posty: 68
Rejestracja: 2010-05-05, 10:24
Lokalizacja: Katowice

Re: ModemManager i dbus - wersja ~0.4.997

Post autor: boskar »

No to kolejna wersja, wersja publiczna 0.3

http://paste.debian.net/131101/

Zmiany:
- Wykrywanie jakichśtam błędów
- Wyświetlanie zużytego transferu w bieżącej sesji

Dodatkowe wymagania:
- libformat-human-bytes-perl
- ustawienie numeru kolejnego urządzenia wg NM (u mnie "2", 0 to sieć kablowa a 1 to WiFi) - postaram się to wyeliminować później
boskar
Stały użytkownik forum
Posty: 68
Rejestracja: 2010-05-05, 10:24
Lokalizacja: Katowice

Re: ModemManager i dbus - wersja ~0.4.997

Post autor: boskar »

Pomijając fakt, że powolutku sobie to rozwijam, właśnie dopadła mnie nowa wersja NetworkManagera (bodajże 0.9 z 0.8.cośtam), zgodna z nowym, gorszym API.

Tradycyjnie już środowiska zajmujące się tymi programami dbają o to, żeby funkcjonalności ubywało.
Along with this change, the org.freedesktop.NetworkManager.Device.Serial interface has been removed as it's functionality will be incorporated into the org.freedesktop.NetworkManager.Device.Modem interface in the future.
http://projects.gnome.org/NetworkManage ... ating.html

Poza tym skonsolidowano urządzenia CDMA/EVDO z GSM/UMTS, ponieważ pojawiły się na rynku urządzenia typu combo a typ musi być jednoznaczny.

Zatem niestety chwilowo, do czasu nowych wersji NM statystyki połączenia nie będą działać. :(
ODPOWIEDZ