Raspberry Pi i OSMC: zdalne sterowanie za pomocą JSON-RPC (po HTTP)

Przygotowuję się teraz do stworzenia oprogramowania sterującego komponentem multimedialnym. Zamierzeniem jest napisanie prostej aplikacji na smartfona (Android). Dzięki niej, podstawowe operacje jak regulacja głosu czy odtworzenie elementu z listy ulubionych, będzie można wykonać znacznie szybciej niż  w przypadku Kore czy Yatse. Sama aplikacja ma się komunikować z OSMC za pomocą odpowiednio spreparowanych zapytań wysyłanych po HTTP metodą GET. (czyli takich, które możecie wysyłać np. wpisując je w przeglądarce).

Kodi udostępnia interfejs pozwalających na zdalne sterowanie systemem (np. zmianę poziomu głośności czy odtworzenie wybranego utworu). Interfejs ten nazywa się JSON – RPC (JavaScript Object Notation – Remote Procedure Calls, jak sądzę). JSON-RPC może być wykorzystywany przez TCP lub HTTP. Tutaj zajmę się tym drugim przypadkiem, gdyż umożliwia on wywoływanie Kodi za pomocą odpowiednich komend wpisywanych w przeglądarce internetowej (np. Firefox).

Dla ścisłości: OSMC to dystrybucja, która zamieni Wasze Raspberry Pi w prawdziwe centrum multimedialne. Jej częścią jest Kodi – aplikacja, która udostępnia odtwarzanie mediów. Kodi wcześniej nazywał XBMC a OSMC Raspbmc.

Zanim jednak zaczniecie, warto poznać adres IP Waszej Raspberry i podłączyć się do niej za pomocą ssh.

Podłączenie ssh do Raspberry Pi

Teraz podłączymy się do Raspberry Pi za pomocą konsoli ssh.

Podłączcie Raspberry do swojej sieci domowej. Włączcie ją do zasilania i poczekajcie, aż załaduje się system. Sprawdźcie adres IP swojego komputera. Na Windows możecie użyć polecenia „ipconfig all” wydanego z linii komend.  Na komputerze z linux:

Widać, że jedynym interfejsem, który dostał adres IP jest „enp2so” i jego adres to 192.168.0.108. Poszukamy teraz adresu Raspberry – a wykorzystam do tego narzędzie nmap

Narzędzie NMAP jest również dostępne na Windows.

NMAP znalazł urządzenia na adresach ip 192.168.0.1, *.101, *.105, *.106, *.107 i *.108. Niestety NMAP nie podpowiedział mi nazw urządzeń, muszę więc trochę pozgadywać wywołując ssh na znalezionych adresach IP:

Teraz już wiem, że moja OSMC ma adres 192.168.0.107. Oczywiście (zależnie od konfiguracji Waszej sieci) ten adres może się zmienić między kolejnymi restartami Raspberry (na tym właśnie polega różnica między adresem przydzielanym statycznie a DHCP).

Zamiast komendy ssh, na Windows możecie użyć programu Putty.

Na wszelki wypadek, po zalogowaniu do OSMC (użytkownik domyślny: osmc, hasło: osmc), warto odświeżyć system

Serwer HTTP

Kodi wyposażono w serwer http. Serwer http możecie włączyć w ustawieniach Kodi. Stamtąd możecie też odczytać też port serwera.

Sprawdźcie, być może serwer już działa: w przeglądarce wpiszcie adres IP Raspberry z OSMC (sprawdziliście go powyżej) a po nim „:” i numer portu serwera (domyślnie 8080), np: „http://192.168.0.107:8080„. Zobaczycie wtedy całkiem ładny interfejs graficzny:

Jeżeli nie działa – upewnijcie się, że wpisaliście dobry adres i port.

Jeżeli dalej nie działa, być może wpisaliście zły port. Możecie sprawdzić go w pliku „/home/osmc/.kodi/userdata/guisettings.xml” (Linux, pod Windows: %APPDATA%\kodi\userdata):

Tutaj element „<webserverport>” wskazuje, że serwer powinien być na porcie 8080 (czyli po adresie Raspberry powinno być: „:8080”).

Jeżeli dalej (!) nie działa (instrukcja), najłatwiej stworzyć plik advancedsettings.xml w katalogu „/home/osmc/.kodi/userdata”:

Teraz już naprawdę powinino zadziałać. Jeżeli nie – to odsyłam do dokumumentacji kodi.

Pierwszy „request”…

Dokumentację interfejsu wersji 8 Kodi 17 (Krypton) znajdziecie tutaj.

Generalnie dla HTTP zabawa sprowadza się do wpisania w polu adresu przeglądarki konkretnej komendy i wysłaniu jej do Kodi. W odpowiedzi dostaniecie np. potwierdzenie, listę opcji – jako stronę z tekstem.

Zapytanie ma format:

Adres IP i port będą zależeć od Waszej sieci, u mnie będzie to:

Sam <url> to właściwie komenda, jaką Kodi ma dla Was wykonać. Komendę zapisujemy zgodnie z formatem JSON. Na pierwszy rzut oka nie jest on może specjalnie przejrzysty, ale można się przyzwyczaić.

Kilka uwag na temat JSON zamieściłem na końcu tego tekstu.

Jeżeli wywołacie Kodi z pustym <url> dostaniecie stronę z listą dostępnych wywołań interfejsu JSON-RPC:

Głośniej/ciszej

Sprawdzenie głośności:

i odpowiedź:

Oznacza to, że głośność ustawiona jest na 50%.

Zwróćcie uwagę na argument: „id”. Zawiera on numer porządkowy komendy. Właściwie nie musicie zmieniać jego wartości (zawsze może być „1”), ale musicie go dodawać do wywołań.

Zmiana głośności na 100%:

I wyciszenie (mute):

Komenda to „przełącza” z między wyciszeniem i włączeniem dźwięku. Gdy użycie tej komendy spowoduje wyciszenie dźwięku, Kodi zwróci:

Gdy użycie tej komendy spowoduje ponowne włączenie dźwięku, Kodi zwróci:

Lista ulubionych

Pobranie listy ulubionych:

A tu więcej szczegółów, które pozwolą na odtworzenie:

i wyjście:

Szczególnie zainteresuje nas tu parametr „path”. dzięki któremu będzie można odtworzyć dany element z listy ulubionych. Parametr „thumbnail” zawiera adres obrazka, który reprezentuje dany element.

Odtwarzanie z listy ulubionych

Przyznam się… że nie doczytałem dokumentacji. Zamiast tego uruchomiłem Wiresharka i odtworzyłem element z listy ulubionych przez interfejs webowy OSMC (u mnie: pod adresem 192.168.0.107:8080. Podglądając ramki z wiresharka,

Przechwycona sekwencja była następująca:

  • Favourites.GetFavourites (jak powyżej)
  • Playlist.Clear: wyczyszczenie listy do odtwarzania,
  • Playlist.Insert: włożenie elementu na listę do odtwarzania,
  • Player.Open: odtworzenie elementu z listy.

Powyższe wymaga czterech wywołań przeglądarki:

Teraz Kodi powininen już odtwarzać pozycję z listy Waszych ulubionych:)

Restart i zamknięcie systemu

Możecie zdalnie zrestartować system:

…lub  zdalnie wyłączyć OSMC:

 

Kilka pomocnych poleceń

Sprawdzenie wersji OSMC (na Raspberry):

Sprawdzenie wersji Kodi na OSMC:

JSON

JSON to język służący do opisywania obiektów za pomocą tekstu – który można potem łatwo przesyłać np. między serwerem a przeglądarką.

Dane w JSON zapisywane są za pomocą par „pole”:”wartość”. Na przykład:

„volume”:50

Oznacza, że pole „volume” (głośność) przyjmuje wartość 50.  Wartość pola może też być tablicą:

„favourites”: [
{ „path”:”…”, „thumbnail”:”…”, „title”:”…” },
{ „path”:”…”, „thumbnail”:”…”, „title”:”…” },
]

Praktycznie, weźmy jedną z metod interfejsu Kodi:

Widzimy stąd, że:

  • Application.GetProperties jest metodą (funkcją, można ją wywołać),
  • pole „description” opisuje jej funkcjonalność,
  • pole „params” odnosi się do jej parametrów wejściowych (te, które trzeba podać w wywołaniu),
  • pole „returns” określa to, co metoda ta zwróci.

Parametry wejściowe „params” są listą „properties”, w wywołaniu napiszemy więc:

…, „params”:{„properties”:[„volume”,”muted”,”name”,”version”]}

„volume”,”muted”,”name”,”version” zdefiniowane są w Application.Property.Name. Pełne wywołanie:

 

Źródła

Dodaj komentarz