Sautez dans le cloud. Création d'une solution IoT économique sur NodeMCU + Azure IoT Hub

La destination la plus populaire pour les appareils IoT est la collecte de tĂ©lĂ©mĂ©trie. À ce jour, les prix des services IoT cloud ont tellement diminuĂ© que mĂȘme un utilisateur ordinaire ordinaire peut se permettre de les utiliser. Aujourd'hui, nous allons parler de la façon d'envoyer des donnĂ©es vers le cloud Ă  partir de la carte NodeMCU en utilisant le langage Lua.



Remarque: nous continuons la série de publications de versions complÚtes d'articles du magazine Hacker. Orthographe et ponctuation de l'auteur enregistrées.


Je donne la parole Ă  l'auteur.


Étant donnĂ© que je travaille dans la pile technologique Microsoft, j'utilise Azure Functions et Table Storage pour crĂ©er la partie cloud de la solution IoT, mais mon PoC pour NodeMCU et Lua peut Ă©galement ĂȘtre utilisĂ© avec d'autres fournisseurs de solutions IoT dans le cloud.


INFO


Expressif NodeMCU est l'une des cartes mĂšres les plus abordables avec Wi-Fi, micro USB et programmateur embarquĂ©. Il est basĂ© sur le module ESP8266. La carte de deuxiĂšme gĂ©nĂ©ration peut ĂȘtre achetĂ©e pour environ 6-7 $. Vous pouvez travailler avec la carte de l'IDE Arduino. De plus, le tableau prend en charge un langage de script appelĂ© Lua (traduit du portugais par «Moon»).


Connectez et configurez l'appareil


Pour que le périphérique soit reconnu sous Windows, vous devez télécharger le pilote à partir du lien suivant: Pilotes VC2 USB vers UART Bridge CP210x


La vitesse du port série NodeMCU standard est de 115'200bps. Vous pouvez définir une vitesse différente, lors de la premiÚre réinitialisation de l'appareil, il reviendra à 115200.
Il est important que le pilote soit rĂ©glĂ© exactement Ă  la mĂȘme vitesse:



Firmware


TrĂšs probablement, quelque chose sera manquant dans le firmware initial, donc idĂ©alement flasher l'appareil vous-mĂȘme. Il existe plusieurs façons de crĂ©er une image de micrologiciel. À l'aide d'un service cloud , d' une image Docker ou Ă  l'aide d' instructions pour Linux . J'ai collectĂ© en utilisant un service cloud. Je vous conseille Ă©galement cette option.


Si vous devez envoyer des donnĂ©es vers le cloud, les fonctionnalitĂ©s de sĂ©lection nĂ©cessaires sont SNTP, MQTT, HTTP (WiFi, minuterie, fichier, GPIO, net, nƓud, UART sont dĂ©jĂ  sĂ©lectionnĂ©s par dĂ©faut). Il est Ă©galement nĂ©cessaire de marquer comme support TLS / SSL requis dans les options diverses
Le lien avec le fichier bin vient Ă  l'e-mail. Plus prĂ©cisĂ©ment, mĂȘme 2 liens arrivent immĂ©diatement. L'une avec une image qui prend en charge les opĂ©rations en virgule flottante, et la seconde avec une image non compatible.


Avant de flasher l'ESP8266, vous devez le mettre en mode spécial. Il y a un bouton FLASH séparé sur la carte. En appuyant dessus pendant la mise sous tension ou en appuyant sur reset, l'appareil passe en mode bootloader. Si votre modification de carte n'a pas un tel bouton, alors avant de flasher, vous devez connecter GPIO0 à GND et appuyer sur reset (cette méthode convient à ESP-12).


Le firmware peut ĂȘtre flashĂ© avec l'utilitaire PyFlasher . Py dans le nom signifie que l'application est Ă©crite en Python. Il y a aussi nodemcu-flasher , mais il n'a pas Ă©tĂ© mis Ă  jour depuis longtemps. Je ne l'ai pas essayĂ©.


La fenĂȘtre PyFlasher ressemble Ă  ceci:



Le mode Flash est sélectionné en fonction de la carte que vous possédez. La plupart des cartes mÚres modernes basées sur les modules ESP8266 ESP-12 et ESP32 utilisent le mode DIO. ESP8266 01 à 07 s'adapte au mode QIO plus rapide. DOUT est utilisé par ESP8285.


Configuration IDE


Téléchargez l'IDE gratuit sur le lien ESPlorer . Il existe également ZeroBrane Studio . J'ai surtout aimé ESPlorer, je vais donc vous donner un exemple de travail avec. ESPlorer est écrit en JAVA. L'interface d'application est



Sur le cĂŽtĂ© gauche se trouve le code, les paramĂštres et d'autres fonctionnalitĂ©s similaires. À droite, la fenĂȘtre de surveillance et les commandes de gestion des pĂ©riphĂ©riques. Ouvrez l'application, sĂ©lectionnez le port. DĂ©finissez la vitesse Ă  laquelle l'Ă©change aura lieu (il s'agit trĂšs probablement de 115200) et cliquez sur Ouvrir.



Pour vous échauffer, vous pouvez exécuter un script simple qui clignote avec une LED intégrée:


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) 

Si votre carte n'a pas de LED intégrée (ou si vous en avez assez des exemples de LED clignotantes =), vous pouvez essayer d'exécuter un script encore plus simple qui affiche la ligne:


 print("Hello from Lua!") 

AprÚs avoir créé un fichier .lua (par exemple test.lua), y ajouter le code et l'enregistrer sur le disque, vous pouvez le télécharger sur votre appareil. Pour ce faire, ouvrez le port s'il n'est pas ouvert (bouton Ouvrir) et cliquez sur le bouton Télécharger. Vous pouvez le trouver parmi les boutons situés sous le code (à gauche).


AprÚs avoir téléchargé le fichier, vous pouvez l'exécuter en envoyant la commande:


 dofile("test.lua") 

La commande peut ĂȘtre entrĂ©e manuellement dans le champ infĂ©rieur situĂ© Ă  droite sous le moniteur. Ou si vous ne souhaitez pas saisir de texte, vous pouvez cliquer sur le bouton Recharger (la rangĂ©e de boutons extrĂȘme Ă  droite). AprĂšs avoir cliquĂ© sur ce bouton, vous recevrez une liste de boutons avec les fichiers .lua chargĂ©s sur la carte. Cliquez sur le bouton avec le nom du fichier pour lancer l'exĂ©cution du fichier.


Si vous souhaitez que le fichier démarre immédiatement aprÚs avoir allumé la carte, créez un fichier appelé init.lua.


Configuration de la partie cloud pour travailler avec l'appareil


Laissons notre appareil pendant un certain temps et crĂ©ons son double dans le cloud. RĂ©cemment, un double d'appareil a pu ĂȘtre créé directement sur le portail Azure, Ă  l'aide de la nouvelle fonctionnalitĂ©. Dans le groupe de paramĂštres du hub IoT appelĂ© Explorers, vous devez sĂ©lectionner les pĂ©riphĂ©riques IoT et cliquer sur "+ Ajouter"


Pour connecter l'appareil au hub IoT, nous devons gĂ©nĂ©rer SAS (signature d'accĂšs partagĂ©). Pour gĂ©nĂ©rer SAS, une double clĂ© de pĂ©riphĂ©rique est utilisĂ©e, qui peut ĂȘtre obtenue Ă  l'aide d'un utilitaire auxiliaire (Device Explorer, iothub-explorer, IoT Extension pour Azure CLI 2.0). Mais le moyen le plus simple consiste Ă  obtenir la clĂ© au mĂȘme endroit, sur le portail Azure, en accĂ©dant au hub IoT -> Appareils IoT.



SAS peut ĂȘtre gĂ©nĂ©rĂ© sur l'appareil, ou il peut ĂȘtre gĂ©nĂ©rĂ© Ă  l'aide de l'un de ses services en ligne. Si vous utilisez le SDK, il peut gĂ©nĂ©rer automatiquement SAS pour vous (il suffit de spĂ©cifier la double clĂ© de l'appareil dans le code).



La façon dont un jeton SAS est généré par un service Web pendant un certain temps limité est légÚrement plus sécurisée. Bien qu'il y ait une certaine nuance. Si vous envoyez uniquement le nom de l'appareil au service, quelqu'un peut rechercher parmi les noms pour obtenir le jeton d'un autre appareil. Par conséquent, afin de rendre le processus un peu plus sûr, je propose cette solution: enregistrons le hachage Azure de la double clé de l'appareil sur l'appareil. Et dans le code de service, avant de générer le SAS, nous vérifierons si le hachage correspond au hachage de la clé de périphérique. Ainsi, il sera possible d'obtenir SAS uniquement en connaissant le nom de l'appareil et le hachage de sa clé.


La premiĂšre façon dont SAS est gĂ©nĂ©rĂ© sur l'appareil est plus simple et plus pratique, mais lĂ©gĂšrement moins sĂ©curisĂ©e. Depuis, aprĂšs avoir accĂ©dĂ© Ă  l'appareil, un attaquant pourra obtenir une clĂ© et gĂ©nĂ©rer lui-mĂȘme des appareils SAS. Dans le second cas, ayant accĂ©dĂ© Ă  l'appareil, le cracker ne pourra recevoir que des tokens SAS dont la durĂ©e de vie est limitĂ©e.


Il s'avĂšre que les deux mĂ©thodes ne sont gĂ©nĂ©ralement pas idĂ©ales si le pirate a accĂšs Ă  l'appareil. MĂȘme la sĂ©curisation d'une connexion Ă  l'aide d'un VPN n'aidera pas ici. Dans ce cas, le canal de transmission sera protĂ©gĂ©, mais ceux qui auront l'appareil entre leurs mains pourront accĂ©der au canal. Malheureusement, sur les appareils NodeMCU, Arduino, etc. il n'y a aucun moyen de stocker les clĂ©s / mots de passe dans un stockage sĂ©curisĂ©. Peut-ĂȘtre que le marchĂ© des appareils IoT Ă  faible coĂ»t nĂ©cessite de nouvelles fonctionnalitĂ©s matĂ©rielles.


Création d'une fonction Azure pour la génération SAS


En tant que service en ligne, il est plus facile d'utiliser les fonctionnalitĂ©s Azure. Ce sont des extraits uniques qui peuvent ĂȘtre Ă©crits immĂ©diatement sur le portail Azure dans le navigateur. Blague comme une blague, mais de cette façon, vous pouvez programmer mĂȘme Ă  partir d'un smartphone. Bien sĂ»r, personne n'interdit de les crĂ©er et de les dĂ©boguer Ă  partir de Visual Studio, puis de les publier sur Azure sous forme compilĂ©e.


La fonction de la fonction est d'effectuer une opĂ©ration gĂ©nĂ©ralement peu compliquĂ©e. Selon l’idĂ©e du microservice, chaque fonction peut faire une chose, mais c’est trĂšs bien (principe de responsabilitĂ© unique).


Vous pouvez créer une application Azure Function sur le portail en remplissant un court formulaire



Le plan de consommation vous permet de payer uniquement pour les appels de fonction qui ont été validés. C'est l'option la moins chÚre. Actuellement, un million d'appels de fonctionnalités sont gratuits.


Notez qu'avec la création de la fonction, un stockage de données auxiliaire (stockage) est également créé.


AprĂšs avoir créé l'application de fonction, vous pouvez crĂ©er la fonction elle-mĂȘme. Dans ce cas, nous avons besoin d'une fonction comme Webhook + API. La fonction peut ĂȘtre ouverte Ă  tout le monde (accĂšs anonyme), et peut ĂȘtre accessible uniquement aux propriĂ©taires d'un code spĂ©cial. Le code peut ĂȘtre obtenu Ă  partir de la fenĂȘtre avec la fonction en cliquant sur le lien </> URL de la fonction Get:



Les fonctions peuvent ĂȘtre Ă©crites dans diffĂ©rentes langues. Je prĂ©fĂšre 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); } 

Nous créons le fichier project.json et y ajoutons le contenu suivant:


 { "frameworks": { "net46":{ "dependencies": { "Microsoft.Azure.Devices": "1.4.1" } } } } 

Le code utilise la chaĂźne de connexion au concentrateur IoT. Il peut ĂȘtre confondu avec la chaĂźne de connexion Ă  l'appareil. Pour que vous ne soyez pas confus, permettez-moi de vous rappeler oĂč l'obtenir:



Il est nécessaire de prendre la chaßne de connexion d'une politique avec les droits de connexion de l'appareil.
Il est prĂ©fĂ©rable de ne pas spĂ©cifier la chaĂźne de connexion elle-mĂȘme dans le code, comme je l'ai fait. Je l'ai fait uniquement Ă  titre d'exemple. Il est prĂ©fĂ©rable d'accĂ©der Ă  la fonction ParamĂštres d'application.



Et spécifiez la chaßne de connexion ici. AprÚs cela, vous pouvez "l'obtenir" de la boutique sécurisée en utilisant


 ConfigurationManager.ConnectionStrings["___"].ConnectionString 

Sur l'appareil, nous devons enregistrer la clé de hachage. Mais vous devez d'abord encoder les personnages. HttpUtility.UrlEncode de l'espace System.Web nous aidera avec cela.


 hashedkey = HttpUtility.UrlEncode(hashedkey); 

Nous enverrons la demande Ă  l'aide de Get, mais tous les caractĂšres ne peuvent pas ĂȘtre transmis comme valeur de paramĂštre.


Écrire du code pour envoyer des donnĂ©es vers le cloud


J'ai écrit un petit code sur l'envoi de données par Lua dans le cloud. Le résultat a été une sorte de PoC. Vous pouvez l'utiliser et le modifier selon vos besoins.
Créez 2 fichiers init.lua et SendDataToCloud.lua
Le contenu du premier:


 --    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 ) 

Ce fichier se connecte au réseau et exécute le code du fichier SendDataToCloud.lua si la connexion réussit.


Vous devez spécifier les données de votre point d'accÚs Wi-Fi comme valeurs pour station_cfg.ssid et station_cfg.pwd.


Dans le fichier suivant, vous devez modifier le nom de l'appareil et l'IoT du concentrateur (variables DEVICE et IOTHUB). La variable funcurl contient l'adresse de la fonction génératrice SAS et le hachage de la clé de périphérique (que nous avons précédemment codé à l'aide de HttpUtility.UrlEncode) comme valeur du paramÚtre de hachage


 --  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 

Les données sont envoyées sans utiliser le SDK Azure, vous pouvez donc utiliser ce code non seulement pour envoyer des données à Azure. Il existe de nombreuses alternatives: AWS, Google Cloud IoT, IBM Watson IoT Platform.


L'exemple utilise le protocole MQTT (Message Queuing Telemetry Transport). Il s'agit d'un protocole ouvert conçu spécifiquement pour les appareils IoT. Les données sont envoyées au format JSON. Lorsque dans des projets réels, les données proviennent de capteurs, un nombre aléatoire est généré dans l'exemple.


Au cours du processus d'établissement de liaison entre l'appareil et le hub IoT, le serveur peut envoyer son certificat ou demander un certificat d'appareil. Si vous vous souvenez, la derniÚre fois que nous avons travaillé avec le périphérique Arduino, nous l'avons flashé avec un certificat. Maintenant, un récepteur de code suffit:


 tls.cert.verify(false) 

Nous sommes limités au certificat que le serveur nous enverra.


INFO


Vous pouvez ĂȘtre intĂ©ressĂ© par le contenu des certificats de votre concentrateur Ă  l'aide de la commande OpenSSL suivante.


 openssl s_client -showcerts -connect ArduinoDemoHub.azure-devices.net:8883 

Pour préparer le matériel, les laboratoires ont été utilisés, qui sont disponibles sur le lien: Envoi de messages Device-to-Cloud (D2C)
Le code n'est pas tout Ă  fait Ă  jour et j'ai dĂ» le mettre Ă  jour un peu, mais en gĂ©nĂ©ral, le lien peut ĂȘtre utile.


Travailler avec NodeMCU depuis Arduino IDE


Je ne peux pas ignorer le sujet de l'utilisation du SDK. Votre solution est bonne, mais le SDK est le mĂȘme code qui est dĂ©jĂ  dĂ©boguĂ©, simplifiĂ© et prĂȘt Ă  l'emploi. Quelques mots sur la façon de configurer et d'utiliser l'IDE Arduino pour travailler avec NodeMCU.


AprÚs avoir installé l'IDE Arduino, vous devez aller dans le menu Fichier - Préférences



Et ajoutez un lien vers le gestionnaire de cartes supplémentaires - entrez dans le champ URL du gestionnaire de cartes supplémentaires l'adresse: http://arduino.esp8266.com/versions/2.4.0/package_esp8266com_index.json


Ensuite, allez dans le menu Tools - Board xxx - Boardx Manager et installez ESP8266
Installez les bibliothÚques AzureIoTHub, AzureIoTUtility, AzureIoTProtocol_MQTT. AprÚs avoir installé la derniÚre bibliothÚque dans les exemples (menu Fichier - Exemples - AzureIoTProtocol_MQTT), vous pouvez trouver un exemple simplesample_mqtt pour ESP8266.


L'exemple est prĂȘt Ă  l'emploi. Remplissez simplement les valeurs des variables dans le fichier iot_configs.h
Je mentionne un petit inconvénient. La compilation du projet et son téléchargement sur la carte, par rapport à Lua, prennent un temps assez long.


Enregistrement de données dans le cloud Azure


Avec l'envoi de données, tout est clair, mais combien peu coûteux d'enregistrer des données dans le cloud.
Azure Functions est le moyen le moins cher d'envoyer des données du hub IoT à la base de données. Et le stockage de données le moins cher est Azure Table Storage.


Fait intĂ©ressant, lorsque vous crĂ©ez une application de fonction, le stockage est Ă©galement créé automatiquement, dont la fonction elle-mĂȘme a besoin pour fonctionner. Si vous crĂ©ez un rĂ©fĂ©rentiel sĂ©parĂ©, il est conseillĂ© de dĂ©finir les paramĂštres de base comme ceci:



La réplication LSR est actuellement l'option la moins chÚre. Il est sélectionné lors de la création automatique d'un référentiel lié à une fonction.
Ce dont nous avons besoin maintenant, c'est de recevoir les donnĂ©es du hub IoT et de les Ă©crire dans le stockage. Dans ce cas, lors de la crĂ©ation d'une fonction, la fenĂȘtre Quick Start ne pourra pas nous proposer l'option souhaitĂ©e.



Par conséquent, cliquez sur le lien Fonction personnalisée situé en bas et sélectionnez l'option IoT Hub (Event Hub).
Cette fenĂȘtre s'ouvrira pour nous:



Dans lequel nous pouvons remplir le champ de connexion Event Hub avec un choix simple (en cliquant sur nouveau). Mais pour indiquer le nom du concentrateur d'événements, vous devez accéder au concentrateur IoT. Dans le concentrateur, vous devez accéder aux points de terminaison (points de terminaison) et obtenir le nom compatible avec Event Hub à partir de là



Passons au code de fonction. L'extrait de code suivant reçoit des données du hub IoT et les stocke dans le stockage de table:


 #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; } } 

Si vous utilisez ce code dans un projet rĂ©el, n'oubliez pas de placer la chaĂźne de connexion dans un endroit plus sĂ»r - dans les paramĂštres de l'application (exactement la mĂȘme que la chaĂźne de connexion de la premiĂšre fonction).


La chaĂźne de connexion elle-mĂȘme peut ĂȘtre prise dans l'Ă©lĂ©ment de paramĂštres appelĂ© ClĂ©s d'accĂšs:



Afficher le contenu du tableau avec l'utilitaire gratuit Azure Storage Explorer


Étant donnĂ© que le coĂ»t d'Azure Table Storage est assez faible et que les fonctions Azure et le hub IoT offrent gratuitement certaines ressources mensuellement, le coĂ»t de la solution complĂšte par mois peut ĂȘtre infĂ©rieur Ă  1 $. Bien sĂ»r, cela dĂ©pend de la quantitĂ© de donnĂ©es. Comptez pour vous. Aujourd'hui, 1 Go de donnĂ©es coĂ»te 7 cents par mois et pour chaque million de transactions, vous ne serez facturĂ© que 4 cents.


INFO


Lorsque vous utilisez des services cloud de n'importe quel fournisseur, je vous conseille toujours de lier une carte de crédit avec le montant minimum à votre compte. C'est tout à fait par hasard qu'en choisissant une sorte de paramÚtre erroné, vous payez beaucoup plus que vous ne le pensez.


Nous vous rappelons qu'il s'agit de la version complĂšte d'un article du magazine Hacker . Son auteur est Alexey Sommer .


Matériaux utiles


Guide d'architecture d'application cloud


Adoptez une approche structurĂ©e pour dĂ©velopper des applications cloud. Cet e-book de 300 pages sur l'architecture de cloud computing dĂ©crit l'architecture, le dĂ©veloppement et les directives de mise en Ɠuvre qui s'appliquent quelle que soit la plateforme cloud que vous choisissez. Ce guide comprend des Ă©tapes pour:


  • Choisir le bon style d'architecture d'application cloud pour votre application ou solution;
  • sĂ©lection de technologies informatiques et de stockage de donnĂ©es appropriĂ©es;
  • mettre en Ɠuvre 10 principes de dĂ©veloppement pour crĂ©er une application Ă©volutive, rĂ©siliente et gĂ©rable;
  • suivre les cinq principes de crĂ©ation d'un logiciel de qualitĂ© garantissant le succĂšs de votre application cloud;
  • Utiliser des modĂšles de conception conçus pour le problĂšme que vous essayez de rĂ©soudre.

→ TĂ©lĂ©charger


Guide du développeur Azure



Dans cette mise à jour du Guide du développeur Azure, vous verrez comment l'ensemble complet de services pour la plate-forme logicielle Azure répond à vos besoins. Vous trouverez ici des informations sur les approches architecturales et les situations les plus courantes qui se produisent lors de la création d'applications cloud.


→ TĂ©lĂ©charger


Bases de Microsoft Azure


Ce livre fournit des informations importantes sur les services Azure clés pour les développeurs et les professionnels de l'informatique qui découvrent le cloud computing. Des démos étape par étape sont incluses pour aider le lecteur à comprendre comment démarrer avec chacun des services clés. Chaque chapitre est indépendant, il n'est pas nécessaire d'effectuer des démonstrations pratiques des chapitres précédents pour comprendre un chapitre en particulier.


Les sujets suivants sont traités dans ce livre:


  • Premiers pas avec Azure;
  • Azure Application Service et applications Web;
  • Machines virtuelles;
  • Service de stockage;
  • Bases de donnĂ©es
  • Services Azure supplĂ©mentaires.

→ TĂ©lĂ©charger


Liens utiles


Source: https://habr.com/ru/post/fr421847/


All Articles