Das beliebteste Ziel für IoT-Geräte ist die Telemetriesammlung. Bisher sind die Preise für Cloud-IoT-Dienste so stark gesunken, dass es sich selbst ein gewöhnlicher Benutzer leisten kann, sie zu nutzen. Heute werden wir darüber sprechen, wie Daten vom NodeMCU-Board in der Lua-Sprache in die Cloud gesendet werden.

Hinweis: Wir setzen die Reihe der Veröffentlichungen von Vollversionen von Artikeln aus dem Hacker-Magazin fort. Rechtschreibung und Zeichensetzung des Autors gespeichert.
Ich gebe dem Autor das Wort.
Da ich im Microsoft-Technologie-Stack arbeite, verwende ich Azure-Funktionen und Tabellenspeicher, um den Cloud-Teil der IoT-Lösung zu erstellen. Mein PoC für NodeMCU und Lua kann jedoch auch mit anderen Cloud-Anbietern von IoT-Lösungen verwendet werden.
INFO
Expressif NodeMCU ist eines der günstigsten Motherboards mit Wi-Fi, Micro-USB und integriertem Programmierer. Es basiert auf dem ESP8266-Modul. Das Board der zweiten Generation kann für etwa 6 bis 7 US-Dollar erworben werden. Sie können mit dem Board von der Arduino IDE aus arbeiten. Darüber hinaus unterstützt das Board eine Skriptsprache namens Lua (übersetzt aus dem Portugiesischen als „Mond“).
Schließen Sie das Gerät an und konfigurieren Sie es
Damit das Gerät unter Windows erkannt wird, müssen Sie den Treiber über den folgenden Link herunterladen: CP210x USB to UART Bridge VCP-Treiber
Die Standardgeschwindigkeit der seriellen NodeMCU-Schnittstelle beträgt 115'200 bps. Sie können eine andere Geschwindigkeit einstellen. Beim ersten Zurücksetzen des Geräts kehrt es zu 115200 zurück.
Es ist wichtig, dass der Fahrer auf genau die gleiche Geschwindigkeit eingestellt ist:

Firmware
Höchstwahrscheinlich wird in der anfänglichen Firmware etwas übersehen, daher sollten Sie das Gerät idealerweise selbst flashen. Es gibt verschiedene Möglichkeiten, ein Firmware-Image zu erstellen. Verwenden eines Cloud-Dienstes , eines Docker-Images oder Verwenden von Anweisungen für Linux . Ich habe über einen Cloud-Dienst gesammelt. Ich rate Ihnen auch diese Option.
Wenn Sie Daten an die Cloud senden müssen, sind die erforderlichen Funktionen für die Auswahl SNTP, MQTT, HTTP (WLAN, Timer, Datei, GPIO, Netz, Knoten, UART sind standardmäßig bereits ausgewählt). Es ist auch erforderlich, die TLS / SSL-Unterstützung in den verschiedenen Optionen als erforderlich zu markieren
Der Link zur bin-Datei kommt zur Mail. Genauer gesagt, sogar 2 Links kommen sofort. Eines mit einem Bild, das Gleitkommaoperationen unterstützt, und das zweite mit einem nicht unterstützenden Bild.
Bevor Sie den ESP8266 flashen, müssen Sie ihn in den Spezialmodus versetzen. Auf der Platine befindet sich eine separate FLASH-Taste. Durch Drücken während des Einschaltens oder Drücken von Reset wird das Gerät in den Bootloader-Modus versetzt. Wenn Ihre Board-Modifikation keine solche Taste hat, müssen Sie vor dem Blinken GPIO0 an GND anschließen und Reset drücken (diese Methode ist für ESP-12 geeignet).
Die Firmware kann mit dem Dienstprogramm PyFlasher geflasht werden . Py im Namen bedeutet, dass die Anwendung in Python geschrieben ist. Es gibt auch Nodemcu-Flasher , aber es wurde für eine lange Zeit nicht aktualisiert. Ich habe es nicht versucht.
Das PyFlasher-Fenster sieht folgendermaßen aus:

Der Flash-Modus wird je nach Board ausgewählt. Die meisten modernen Motherboards, die auf den ESP8266 ESP-12- und ESP32-Modulen basieren, verwenden den DIO-Modus. ESP8266 01 bis 07 passt in den schnelleren QIO-Modus. DOUT wird von ESP8285 verwendet.
IDE-Setup
Laden Sie die kostenlose IDE über den ESPlorer- Link herunter . Alternativ gibt es ZeroBrane Studio . ESPlorer hat mir am besten gefallen, daher werde ich ein Beispiel für die Arbeit damit geben. ESPlorer ist in JAVA geschrieben. Die Anwendungsschnittstelle ist

Auf der linken Seite finden Sie den Code, die Einstellungen und einige andere ähnliche Funktionen. Auf der rechten Seite befinden sich das Überwachungsfenster und die Geräteverwaltungsbefehle. Öffnen Sie die Anwendung und wählen Sie den Port aus. Stellen Sie die Geschwindigkeit ein, mit der der Austausch stattfinden soll (höchstwahrscheinlich 115200), und klicken Sie auf Öffnen.

Zum Aufwärmen können Sie ein einfaches Skript ausführen, das mit einer integrierten LED blinkt:
LED = 0 gpio.mode(LED, gpio.OUTPUT) function flash_led() gpio.write(LED, gpio.LOW) tmr.delay(500000) gpio.write(LED, gpio.HIGH) end tmr.alarm(1, 1000, tmr.ALARM_AUTO, flash_led)
Wenn Ihr Board keine eingebaute LED hat (oder Sie die Beispiele für blinkende LED = satt haben), können Sie versuchen, ein noch einfacheres Skript auszuführen, das die Zeile anzeigt:
print("Hello from Lua!")
Nachdem Sie eine .lua-Datei erstellt haben (z. B. test.lua), fügen Sie den Code hinzu und speichern Sie ihn auf der Festplatte. Sie können ihn auf Ihr Gerät herunterladen. Öffnen Sie dazu den Port, wenn er nicht geöffnet ist (Schaltfläche Öffnen), und klicken Sie auf die Schaltfläche Hochladen. Sie finden es unter den Schaltflächen, die sich unter dem Code befinden (links).
Nach dem Herunterladen der Datei können Sie sie ausführen, indem Sie den folgenden Befehl senden:
dofile("test.lua")
Der Befehl kann manuell in das untere Feld rechts unter dem Monitor eingegeben werden. Wenn Sie keinen Text eingeben möchten, können Sie auf die Schaltfläche "Neu laden" (die äußerste Reihe von Schaltflächen rechts) klicken. Nachdem Sie auf diese Schaltfläche geklickt haben, erhalten Sie eine Liste der Schaltflächen mit den auf der Karte geladenen .lua-Dateien. Durch Klicken auf die Schaltfläche mit dem Dateinamen wird die Datei zur Ausführung gestartet.
Wenn Sie möchten, dass die Datei sofort nach dem Einschalten der Karte gestartet wird, erstellen Sie eine Datei mit dem Namen init.lua.
Konfigurieren des Cloud-Teils für die Arbeit mit dem Gerät
Lassen Sie unser Gerät für einige Zeit stehen und erstellen Sie das Double in der Cloud. Kürzlich konnte mit der neuen Funktionalität ein Gerätedoppel direkt im Azure-Portal erstellt werden. In der Gruppe mit den IoT-Hub-Einstellungen mit dem Namen Explorers müssen Sie IoT-Geräte auswählen und auf "+ Hinzufügen" klicken.
Um das Gerät mit dem IoT-Hub zu verbinden, müssen wir SAS (Shared Access Signature) generieren. Zum Generieren von SAS wird ein Gerätedoppelschlüssel verwendet, der mit einem zusätzlichen Dienstprogramm (Geräte-Explorer, iothub-explorer, IoT-Erweiterung für Azure CLI 2.0) abgerufen werden kann. Am einfachsten ist es jedoch, den Schlüssel an derselben Stelle im Azure-Portal abzurufen, indem Sie zum IoT-Hub -> IoT-Geräte wechseln.

SAS kann auf dem Gerät oder über einen seiner Onlinedienste generiert werden. Wenn Sie das SDK verwenden, kann es automatisch SAS für Sie generieren (es reicht aus, den Doppelschlüssel des Geräts im Code anzugeben).

Die Art und Weise, wie ein SAS-Token von einem Webdienst für eine bestimmte begrenzte Zeit generiert wird, ist etwas sicherer. Obwohl es eine gewisse Nuance gibt. Wenn Sie nur den Gerätenamen an den Dienst senden, kann jemand die Namen durchsuchen, um das Token eines anderen Geräts zu erhalten. Um den Prozess ein wenig sicherer zu machen, schlage ich folgende Lösung vor: Speichern Sie den Azure-Hash des Doppelschlüssels des Geräts auf dem Gerät. Und im Service-Code prüfen wir vor dem Generieren der SAS, ob der Hash mit dem Hash des Geräteschlüssels übereinstimmt. Somit ist es möglich, SAS nur zu erhalten, wenn der Gerätename und der Hash seines Schlüssels bekannt sind.
Die erste Art und Weise, wie SAS auf dem Gerät generiert wird, ist einfacher und bequemer, jedoch etwas weniger sicher. Da ein Angreifer nach dem Zugriff auf das Gerät einen Schlüssel erhalten und SAS-Geräte selbst generieren kann. Im zweiten Fall kann der Cracker nach dem Zugriff auf das Gerät nur SAS-Token empfangen, deren Lebensdauer begrenzt ist.
Es stellt sich heraus, dass beide Methoden im Großen und Ganzen nicht ideal sind, wenn der Hacker Zugriff auf das Gerät hat. Auch das Sichern einer Verbindung über ein VPN hilft hier nicht weiter. In diesem Fall wird der Übertragungskanal geschützt, aber diejenigen, die das Gerät in die Hand nehmen, können auf den Kanal zugreifen. Leider auf NodeMCU-, Arduino- usw. Geräten Es gibt keine Möglichkeit, Schlüssel / Passwörter in einem sicheren Speicher zu speichern. Möglicherweise erfordert der Markt für kostengünstige IoT-Geräte neue Hardwarefunktionen.
Erstellen einer Azure-Funktion für die SAS-Generierung
Als Onlinedienst ist es am einfachsten, Azure-Funktionen zu verwenden. Hierbei handelt es sich um eindeutige Snippets, die sofort im Browser im Azure-Portal geschrieben werden können. Scherz als Scherz, aber auf diese Weise können Sie sogar von einem Smartphone aus programmieren. Natürlich verbietet niemand, sie in Visual Studio zu erstellen und zu debuggen und sie erst dann in kompilierter Form in Azure zu veröffentlichen.
Die Aufgabe der Funktion besteht darin, eine normalerweise nicht sehr komplizierte Operation durchzuführen. Nach der Microservice-Idee kann jede Funktion eines tun, aber es ist sehr gut (Prinzip der Einzelverantwortung).
Sie können eine Azure Function App im Portal erstellen, indem Sie ein kurzes Formular ausfüllen

Mit dem Verbrauchsplan können Sie nur für die festgeschriebenen Funktionsaufrufe bezahlen. Dies ist die billigste Option. Derzeit sind eine Million Feature-Aufrufe kostenlos.
Beachten Sie, dass neben der Erstellung der Funktion auch ein zusätzlicher Datenspeicher (Storage) erstellt wird.
Nach dem Erstellen der Funktions-App können Sie die Funktion selbst erstellen. In diesem Fall benötigen wir eine Funktion wie Webhook + API. Die Funktion steht möglicherweise jedem offen (anonymer Zugriff) und steht möglicherweise nur Besitzern eines speziellen Codes zur Verfügung. Der Code kann aus dem Fenster mit der Funktion abgerufen werden, indem Sie auf den Link </> Funktions-URL abrufen klicken:

Funktionen können in verschiedenen Sprachen geschrieben werden. Ich bevorzuge C #.
using System.Net; using Microsoft.Azure.Devices; using Microsoft.Azure.Devices.Common.Security; using System.Globalization; using System.Security.Cryptography; using System.Text; public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) { string deviceid = req.GetQueryNameValuePairs() .FirstOrDefault(q => string.Compare(q.Key, "deviceid", true, CultureInfo.InvariantCulture) == 0).Value; string hash = req.GetQueryNameValuePairs() .FirstOrDefault(q => string.Compare(q.Key, "hash", true, CultureInfo.InvariantCulture) == 0).Value; if (String.IsNullOrEmpty(deviceid)) return req.CreateResponse(HttpStatusCode.BadRequest, "device id missing"); if (String.IsNullOrEmpty(hash)) return req.CreateResponse(HttpStatusCode.BadRequest, "hash missing"); var resourceUri ="ArduinoDemoHub.azure-devices.net/devices/"+deviceid; // taken from IoT Hub user with Connect devices rights (not from Device Explorer) var connectionString = "HostName=ArduinoDemoHub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=cuYBKc42lfJr4oSRGQGQ8IiKWxGQkLre7rprZDZ/ths="; var registryManager = RegistryManager.CreateFromConnectionString(connectionString); var device = await registryManager.GetDeviceAsync(deviceid); var key = device.Authentication.SymmetricKey.PrimaryKey; HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes("somerandomkeyKJBWyfy4gski")); var hashedkey = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(key))); if (hashedkey!=hash) return req.CreateResponse(HttpStatusCode.BadRequest, "wrong hash"); SharedAccessSignatureBuilder sasBuilder = new SharedAccessSignatureBuilder() { Key = key, Target = resourceUri, TimeToLive = TimeSpan.FromDays(Convert.ToDouble(7)) }; var SAS = sasBuilder.ToSignature(); return req.CreateResponse(HttpStatusCode.OK, SAS); }
Wir erstellen die Datei project.json und fügen den folgenden Inhalt hinzu:
{ "frameworks": { "net46":{ "dependencies": { "Microsoft.Azure.Devices": "1.4.1" } } } }
Der Code verwendet die Verbindungszeichenfolge zum IoT-Hub. Es kann mit der Verbindungszeichenfolge zum Gerät verwechselt werden. Damit Sie nicht verwirrt werden, möchte ich Sie daran erinnern, wo Sie es bekommen können:

Es ist erforderlich, die Verbindungszeichenfolge aus einer Richtlinie mit den Rechten der Geräteverbindung zu übernehmen.
Es ist am besten, die Verbindungszeichenfolge selbst nicht wie ich im Code anzugeben. Ich habe dies nur zum Beispiel getan. Rufen Sie am besten die Funktion "Anwendungseinstellungen" auf.

Und geben Sie dort die Verbindungszeichenfolge an. Danach können Sie es mit aus dem sicheren Speicher "holen"
ConfigurationManager.ConnectionStrings["___"].ConnectionString
Auf dem Gerät müssen wir den Hash-Schlüssel speichern. Aber zuerst müssen Sie die Zeichen codieren. HttpUtility.UrlEncode aus dem System.Web-Bereich hilft uns dabei.
hashedkey = HttpUtility.UrlEncode(hashedkey);
Wir senden die Anfrage mit Get, aber nicht alle Zeichen können als Parameterwert übergeben werden.
Schreiben von Code zum Senden von Daten an die Cloud
Ich habe einen kleinen Code über Lua geschrieben, der Daten in die Cloud sendet. Das Ergebnis war eine Art PoC. Sie können es verwenden und an Ihre Bedürfnisse anpassen.
Erstellen Sie 2 init.lua- und SendDataToCloud.lua-Dateien
Der Inhalt des ersten:
-- print('init.lua ver 1.2') wifi.setmode(wifi.STATION) print('set mode=STATION (mode='..wifi.getmode()..')') print('MAC: '..wifi.sta.getmac()) print('chip: '..node.chipid()) print('heap: '..node.heap()) -- Wifi station_cfg={} station_cfg.ssid="_SSID" station_cfg.pwd="___" station_cfg.save=false wifi.sta.config(station_cfg) wifi_status_codes = { [0] = "Idle", [1] = "Connecting", [2] = "Wrong Password", [3] = "No AP Found", [4] = "Connection Failed", [5] = "Got IP" } sntp_connect_status_codes = { [1] = "DNS lookup failed", [2] = "Memory allocation failure", [3] = "UDP send failed", [4] = "Timeout, no NTP response received" } -- Wi-fi ( ) tmr.alarm(6,1000, 1, function() if wifi.sta.getip()==nil then print("Waiting for IP address! (Status: "..wifi_status_codes[wifi.sta.status()]..")") else print("New IP address is "..wifi.sta.getip()) tmr.stop(6) -- NTP sntp.sync({'pool.ntp.org'}, function(sec, usec, server) print("Clock Synced: "..sec..", "..usec..", "..server) tls.cert.verify(false) -- dofile('SendDataToCloud.lua') end, function(error_code) print("Clock Sync Failed: "..sntp_connect_status_codes[error_code]) end, 1 -- ) end end )
Diese Datei stellt eine Verbindung zum Netzwerk her und führt den Code aus der Datei SendDataToCloud.lua aus, wenn die Verbindung erfolgreich hergestellt wurde.
Sie müssen die Daten Ihres Wi-Fi-Zugangspunkts als Werte für station_cfg.ssid und station_cfg.pwd angeben.
In der folgenden Datei müssen Sie den Gerätenamen und das IoT des Hubs (Variablen DEVICE und IOTHUB) ändern. Die Variable funcurl enthält die Adresse der SAS-generierenden Funktion und den Hash des Geräteschlüssels (den wir zuvor mit HttpUtility.UrlEncode codiert haben) als Wert des Hash-Parameters
-- DEVICE = "LuaDevice" IOTHUB = "ArduinoDemoHub.azure-devices.net" PORT = 8883 USER = "ArduinoDemoHub.azure-devices.net/"..DEVICE.."/api-version=2016-11-14" telemetry_topic="devices/"..DEVICE.."/messages/events/" connected = false local headers = 'Content-Type: application/x-www-form-urlencoded\r\n'.. 'Accept: */*\r\n'.. 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0' funcurl = "https://arduinofunction.azurewebsites.net/api/GenerateSASFunction?code=Jn7j54PbR31BSRa0UZrDwp4ZEltjmWHmblG9zLo0Ne0tyGM7w/wQ7w==" funcurl = funcurl.."&hash=oJzykimyQsTPtzgJxYq90Xfqmw1rZTPTCH%2bJ5sSurKI%3d" funcurl = funcurl.."&deviceid="..DEVICE tmr.alarm(1,5000, 1, function() http.get(funcurl, headers, function(code, data, header) if (code < 0) then print("HTTP request failed") else sas = true print(code, data) if string.match(data, "Shared") then tmr.stop(1) SAS = string.sub(data,2,string.len(data)-1) print(SAS) connect(SAS) end end end) end) function connect(SAS) -- MQTT client = mqtt.Client(DEVICE, 240, USER, SAS) -- IoTHub MQTT print ("Connecting to MQTT broker. Please wait...") tmr.alarm(2,1000, 1, function() client:connect(IOTHUB, PORT, 1, -- Callback function(client) tmr.stop(2) print("Connected to MQTT: "..IOTHUB..":"..PORT.." as "..DEVICE) connected = true senddata() end, -- Callback function(client, reason) print("Error Connecting: "..reason) end ) end) end function senddata() math.randomseed(1) tmr.alarm(3, 1000, tmr.ALARM_AUTO, publish_data) -- , callback client:on("offline", function(client) print("MQTT Disconnected.") connected = false end) end -- function publish_data() if connected == true then somedata = math.random(1,100) -- payload = "{ \"deviceId\" : \""..DEVICE.."\",".. "\"iotdata\" :"..somedata.."}" -- client:publish(telemetry_topic, payload, 1, 0, function(client) print("Data published successfully.") end) end end
Daten werden ohne Verwendung des Azure SDK gesendet, sodass Sie diesen Code nicht nur zum Senden von Daten an Azure verwenden können. Es gibt viele Alternativen: AWS, Google Cloud IoT, IBM Watson IoT Platform.
In diesem Beispiel wird das MQTT-Protokoll (Message Queuing Telemetry Transport) verwendet. Dies ist ein offenes Protokoll, das speziell für IoT-Geräte entwickelt wurde. Daten werden im JSON-Format gesendet. Wenn in realen Projekten Daten von Sensoren stammen, wird im Beispiel eine Zufallszahl generiert.
Während des Handshake-Prozesses zwischen dem Gerät und dem IoT-Hub kann der Server sein Zertifikat senden oder ein Gerätezertifikat anfordern. Wenn Sie sich erinnern, haben wir das letzte Mal, als wir mit dem Arduino-Gerät gearbeitet haben, es mit einem Zertifikat geflasht. Jetzt reicht eine Code-Senke:
tls.cert.verify(false)
Wir sind auf das Zertifikat beschränkt, das der Server an uns sendet.
INFO
Möglicherweise interessieren Sie sich für den Inhalt der Zertifikate für Ihren Hub mit dem folgenden OpenSSL-Befehl.
openssl s_client -showcerts -connect ArduinoDemoHub.azure-devices.net:8883
Zur Vorbereitung des Materials wurden die Labore verwendet, die unter folgendem Link verfügbar sind: Senden von D2C-Nachrichten (Device-to-Cloud)
Der Code ist nicht ganz auf dem neuesten Stand und ich musste ihn ein wenig aktualisieren, aber im Allgemeinen kann der Link nützlich sein.
Arbeiten mit NodeMCU von Arduino IDE
Ich kann das Thema der Verwendung des SDK nicht ignorieren. Ihre Lösung ist gut, aber das SDK ist derselbe Code, der bereits debuggt, vereinfacht und einsatzbereit ist. Ein paar Worte zur Konfiguration und Verwendung der Arduino IDE für die Arbeit mit NodeMCU.
Nach der Installation der Arduino IDE müssen Sie zum Menü Datei - Einstellungen wechseln

Fügen Sie einen Link zum zusätzlichen Board Manager hinzu. Geben Sie im Feld URLs für den zusätzlichen Board Manager die Adresse ein: http://arduino.esp8266.com/versions/2.4.0/package_esp8266com_index.json
Gehen Sie dann zum Menü Tools - Board xxx - Boardx Manager und installieren Sie ESP8266
Installieren Sie die Bibliotheken AzureIoTHub, AzureIoTUtility, AzureIoTProtocol_MQTT. Nach der Installation der letzten Bibliothek in den Beispielen (Menü Datei - Beispiele - AzureIoTProtocol_MQTT) finden Sie ein Beispiel simplesample_mqtt für ESP8266.
Das Beispiel ist fertig. Geben Sie einfach die Variablenwerte in die Datei iot_configs.h ein
Ich erwähne ein kleines Minus. Das Kompilieren des Projekts und das Herunterladen auf das Board dauert im Vergleich zu Lua ziemlich lange.
Speichern von Daten in der Azure-Cloud
Beim Senden von Daten ist alles klar, aber wie kostengünstig es ist, Daten in der Cloud zu speichern.
Die kostengünstigste Möglichkeit, Daten vom IoT-Hub an die Datenbank zu senden, sind Azure-Funktionen. Der kostengünstigste Datenspeicher ist Azure Table Storage.
Interessanterweise wird beim Erstellen einer Funktions-App auch automatisch Speicher erstellt, den die Funktion selbst benötigt, um zu funktionieren. Wenn Sie ein separates Repository erstellen, ist es ratsam, die Grundeinstellungen wie folgt vorzunehmen:

Die LSR-Replikation ist derzeit die kostengünstigste Option. Sie wird ausgewählt, wenn automatisch ein an eine Funktion gebundenes Repository erstellt wird.
Was wir jetzt brauchen, ist, Daten vom IoT-Hub zu empfangen und in den Speicher zu schreiben. In diesem Fall kann uns das Schnellstartfenster beim Erstellen einer Funktion nicht die gewünschte Option anbieten.

Klicken Sie daher unten auf den Link Benutzerdefinierte Funktion und wählen Sie die Option IoT Hub (Event Hub).
Dieses Fenster öffnet sich für uns:

In dem wir das Event Hub-Verbindungsfeld mit einer einfachen Auswahl ausfüllen können (indem wir auf Neu klicken). Um jedoch den Namen des Event Hub anzugeben, müssen Sie zum IoT Hub wechseln. Im Hub müssen Sie zu Endpunkten (Endpunkten) gehen und von dort den Event Hub-kompatiblen Namen abrufen

Fahren wir mit dem Funktionscode fort. Das folgende Snippet empfängt Daten vom IoT-Hub und speichert sie im Tabellenspeicher:
#r "Microsoft.WindowsAzure.Storage" #r "Newtonsoft.Json" using Microsoft.Azure; // Namespace for CloudConfigurationManager using Microsoft.WindowsAzure.Storage; // Namespace for CloudStorageAccount using Microsoft.WindowsAzure.Storage.Table; // Namespace for Table storage types using Newtonsoft.Json; public static void Run(string myIoTHubMessage, TraceWriter log) { var e = JsonConvert.DeserializeObject<EventDataEntity>(myIoTHubMessage); log.Info($"C# IoT Hub trigger function processed a message: {myIoTHubMessage}"); CloudStorageAccount storageAccount = CloudStorageAccount.Parse ("DefaultEndpointsProtocol=https;AccountName=iotdatademostorage;AccountKey=JgStNcJvlQYeNsVCmpkHQUkWlZiQ7tJwAm6OCL34+lGx3XrR+0CPiY9RoxIDA6VSvMKlOEUrVWL+KWP0qLMLrw==;EndpointSuffix=core.windows.net"); CloudTableClient tableClient = storageAccount.CreateCloudTableClient(); CloudTable table = tableClient.GetTableReference("iottable"); table.CreateIfNotExists(); EventDataEntity edata = new EventDataEntity("IOTpartition", Guid.NewGuid().ToString()); edata.DeviceId = e.DeviceId; edata.IotData = e.IotData; TableOperation insertOperation = TableOperation.Insert(edata); table.Execute(insertOperation); } public class EventDataEntity : TableEntity { public EventDataEntity(string pkey, string rkey) { this.PartitionKey = pkey; this.RowKey = rkey; } public EventDataEntity() { } public string DeviceId { get; set; } public int IotData { get; set; } }
Wenn Sie diesen Code in einem realen Projekt verwenden, vergessen Sie nicht, die Verbindungszeichenfolge an einem sichereren Ort zu platzieren - in den App-Einstellungen (genau wie die Verbindungszeichenfolge der ersten Funktion).
Die Verbindungszeichenfolge selbst kann im Einstellungselement namens Zugriffsschlüssel verwendet werden:

Zeigen Sie Tabelleninhalte mit dem kostenlosen Dienstprogramm Azure Storage Explorer an
Da die Kosten für Azure Table Storage recht niedrig sind und der Azure Functions- und IoT-Hub bestimmte Ressourcen monatlich kostenlos anbietet, können die Kosten für die gesamte Lösung pro Monat weniger als 1 US-Dollar betragen. Das hängt natürlich von der Datenmenge ab. Zählen Sie selbst. Heute kostet 1 GB Daten 7 Cent pro Monat und für jede Million Transaktionen werden Ihnen nur 4 Cent berechnet.
INFO
Wenn Sie Cloud-Dienste von einem Anbieter nutzen, empfehle ich Ihnen immer, eine Kreditkarte mit dem Mindestbetrag mit Ihrem Konto zu verknüpfen. Es ist ein Zufall, dass Sie durch die Wahl einer fehlerhaften Einstellung viel mehr bezahlen, als Sie erwarten.
Wir erinnern Sie daran, dass dies die Vollversion eines Artikels aus dem Hacker-Magazin ist . Sein Autor ist Alexey Sommer .
Nützliche Materialien
Handbuch zur Cloud-Anwendungsarchitektur
Verfolgen Sie einen strukturierten Ansatz für die Entwicklung von Cloud-Anwendungen. In diesem 300-seitigen E-Book zur Cloud-Computing-Architektur werden Richtlinien für Architektur, Entwicklung und Implementierung erläutert, die unabhängig von der gewählten Cloud-Plattform gelten. Diese Anleitung enthält Schritte zu:
- Auswahl des richtigen Cloud-Anwendungsarchitekturstils für Ihre Anwendung oder Lösung;
- Auswahl geeigneter Computer- und Datenspeichertechnologien;
- Implementierung von 10 Entwicklungsprinzipien zur Erstellung einer skalierbaren, ausfallsicheren und verwaltbaren Anwendung;
- Befolgen Sie die fünf Prinzipien zur Erstellung hochwertiger Software, die den Erfolg Ihrer Cloud-Anwendung garantiert.
- Verwenden von Entwurfsmustern, die für das Problem entwickelt wurden, das Sie lösen möchten.
→ Herunterladen
Azure-Entwicklerhandbuch

In diesem Update des Azure-Entwicklerhandbuchs erfahren Sie, wie der gesamte Satz von Diensten für die Azure-Softwareplattform Ihren Anforderungen entspricht. Hier finden Sie Informationen zu Architekturansätzen und den häufigsten Situationen, die beim Erstellen von Cloud-Anwendungen auftreten.
→ Herunterladen
Microsoft Azure-Grundlagen
Dieses Buch bietet Entwicklern und IT-Fachleuten, die noch keine Erfahrung mit Cloud Computing haben, wichtige Einblicke in wichtige Azure-Dienste. Schritt-für-Schritt-Demos helfen dem Leser zu verstehen, wie er mit den einzelnen Schlüsseldiensten beginnen kann. Jedes Kapitel ist unabhängig. Es ist nicht erforderlich, praktische Demonstrationen aus früheren Kapiteln durchzuführen, um ein bestimmtes Kapitel zu verstehen.
Die folgenden Themen werden in diesem Buch behandelt:
- Erste Schritte mit Azure;
- Azure-Anwendungsdienst und Webanwendungen;
- Virtuelle Maschinen;
- Lagerservice;
- Datenbanken
- Zusätzliche Azure-Dienste.
→ Herunterladen
Nützliche Links