{"id":412,"date":"2018-06-17T17:19:18","date_gmt":"2018-06-17T17:19:18","guid":{"rendered":"https:\/\/www.wpvs.de\/iot-2018\/?p=412"},"modified":"2021-05-14T10:07:05","modified_gmt":"2021-05-14T08:07:05","slug":"smartlock-6-die-kommunikation-zwischen-backend-und-der-kairos-api","status":"publish","type":"post","link":"http:\/\/www.iot-embedded.de\/iot-2018\/projekt-smart-lock\/smartlock-6-die-kommunikation-zwischen-backend-und-der-kairos-api\/","title":{"rendered":"SmartLock (6): Die Kommunikation zwischen Backend und der KAIROS API"},"content":{"rendered":"<p>Bereits in unserem ersten Blogeintrag haben wir euch unsere Architekturskizze n\u00e4hrgebracht. Dort haben wir berichtet, dass unsere Gesichtserkennung mithilfe einer Schnittstelle namens KAIROS umgesetzt wird. In diesem Blogbeitrag werde ich nun genauer beschreiben, welche KAIROS Funktionen wir f\u00fcr unser Projekt eingesetzt haben. Au\u00dferdem werde ich darauf eingehen, wie diese technisch von unserem Backend aufgerufen werden.<\/p>\n<p><a href=\"http:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/BildKAIROS.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-414\" src=\"http:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/BildKAIROS-300x152.jpg\" alt=\"\" width=\"608\" height=\"308\" srcset=\"http:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/BildKAIROS-300x152.jpg 300w, http:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/BildKAIROS-1024x520.jpg 1024w, http:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/BildKAIROS-768x390.jpg 768w, http:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/06\/BildKAIROS.jpg 1228w\" sizes=\"(max-width: 608px) 100vw, 608px\" \/><\/a><\/p>\n<p>Abbildung 1: Ein Anwendungsbeispiel der KAIROS API<\/p>\n<p>Mithilfe von KAIROS k\u00f6nnen Bilder in einer Galerie hochgeladen werden, um im Anschluss verschiedene Funktionen auf Grundlage dieser Bilder auszuf\u00fchren. Zum Aufruf der Funktionen wird als Basis der Link <a href=\"https:\/\/api.kairos.com\">https:\/\/api.kairos.com<\/a> verwendet. Diesem werden dann verschiedene Aktionsw\u00f6rter angeh\u00e4ngt. Nachfolgend sind unterschiedliche Funktionen der API und die zugeh\u00f6rigen Aktionsw\u00f6rter aufgelistet:<\/p>\n<ul>\n<li>Es k\u00f6nnen verschiedene Merkmale von Gesichtern erfragt werden. Diese Funktion wird mit dem Aufruf von \u201edetect\u201c zur Verf\u00fcgung gestellt. In Abbildung 1 ist diese Funktion noch einmal dargestellt.<\/li>\n<li>Mit KAIROS \u201eenroll\u201c kann ein Bild in der KAIROS Galerie hochgeladen werden.<\/li>\n<li>Ein \u00fcbergebenes Gesicht wird mit allen anderen Gesichtern der Galerie verglichen. Diese Funktion ist vor allem f\u00fcr unser Projekt interessant und wird unter dem Namen \u201erecognize\u201c bereitgestellt.<\/li>\n<\/ul>\n<p>Um die API nutzen zu k\u00f6nnen wird sowohl eine APP ID als auch ein API Key ben\u00f6tigt. Beide werden dem Entwickler nach der kostenlosen Registrierung zur Verf\u00fcgung gestellt. Bei einer Anfrage an die API wird sowohl die APP ID als auch der API Key als Header in der HTTP-Anfrage erwartet.<\/p>\n<p>request({<br \/>\nheaders: headers,<br \/>\nuri: url,<br \/>\nbody: JSON.stringify(payload),<br \/>\nmethod: &#8218;POST&#8216;<br \/>\n}, <strong>function <\/strong>(err, res, body) {<\/p>\n<p>Abbildung 2: HTTP-Aufruf \u00fcber die Request-Library von Node js<\/p>\n<p>In Abbildung 2 werden die verschiedenen Bestandteile der Anfrage in einem JSON-Objekt verpackt. Im Header ist neben der APP ID und dem API Key au\u00dferdem das Format der Nachricht als JSON festgeschrieben. Die URL wird in unserer Backendfunktion dynamisch festgesetzt, je nachdem welche Funktionalit\u00e4t in KAIROS aufrufen werden soll. Im Body der Nachricht sind unterschiedliche Informationen hinterlegt, die von der KAIROS API ben\u00f6tigt werden. Der Body enth\u00e4lt somit alle Parameter, die f\u00fcr den Aufruf der entsprechenden API URL ben\u00f6tigt werden. Fest definiert ist f\u00fcr jeden Aufruf das HTTP-Verb POST, da alle KAIROS Schnittstellen dieses verwenden. Kommt auf die Anfrage eine Antwort vom Server, kann diese in der Callback-Funktion verarbeitet werden. Verschiedene Anfragen an die KAIROS API k\u00f6nnen so zentral \u00fcber eine Funktion im Backend versendet werden.<\/p>\n<p>Zum korrekten Aufruf der KAIROS API ben\u00f6tigt die Backendfunktion 3 verschiedene Parameter:<\/p>\n<ul>\n<li>Den URL-Namen, der das entsprechende Aktionswort enth\u00e4lt.<\/li>\n<li>Das Bild im Base 64 Format. Das Format der Bilder ist von der KAIROS API vorgeschrieben.<\/li>\n<li>Au\u00dferdem wird die Id des KAIROS Objekts (Bildes) ben\u00f6tigt, auf dem die Aktion ausgef\u00fchrt werden soll.<\/li>\n<\/ul>\n<p>Je nach \u00fcbergebenem URL-Namen kann einer der beiden anderen Parameter (Base 64 Bilder, Id des Objekts) nicht definiert sein. Wird beispielsweise der URL-Name \u201erecognize\u201c \u00fcbergeben wird keine Id des Objekts ben\u00f6tigt, da die KAIROS API selbstst\u00e4ndig alle Bilder in der Galerie mit dem \u00fcbergebenen Bild vergleicht.<\/p>\n<p>Ich hoffe ich konnte euch einen kleinen Einblick in die KAIROS API und deren Funktionen liefern. Als n\u00e4chsten Blogpost wird Yanis die Softwarearchitektur des Python Programms vorstellen und einen Einblick in die KI geben die wir verwenden.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bereits in unserem ersten Blogeintrag haben wir euch unsere Architekturskizze n\u00e4hrgebracht. Dort haben wir berichtet, dass unsere Gesichtserkennung mithilfe einer Schnittstelle namens KAIROS umgesetzt wird. In diesem Blogbeitrag werde ich nun genauer beschreiben, welche KAIROS Funktionen wir f\u00fcr unser Projekt<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[],"_links":{"self":[{"href":"http:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts\/412"}],"collection":[{"href":"http:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/comments?post=412"}],"version-history":[{"count":1,"href":"http:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts\/412\/revisions"}],"predecessor-version":[{"id":654,"href":"http:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts\/412\/revisions\/654"}],"wp:attachment":[{"href":"http:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/media?parent=412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/categories?post=412"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/tags?post=412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}