{"id":119,"date":"2019-03-19T13:37:29","date_gmt":"2019-03-19T12:37:29","guid":{"rendered":"https:\/\/azure.teamprojects.de\/?page_id=119"},"modified":"2019-03-21T10:16:10","modified_gmt":"2019-03-21T09:16:10","slug":"raspberry-pi-tutorial-1","status":"publish","type":"page","link":"https:\/\/azure.teamprojects.de\/?page_id=119","title":{"rendered":"Raspberry Pi Tutorial 1"},"content":{"rendered":"\n<p>Einrichten und C2D Nachrichten empfangen<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_17 counter-hierarchy counter-decimal ez-toc-grey\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" style=\"display: none;\"><i class=\"ez-toc-glyphicon ez-toc-icon-toggle\"><\/i><\/a><\/span><\/div>\n<nav><ul class=\"ez-toc-list ez-toc-list-level-1\"><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/azure.teamprojects.de\/?page_id=119\/#Einleitung\" title=\"Einleitung\">Einleitung<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/azure.teamprojects.de\/?page_id=119\/#Voraussetzungen\" title=\"Voraussetzungen:\">Voraussetzungen:<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/azure.teamprojects.de\/?page_id=119\/#Ziel\" title=\"Ziel:\">Ziel:<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/azure.teamprojects.de\/?page_id=119\/#Vorbereitung\" title=\"Vorbereitung:\">Vorbereitung:<\/a><ul class=\"ez-toc-list-level-3\"><li class=\"ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/azure.teamprojects.de\/?page_id=119\/#Raspberry_Pi_vorbereiten_wenn_das_Betriebssystem_schon_installiert_ist_weiter_bei_Schritt_2\" title=\"Raspberry Pi vorbereiten (wenn das Betriebssystem schon installiert ist, weiter bei Schritt 2)    \">Raspberry Pi vorbereiten (wenn das Betriebssystem schon installiert ist, weiter bei Schritt 2)    <\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/azure.teamprojects.de\/?page_id=119\/#Raspberry_Pi_aktualisieren\" title=\"Raspberry Pi aktualisieren  \">Raspberry Pi aktualisieren  <\/a><\/li><\/ul><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/azure.teamprojects.de\/?page_id=119\/#Erste_Schritte\" title=\"Erste Schritte:\">Erste Schritte:<\/a><ul class=\"ez-toc-list-level-3\"><li class=\"ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/azure.teamprojects.de\/?page_id=119\/#Die_iot-hub_Bibliothek_installieren\" title=\"Die iot-hub Bibliothek installieren\">Die iot-hub Bibliothek installieren<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/azure.teamprojects.de\/?page_id=119\/#Anlegen_des_Geraets_in_IoTHub\" title=\"  Anlegen des Ger\u00e4ts in IoTHub\">  Anlegen des Ger\u00e4ts in IoTHub<\/a><\/li><\/ul><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/azure.teamprojects.de\/?page_id=119\/#Den_Code_schreiben\" title=\"Den Code schreiben\">Den Code schreiben<\/a><ul class=\"ez-toc-list-level-3\"><li class=\"ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/azure.teamprojects.de\/?page_id=119\/#Das_Grundgeruest\" title=\"Das Grundger\u00fcst: \">Das Grundger\u00fcst: <\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/azure.teamprojects.de\/?page_id=119\/#Der_Client\" title=\" Der Client \"> Der Client <\/a><\/li><\/ul><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/azure.teamprojects.de\/?page_id=119\/#Cloud-to-Device_Nachrichten\" title=\"Cloud-to-Device Nachrichten\">Cloud-to-Device Nachrichten<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/azure.teamprojects.de\/?page_id=119\/#Reaktion_auf_Nachrichten\" title=\"Reaktion auf Nachrichten\">Reaktion auf Nachrichten<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/azure.teamprojects.de\/?page_id=119\/#Weitere_Tutorials\" title=\"Weitere Tutorials\">Weitere Tutorials<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Einleitung\"><\/span>Einleitung<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>In diesem Tutorial geht\nes darum, einen RaspberryPi 3 mit dem Clouddienst Microsoft Azure zu\nverbinden. Im ersten Teil des Tutorials werden wir einen Client auf\ndem RaspberryPi programmieren, der mit einem Azure IoT Hub verbunden\nwird und Cloud-To-Device Nachrichten empfangen kann.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"1024\" src=\"https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/Pi-1024x1024.png\" alt=\"\" class=\"wp-image-120\" srcset=\"https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/Pi-1024x1024.png 1024w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/Pi-150x150.png 150w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/Pi-300x300.png 300w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/Pi-768x768.png 768w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/Pi.png 1200w\" sizes=\"(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption>Verwendete Hardware: Raspberry Pi 3<\/figcaption><\/figure>\n\n\n\n<h2><span class=\"ez-toc-section\" id=\"Voraussetzungen\"><\/span>Voraussetzungen:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Dieses Tutorial geht\ndavon aus, das Erfahrung mit Programmierung vorhanden sind, setzt\naber keine Erfahrungen mit Raspbian, GPIO Mikroprozessoren (Pi,\nArduino etc.) oder Python voraus.<\/p>\n\n\n\n<h2><span class=\"ez-toc-section\" id=\"Ziel\"><\/span>Ziel:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Ziel ist es\ncloud-to-device Nachrichten mittels Microsoft Azure IoT Hub zu\nversenden, die vom Raspberry Pi angenommen werden und zu einer\nReaktion (z.B. Ver\u00e4nderung des Zustands einer angeschlossenen LED)\nf\u00fchren.<\/p>\n\n\n\n<p><strong>Beispiel Nutzungen:<\/strong><\/p>\n\n\n\n<p>&#8211;\nSmarthome System wie z.B. automatische Roll\u00e4den<\/p>\n\n\n\n<p>&#8211;\nFerngesteuerte Servomotoren f\u00fcr eine Webcam<\/p>\n\n\n\n<p>&#8211;\nEinfache Wand montierte Informationstafel<\/p>\n\n\n\n<h2><span class=\"ez-toc-section\" id=\"Vorbereitung\"><\/span>Vorbereitung:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3><span class=\"ez-toc-section\" id=\"Raspberry_Pi_vorbereiten_wenn_das_Betriebssystem_schon_installiert_ist_weiter_bei_Schritt_2\"><\/span>Raspberry Pi vorbereiten (wenn das Betriebssystem schon installiert ist, weiter bei Schritt 2) <br><br> <span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Um\ndas RaspberryPi nutzen zu k\u00f6nnen muss ein Betriebssystem installiert\nwerden, daf\u00fcr bietet sich Raspbian an, das speziell zu diesem Zweck\nentwickelt wurde. Um dieses Betriebssystem auf dem Pi zu installieren\nverwenden wir NOOBS, die New-Out-Of-Box-Software die auf der\nRaspberry Pi Website heruntergeladen werden kann.<\/p>\n\n\n\n<p>Die\n.zip Datei muss auf die microSD Karte des Pis extrahiert werden.<\/p>\n\n\n\n<p>Sollte\ndas Raspberry Pi bereits mit vorinstalliertem NOOBS auf der microSD\nKarte gekommen sein, k\u00f6nnen sie dies \u00fcberspringen.<\/p>\n\n\n\n<p>Um\ndie Installation am Pi ausf\u00fchren zu k\u00f6nnen sollten sie Tastatur,\nMaus und einen Bildschirm anschlie\u00dfen. Wenn sie nun die SD-Karte mit\nNOOBS in den Slot des Pis stecken und ihn dann starten indem sie das\nNetzteil anschlie\u00dfen, sollte ein Fenster auftauchen, in dem Gefragt\nwird, welches Betriebssystem installiert werden soll. W\u00e4hlen sie\n\u201eRaspbian\u201c und installieren sie es. \n<\/p>\n\n\n\n<h3><span class=\"ez-toc-section\" id=\"Raspberry_Pi_aktualisieren\"><\/span>Raspberry Pi aktualisieren  <span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Die\nInstallation wird einige Zeit in Anspruch nehmen. Wenn sie\nabgeschlossen ist, nehmen sie sich etwas Zeit um sich mit dem\nStartmen\u00fc vertraut zu machen und gucken sie insbesondere nach der\nPython2 IDLE. Im Neuesten Softwarepatch ist diese nicht mehr direkt\nim Startmen\u00fc zu finden. Mittels des Startmen\u00fc-Editors k\u00f6nnen sie\ndie IDLE aber wieder zum Startmen\u00fc hinzuf\u00fcgen.<\/p>\n\n\n\n<p>Bevor\nsie damit anfangen k\u00f6nnen neue Updates herunterzuladen m\u00fcssen sie\nzun\u00e4chst noch ihr Pi mit dem Internet verbinden, daf\u00fcr k\u00f6nnen sie\nentweder ein LAN-Kabel nutzen oder ihr Wi-Fi.<\/p>\n\n\n\n<p>Sobald\nsie Verbunden sind, schlie\u00dfen sie alle unn\u00f6tigen Fenster und \u00f6ffnen\nsie ein Teminal Fenster. Hier werden wir nun zwei Befehle eingeben.<\/p>\n\n\n\n<code><p>sudo apt-get update<\/p><\/code>\n\n\n\n<p>Dies\nwird ein paar Sekunden dauern, wenn das Terminal sie auffordert, das\nn\u00e4chste Kommando einzugeben, schreiben sie: \n<\/p>\n\n\n\n<code><p>sudo apt-get dist-upgrade<\/p><\/code>\n\n\n\n<p>Das\nzweite Kommando updated ihr Raspbian image auf die aktuellste\nVersion.<\/p>\n\n\n\n<h2><span class=\"ez-toc-section\" id=\"Erste_Schritte\"><\/span>Erste Schritte:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3><span class=\"ez-toc-section\" id=\"Die_iot-hub_Bibliothek_installieren\"><\/span>Die iot-hub Bibliothek installieren<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Wenn\nsie ihr Raspberry Pi richtig eingerichtet haben, m\u00fcssen wir jetzt\ndie IoTHub Bibliothek installieren. Daf\u00fcr gibt es zwei Methoden;\nentweder besuchen sie Github\n(<a href=\"https:\/\/github.com\/Azure-Samples\/iot-hub-python-raspberrypi-client-app\">https:\/\/github.com\/Azure-Samples\/iot-hub-python-raspberrypi-client-app<\/a>)\nund laden das repository als Zip herunter, oder sie k\u00f6nnen das\nrepository via Terminal klonen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-get install git-core\ngit clone https:\/\/github.com\/Azure-Samples\/iot-hub-python-raspberrypi-client-app.git<\/code><\/pre>\n\n\n\n<p>\num die Bibliothek zu kompilieren nutzen sie die\nFolgenden Kommandos (passen sie den Dateipfad an wenn n\u00f6tig):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd .\/iot-hub-raspberrypi-client-app\nsudo chmod u+x setup.sh\nsudu .\/setup.sh<\/code><\/pre>\n\n\n\n<p> Tipps:<\/p>\n\n\n\n<p> &#8211; Sie k\u00f6nnen Verzeichnisse mittels *Joker wechseln, wenn sie keine Verzeichnisse mit    \u00e4hnlichem Namen haben. Beispiel: \u201ecd .\/iot-*\u201c wird sie ins passende Verzeichnis  bringen.<\/p>\n\n\n\n<p> Das kompilieren der Bibliothek hat einen Ordner iothub_python erzeugt. Suchen sie diesen Ordner und suchen sie nach einem File mit dem Namen: iothub_client.so<\/p>\n\n\n\n<p> Diese Datei m\u00fcssen sie kopieren und in dem Ordner, in dem sie ihr sp\u00e4teres Programm schreiben wollen wieder einf\u00fcgen, damit der Code funktioniert und die Klassen aus der Bibliothek verwendet werden k\u00f6nnen.<\/p>\n\n\n\n<h3><span class=\"ez-toc-section\" id=\"Anlegen_des_Geraets_in_IoTHub\"><\/span>  Anlegen des Ger\u00e4ts in IoTHub<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\nWenn sie bereits einen IoTHub erstellt haben, k\u00f6nnen\nsie hier weiter machen, ansonsten folgen sie bitte dem Tutorial ( XXX\n)<\/p>\n\n\n\n<p>\n\u00d6ffnen sie ihren IoT Hub in ihrem Internet Browser und\nnavigieren sie zum IoT Devices Reiter. In diesem k\u00f6nnen sie nun per\nklick auf das blaue \u201e+ \u201e ein neues Ger\u00e4t erzeugen.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"556\" src=\"https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/IoTDeviceTab_newDevice-1024x556.png\" alt=\"\" class=\"wp-image-122\" srcset=\"https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/IoTDeviceTab_newDevice-1024x556.png 1024w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/IoTDeviceTab_newDevice-300x163.png 300w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/IoTDeviceTab_newDevice-768x417.png 768w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/IoTDeviceTab_newDevice.png 1701w\" sizes=\"(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption>IoT Device Reiter<\/figcaption><\/figure>\n\n\n\n<p>Nach einem Klick auf das plus \u00f6ffnet sich die Ansicht zum erstellen eines neuen Ger\u00e4ts, geben sie hier ihrem Ger\u00e4t eine einzigartige ID und setzen sie das H\u00e4kchen bei Auto-generate-Keys. Zum Schluss best\u00e4tigen sie die Erstellung durch klicken auf save.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"587\" height=\"931\" src=\"https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/IoTDeviceCreate-1.png\" alt=\"\" class=\"wp-image-123\" srcset=\"https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/IoTDeviceCreate-1.png 587w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/IoTDeviceCreate-1-189x300.png 189w\" sizes=\"(max-width: 587px) 100vw, 587px\" \/><figcaption>IoT Device Erzeugen<\/figcaption><\/figure>\n\n\n\n<p>Das\nso erzeugt Ger\u00e4t l\u00e4sst sich nun in der Ger\u00e4teansicht anw\u00e4hlen.\nWenn das Ger\u00e4t angew\u00e4hlt ist, \u00f6ffnet sich eine neue Sicht, in der\nInformationen \u00fcber das Ger\u00e4t angezeigt werden. Wichtig ist hierbei\nder Prim\u00e4re Verbindungsschl\u00fcssel, den wir f\u00fcr die sp\u00e4tere\nVerwendung noch brauchen werden<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"443\" src=\"https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/IoTDeviceInfos-1-1024x443.png\" alt=\"\" class=\"wp-image-124\" srcset=\"https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/IoTDeviceInfos-1-1024x443.png 1024w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/IoTDeviceInfos-1-300x130.png 300w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/IoTDeviceInfos-1-768x332.png 768w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/IoTDeviceInfos-1.png 1696w\" sizes=\"(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption>IoT Device Details<\/figcaption><\/figure>\n\n\n\n<h2><span class=\"ez-toc-section\" id=\"Den_Code_schreiben\"><\/span>Den Code schreiben<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3><span class=\"ez-toc-section\" id=\"Das_Grundgeruest\"><\/span>Das Grundger\u00fcst: <span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Jetzt,\nda sie mit den Vorbereitungen so weit fertig sind, wird es Zeit mit\ndem Code zu beginnen. \u00d6ffnen sie dazu die Python2 IDLE und erzeugen\nsie ein neues Dokument. Beginnen sie damit, die Imports zu\n\u00fcbertragen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> from iothub_client import IoTHubClient \n from iothub_client import IoTHubClientError \n from iothub_client import IoTHubTransportProvider \n from iothub_client import IoTHubClientResult \n from iothub_client import IoTHubMessage \n from iothub_client import IoTHubMessageDispositionResult \n from iothub_client import IoTHubError \n from iothub_client import DeviceMethodReturnValue \n import sys \n import time\n import RPi.GPIO as GPIO <\/code><\/pre>\n\n\n\n<p>\nHiermit werden die Klassen der iothub Bibliothek verwendbar. Au\u00dferdem\nerm\u00f6glichen wir die sp\u00e4tere Nutzung der GPIO Ein-\/Ausg\u00e4nge f\u00fcr\nunsere Hardware.<\/p>\n\n\n\n<p>Um\ndas ganze sch\u00f6n und sauber zu halten erzeugen wir einige Variablen,\ndie wir sp\u00e4ter verwenden wollen. Darunter ist z.B. der Connection\nString unseres IoT Ger\u00e4ts, diese ist die Primary-Connection_String\ndie wir im vorherigen Schritt gefunden haben.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CONNSTR=\"HostName=xxx;DeviceId=xxx;SharedAccessKey=xxx\" \nCLIENT = 0 \nMSGID = 0<\/code><\/pre>\n\n\n\n<p>Wenn sie diesen Code laufen lassen, sollte es keine Fehlermeldungen geben (wenn sie bereits eine Kopie von iothub_client.so mit im selben Ordner haben.) Da der Code aber ansonsten noch keine Funktion hat, schie\u00dft es sich sofort wieder.<\/p>\n\n\n\n<h3><span class=\"ez-toc-section\" id=\"Der_Client\"><\/span> Der Client <span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Da\nwir einen ordentlichen und \u00fcbersichtlichen Code erzeugen wollen,\nerstellen wir f\u00fcr die unterschiedlichen Funktionalit\u00e4ten jeweils\neine eigene Funktion. Als erstes m\u00fcssen wir einen IoTHubClient\ninitialisieren. Daf\u00fcr erstellen wir die Funktion setupClient\nfolgenderma\u00dfen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def setupClient():   \n  global CONNSTR   \n  client = IoTHubClient(CONNSTR, IoTHubTransportProvider.MQTT)  \n  client.set_option(\"product_info\", \"RPI-Python\")     \n  return client<\/code><\/pre>\n\n\n\n<p>Damit\nwir diese Funktion aber auch ausf\u00fchren k\u00f6nnen, m\u00fcssen wir unserem\nProgramm noch eine Main() Funktion hinzuf\u00fcgen, die als Startpunkt\nverwendet wird. In dieser erzeugen wir mittels setupClient() einen\nClient und speichern ihn in der daf\u00fcr vorgesehen Variable ab.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def main():   \n  global CLIENT   \n  CLIENT = setupClient()   \n  SENDING = True<\/code><\/pre>\n\n\n\n<p>Jetzt haben wir einen Client, der mit IoT Hub verbunden ist, damit dieser nun aber auch Funktionalit\u00e4t hat m\u00fcssen wir eine Callback Methode f\u00fcr erhaltene Nachrichten erstellen und dem Client \u00fcbergeben.  <\/p>\n\n\n\n<p>Diese\nCallback Methode wird immer dann aufgerufen, wenn der Azure Server\neine Nachricht an das Ger\u00e4t sendet. Im Moment hat sie noch keine\nFunktionalit\u00e4t, au\u00dfer dem Anzeigen der gesendeten Nachricht auf der\nKonsole.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def gotMail(message, context):\n  message_buffer = message.get_bytearray() \n  size = len(message_buffer) \n  msg = message_buffer[:size].decode(\"utf-8\") \n  print(\"Server says: %s \" % (msg)) \n  return IoTHubMessageDispositionResult.ACCEPTED <\/code><\/pre>\n\n\n\n<p>Damit\nder Client nun auch von dieser Methode wei\u00df, m\u00fcssen wir diese\n\u00fcbergeben, daf\u00fcr \u00e4ndern wir die setupClient() indem wir in der\nZeile mit global hinter einem Komma noch gotMail einf\u00fcgen und vor\ndem Return folgende Zeile Code erg\u00e4nzen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>client.set_message_callback(gotMail,0)<\/code><\/pre>\n\n\n\n<p>Nun\nhaben wir eine Funktionierende Methode und einen Server, der\nNachrichten empfangen kann, damit sich das Programm aber nicht sofort\nschlie\u00dft, m\u00fcssen wir ans Ende des Ausgef\u00fchrten Codes noch eine\nDauerschleife hinzuf\u00fcgen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>print(\"Starte IoT Hub Client ...\") \nmain() \nwhile True: \n  time.sleep(1)  <\/code><\/pre>\n\n\n\n<h2><span class=\"ez-toc-section\" id=\"Cloud-to-Device_Nachrichten\"><\/span>Cloud-to-Device Nachrichten<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Um zu Testen, ob unser Code auch tats\u00e4chlich funktioniert, starten wir diesen und wenden uns dann wieder dem Azure Portal zu, da wir aus diesem heraus Nachrichten an unser Raspberry Pi schicken k\u00f6nnen. Daf\u00fcr m\u00fcssen wir wieder in die Device Detail Ansicht unseres Ger\u00e4ts wechseln und dort auf den \u201eMessage to Device\u201c Knopf Dr\u00fccken. Haben wir dies getan, \u00f6ffnet sich die Nachrichten Ansicht, in der wir nun einige Eingabe Felder vorfinden.  <\/p>\n\n\n\n<p>Im\nTextfeld Message Body kann der zu \u00fcbermittelnde Text geschrieben\nwerden. Mit einem klick auf \u201eSend Message\u201c wird diese an das\nGer\u00e4t gesendet. Als weitere Optionen kann man auch noch einen Key\nund ein Value versenden.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"492\" src=\"https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/C2DMessage-1024x492.png\" alt=\"\" class=\"wp-image-132\" srcset=\"https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/C2DMessage-1024x492.png 1024w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/C2DMessage-300x144.png 300w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/C2DMessage-768x369.png 768w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/C2DMessage.png 1691w\" sizes=\"(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption>C2D Nachrichten Ansicht<\/figcaption><\/figure>\n\n\n\n<h2><span class=\"ez-toc-section\" id=\"Reaktion_auf_Nachrichten\"><\/span>Reaktion auf Nachrichten<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Wie bereits am\nAnfang des Tutorials erw\u00e4hnt wollen wir unserem Code nun ein\nbisschen Funktionalit\u00e4t hinzuf\u00fcgen, indem wir eine LED mittels\nNachrichten von Azure steuern. Daf\u00fcr m\u00fcssen wir zun\u00e4chst eine LED\nan unser Raspberry Pi anschlie\u00dfen. Daf\u00fcr w\u00e4hlen wir in diesem Fall\nden GPIO Pin6 und verbinden diesen mit einer LED, und einem in reihe\ngeschalteten 120 Ohm Widerstand, von dem aus das ganze dann an den\nGPIO Ground angeschlossen wird. \n<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/led.png\" alt=\"\" class=\"wp-image-133\" width=\"569\" height=\"234\" srcset=\"https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/led.png 340w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/led-300x124.png 300w\" sizes=\"(max-width: 569px) 100vw, 569px\" \/><figcaption>LED Schaltung<\/figcaption><\/figure>\n\n\n\n<p>Damit das so Funktioniert m\u00fcssen wir den Nummerierungsmodus einstellen und den  Pin als Output initialisieren. Daf\u00fcr verwenden wir folgenden Code, den wir \u00fcber dem Ausgef\u00fchrten Code hinzuf\u00fcgen m\u00fcssen <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Nummerierungs Modus \nGPIO.setmode(GPIO.BCM) \n# GPIO Pin 6 als Output setzen \nGPIO.setup(6, GPIO.OUT)<\/code><\/pre>\n\n\n\n<p>Nun m\u00fcssen wir noch Funktionen f\u00fcr das an und ausschalten der LED schreiben, die wir sp\u00e4ter, wenn wir auf eine Nachricht reagieren aufrufen k\u00f6nnen. In diesen Funktionen wird der Status der LED ge\u00e4ndert.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def turnLightOn(): # Regardless of state, turn the light on     \n  global LIGHTON       \n  # Remember the set state     \n  LIGHTON = True       \n  # Set pin 6 to HIGH voltage (3V)   \n  GPIO.output(6, GPIO.HIGH)     \n  print (\"LED on!\") \n\ndef turnLightOff(): # Regardless of state, turn the light off     \n  global LIGHTON      \n  #Remember the set state     \n  LIGHTON = False      \n  # Set pin 6 to LOW voltage (0V)     \n  GPIO.output(6, GPIO.LOW)     \n  print (\"LED off.\") \n\ndef toggleLight(): # Toggle the light state from one to the other         \n  global LIGHTON     \n  print (\"Toggling...\")     \n  if LIGHTON:         \n    turnLightOff() # if ON then TURN OFF     \n  else:         \n    turnLightOn()  # if OFF then TURN ON<\/code><\/pre>\n\n\n\n<p>Mit diesen Funktionen k\u00f6nnen wir nun einfach die LED steuern. Da wir auf die Nachrichten von Azure reagieren wollen m\u00fcssen wir die gotMail Methode entsprechend anpassen. Daf\u00fcr nutzen wir einfach eine Verkettung von if, elif, else Bedingungen bei denen wir die Nachricht mit vorgegebenen Zeichenfolgen vergleichen. <br>Nach <br><em>msg = message_buffer[:size].decode(&#8222;utf-8&#8220;)<\/em><br>f\u00fcgen wir nun ein:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if msg == \"on\" or msg == \"LED on\":               \n  turnLightOn()\nelif msg == \"off\" or msg == \"LED off\":               \n  turnLightOff()         \nelif msg ==\"toggle\" or msg == \"LED toggle\":  \n  toggleLight()<\/code><\/pre>\n\n\n\n<p> Dieser Code sorgt daf\u00fcr, dass nun immer die passende Funktion aufgerufen wird, wenn die empfangene Nachricht den entsprechenden Text enth\u00e4lt. Damit haben sie nun eine fernsteuerbare LED an ihrem Raspberry Pi und den ersten Teil des Tutorials beendet.<\/p>\n\n\n\n<h2><span class=\"ez-toc-section\" id=\"Weitere_Tutorials\"><\/span>Weitere Tutorials<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><a href=\"https:\/\/azure.teamprojects.de\/?page_id=26\">Schnellstart Tutorial<\/a><br><a href=\"https:\/\/azure.teamprojects.de\/?page_id=119\">Tutorial 1: C2D Nachrichten empfangen<\/a><br><a href=\"https:\/\/azure.teamprojects.de\/?page_id=137\">Tutorial 2: Temperatur Sensor und D2C<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einrichten und C2D Nachrichten empfangen Table of Contents EinleitungVoraussetzungen:Ziel:Vorbereitung:Raspberry Pi vorbereiten (wenn das Betriebssystem schon installiert ist, weiter bei Schritt 2) Raspberry Pi aktualisieren Erste Schritte:Die iot-hub Bibliothek installieren Anlegen des Ger\u00e4ts in IoTHubDen Code schreibenDas Grundger\u00fcst: Der Client Cloud-to-Device NachrichtenReaktion auf NachrichtenWeitere Tutorials Einleitung In diesem Tutorial geht es darum, einen RaspberryPi 3 mit &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/azure.teamprojects.de\/?page_id=119\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eRaspberry Pi Tutorial 1\u201c<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":100,"featured_media":0,"parent":581,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=\/wp\/v2\/pages\/119"}],"collection":[{"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=\/wp\/v2\/users\/100"}],"replies":[{"embeddable":true,"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=119"}],"version-history":[{"count":18,"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=\/wp\/v2\/pages\/119\/revisions"}],"predecessor-version":[{"id":466,"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=\/wp\/v2\/pages\/119\/revisions\/466"}],"up":[{"embeddable":true,"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=\/wp\/v2\/pages\/581"}],"wp:attachment":[{"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}