Entwicklung

Wenn Ihr eigene Applikationen entwickeln möchtet könnt Ihr mit Euren Applikationen über eine XML Api mit dem airpi-control Server kommunizieren um Dienste zu steuern und den Status von laufenden Diensten abzufragen.

Die Api wird mit jedem neuen Dienst ausgebaut und hier dokumentiert.

Wenn ein Kommando per Api an den airpi-control Server abgesetzt wird quittiert der Server nach Bearbeitung die Ausführung durch Rückgabe der config.xml. Aus der config.xml können sämtliche Einstellungen ausgelesen werden. Der Status der einzelnen Dienste kann ebenfalls ausgelesen werden.

1. Api XML Grundgerüst

2. Api XML Elemente

3. Python Beispiel zur Übertragung der XML Dateien an den Server

 

Api XML Grundgerüst

Jeder Befehl besteht aus 3 Elementen die in einem command Block eingebettet sind. Die Elemente sind <type>, <entity> und <param>

Es können mehrere command Blöcke im übergeordneten commands Block eingefügt werden um die airpi-control anzuweisen mehrere Befehle nacheinander auszuführen.

Die XML sieht so aus:

<?xml version="1.0" encoding="utf-8"?>
<commands>
<command>
<type>Kommandotyp</type>
<entity>Kommandoziel</entity>
<param>Kommandoparameter</param>
</command>
</commands>

oder im Fall mehrere Kommandos so:

<?xml version="1.0" encoding="utf-8"?>
<commands>

<command>
<type>Kommandotyp1</type>
<entity>Kommandoziel1</entity>
<param>Kommandoparameter1</param>
</command>

<command>
<type>Kommandotyp2</type>
<entity>Kommandoziel2</entity>
<param>Kommandoparameter2</param>
</command>

<command>
<type>Kommandotyp3</type>
<entity>Kommandoziel3</entity>
<param>Kommandoparameter3</param>
</command>

</commands>

 

Api XML Elemente

Jeder Dienst hat verschiedene <type>, <entity> und <param> Elemente die benötigt werden um eine Aktion auszulösen. Aktuell sind folgende Dienste und die dazugehörigen Kommand Elemente verfügbar:

 


<type>udp_pipe</type> schreibt in eine der 5 udp Pipes.

<entity>Zahl</entity> ist die Nummer der Pipe (1-5), die geändert werden soll

<param>Pipe</param> der Inhalt der Pipe


 

<type>rtsp_pipe</type> schreibt in eine der 5 rtsp Pipes.

<entity>Zahl</entity> ist die Nummer der Pipe (1-5), die geändert werden soll

<param>Pipe</param> der Inhalt der Pipe


<type>udp_setpipe</type> setzt eine udp Pipe aktiv, so dass sie beim starten des UDP Dienstes benutzt wird.

<entity>Zahl</entity> ist die Nummer der Pipe (1-5)

<param></param> ist leer oder beliebig.


<type>rtsp_setpipe</type> setzt eine rtsp Pipe aktiv, so dass sie beim starten des RTSP Dienstes benutzt wird.

<entity>Zahl</entity> ist die Nummer der Pipe (1-5)

<param></param> ist leer oder beliebig.


<type>action</type> führt eine Aktion aus 

<entity>Name</entity> beinhaltet den Namen der Aktion. Zur Zeit gehen folgende Aktionen:

<entity>udp_start</entity> startet den UDP Dienst mit der vorgewählten Pipe

<entity>udp_stop</entity> stoppt den laufenden UDP Dienst

<entity>rtsp_start</entity> startet den RTSP Dienst mit der vorgewählten Pipe

<entity>rtsp_stop</entity> stoppt den laufenden RTSP Dienst

<entity>airpi_reboot</entity> startet den raspberry neu

<entity>airpi_shutdown</entity> fährt den raspberry ordnungsgemäß herunter

<param></param> ist leer oder beliebig.


 

Python Beispiel zur Übertragung der XML Dateien an den Server

Beispiel zum herunterfahren des Airpi über die XML-API

Die test.xml liegt im lokalen pfad mit folgendem Inhalt:

<?xml version="1.0" encoding="utf-8"?>
<commands>
<command>
<type>action</type>
<entity>airpi_shutdown</entity>
<param></param>
</command>
</commands>

Das Python Skript schickt die XML Datei an die airpi-control Api und gibt die Rückgabe (config.xml) auf der Kommandozeile aus:

import xml.etree.ElementTree as ET 

tree = ET.parse("text.xml")                                                                                     #lokale test.xml Datei einlesen
root = tree.getroot()
xml = ET.tostring(root)                                                                                          #XML Objekt zu String konvertieren

import urllib.request

import urllib.parse

url = "http://airpi/api.php" #hostnamen oder IP des Airpi
data = urllib.parse.urlencode({'commands': xml})                                                       #data beinhaltet 'commands' (die Zielvariable im PHP) mit dem Wert des XML Strings
data = data.encode('utf-8')                                                                                     #noch brav in UTF-8 kodieren
req = urllib.request.Request(url, data, header)                                                            #Request mit Post Daten absetzten
req.add_header("Content-Type","application/x-www-form-urlencoded;charset=utf-8")
f = urllib.request.urlopen(req, data)

print(f.read()) #parse f to pull out hash                                                                     #Rückgabe des Servers ausgeben (In unserem Fall die config.xml)

 

Die Rückgabe könnte so aussehen:

<?xml version="1.0" encoding="utf-8"?>
<Config>

<rtsp_state>0</rtsp_state>
<rtsp_path>/home/pi/gst-server-1.4.1/examples/</rtsp_path>
<rtsp_pipe_active>rtsp_pipe_2</rtsp_pipe_active>
<rtsp_pipe_1>test-launch "(rpicamsrc bitrate=6500000 hflip=true vflip=true preview=false ! video/x-h264,width=1280,height=720,framerate=49/1,profile=high ! h264parse ! rtph264pay name=pay0 pt=96 )"</rtsp_pipe_1>
<rtsp_pipe_2>test-launch "(rpicamsrc bitrate=5500000 hflip=true vflip=true preview=false ! video/x-h264,width=1280,height=720,framerate=49/1,profile=high ! h264parse ! rtph264pay name=pay0 pt=96 )"</rtsp_pipe_2>
<rtsp_pipe_3>test-launch "(rpicamsrc bitrate=4500000 hflip=true vflip=true preview=false ! video/x-h264,width=1280,height=720,framerate=49/1,profile=high ! h264parse ! rtph264pay name=pay0 pt=96 )"</rtsp_pipe_3>
<rtsp_pipe_4/>
<rtsp_pipe_5/>

<udp_state>0</udp_state>
<udp_pipe_active>udp_pipe_2</udp_pipe_active>
<udp_pipe_1>raspivid -n -w 1280 -h 720 -b 6500000 -fps 49 -vf -hf -t 0 -pf high -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay ! udpsink host=192.168.178.105 port=9000</udp_pipe_1>
<udp_pipe_2>raspivid -n -w 1280 -h 720 -b 5500000 -fps 49 -vf -hf -t 0 -pf high -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay ! udpsink host=192.168.178.105 port=9000</udp_pipe_2>
<udp_pipe_3>raspivid -n -w 1280 -h 720 -b 4500000 -fps 49 -vf -hf -t 0 -pf high -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay ! udpsink host=192.168.178.105 port=9000</udp_pipe_3>
<udp_pipe_4/>
<udp_pipe_5/>

</Config>

Die Felder <rtsp_state> und <udp_state> zeigen an ob gerade ein udp bzw. rtsp Stream läuft. Die Felder nehmen den Wert 1 oder 0 an.

Die Felder <rtsp_pipe_active> und <udp_pipe_active> geben an welche Pipe vorgewählt wurde und beim Starten des Streams benutzt werden.

Die Felder <rtsp_pipe_N> und <udp_pipe_N> beinhalten die abgespeicherten Pipes. N kann 1-5 sein.