{"id":5462,"date":"2023-02-17T09:59:00","date_gmt":"2023-02-17T08:59:00","guid":{"rendered":"https:\/\/blog.besharp.it\/?p=5462"},"modified":"2023-02-17T14:27:24","modified_gmt":"2023-02-17T13:27:24","slug":"creiamo-un-sensore-zigbee-iot-basato-su-greengrass","status":"publish","type":"post","link":"https:\/\/blog.besharp.it\/it\/creiamo-un-sensore-zigbee-iot-basato-su-greengrass\/","title":{"rendered":"Creiamo un sensore ZigBee IoT Basato su Greengrass"},"content":{"rendered":"\n

L’Internet of things (IoT) \u00e8 in continua evoluzione e si parla sempre pi\u00f9 spesso di dispositivi connessi per il grande pubblico e nei settori industriale, energetico e Smart City.<\/p>\n\n\n\n

Mentre nei prodotti IoT realizzati per gli utenti finali \u00e8 comune trovare dispositivi direttamente connessi a Internet tramite reti WiFi o 4G, tutta una serie di applicazioni meno visibili ai consumatori possono beneficiare di un’architettura composta da due distinti stack di rete.<\/p>\n\n\n\n

In questi casi, un gruppo di dispositivi IoT costituisce una rete locale utilizzando protocolli che possono essere molto diversi da quelli utilizzati su Internet.<\/p>\n\n\n\n

Il principale vantaggio \u00e8 la possibilit\u00e0 di operare reti di dispositivi connessi anche in aree non servite dalla rete 3\/4\/5G o dove \u00e8 impossibile connettere ogni dispositivo a Internet. Inoltre, questi dispositivi sono generalmente molto pi\u00f9 economici da acquistare e da produrre in serie.<\/p>\n\n\n\n

All’interno di queste reti viene spesso individuato un nodo particolare, che funge da coordinatore della rete, e che, se necessario, pu\u00f2 fungere da ponte per mettere in comunicazione la rete con il mondo esterno tramite Internet.<\/p>\n\n\n\n

Il protocollo ZigBee \u00e8 uno standard di comunicazione wireless basato sulla specifica IEEE 802.15.4 ed \u00e8 uno degli stack pi\u00f9 popolari per la creazione di una rete locale di dispositivi wireless.<\/p>\n\n\n\n

Durante il tempo che ci \u00e8 concesso dedicare alla ricerca e allo studio di nuovi servizi, abbiamo creato un playground per sperimentare Zigbee e Greengrass. Abbiamo sviluppato un PoC per testare sia la comunicazione Zigbee che vari aspetti di Greengrass.<\/p>\n\n\n\n

Questo articolo \u00e8 un diario su come abbiamo creato un dispositivo edge basato su Greengrass e lo abbiamo utilizzato per elaborare i dati raccolti da una rete di sensori in locale, sfruttando le funzionalit\u00e0 principali di AWS IoT per inserire i dati raccolti nella nostra applicazione cloud-native.<\/p>\n\n\n\n

Architettura<\/h2>\n\n\n\n

Per preparare il terreno, abbiamo sviluppato in modo rapido e frugale un sensore wireless utilizzando un modulo XBee, un regolatore di tensione e una fotoresistenza. <\/p>\n\n\n\n

XBee utilizza lo standard Zigbee, aggiunge alcune funzionalit\u00e0 e lo racchiude nel suo piccolo pacchetto pulito; inoltre, il modulo \u00e8 molto pi\u00f9 economico e facile da ottenere rapidamente utilizzando i nostri attuali fornitori.<\/p>\n\n\n\n

Quindi quello che avevamo in mente era qualcosa di simile al diagramma seguente:<\/p>\n\n\n\n

\"Greengrass-powered<\/figure>\n\n\n\n

<\/p>\n\n\n\n

Il sensore rileva la tensione derivata dalla fotoresistenza circa 2 volte al secondo e la trasmette sulla rete ZigBee al nodo coordinatore.<\/p>\n\n\n\n

Il nodo coordinatore, che include Greengrass, legge i dati dalla porta seriale, analizza il pacchetto ed estrae il valore trasmesso dal sensore. Poich\u00e9 il valore \u00e8 solo un numero intero ed \u00e8 rumoroso, volevamo bufferizzare ed elaborare i punti dati in locale, calcolare il valore medio per un intervallo di tempo predefinito e inoltrare l’output verso IoT Core.<\/p>\n\n\n\n

I dati puliti vengono quindi archiviati sia sullo shadow remoto dell\u2019oggetto, sia in un database per alimentare uno strumento di visualizzazione.<\/p>\n\n\n\n

L\u2019hardware<\/h2>\n\n\n\n

Per il sensore, abbiamo costruito una scheda prototipo con solo uno stadio di alimentazione, realizzata utilizzando un regolatore di tensione e un modulo XBee.<\/p>\n\n\n\n

Il modulo ha tutto ci\u00f2 di cui abbiamo bisogno per soddisfare i nostri requisiti. Ha un ADC integrato e, ovviamente, \u00e8 in grado di unirsi o formare una rete Zigbee e inviare dati su di essa.<\/p>\n\n\n\n

Fortunatamente non \u00e8 necessario un microcontrollore esterno, il modulo XBee pu\u00f2 essere configurato utilizzando XCTU<\/a>. Questo strumento \u00e8 un’applicazione gratuita che consente agli sviluppatori di interagire con i moduli Digi RF attraverso un’interfaccia grafica semplice da usare. Ti mostreremo come l’abbiamo utilizzato per configurare i moduli XBee.<\/p>\n\n\n\n

Di seguito \u00e8 riportato lo schema del sensore, comprendente un’unit\u00e0 di alimentazione (il regolatore di tensione), il partitore di tensione a fotoresistenza e un circuito di ripristino del modulo.<\/p>\n\n\n\n

\"schema<\/figure>\n\n\n\n

Abbiamo scelto di alimentare la scheda utilizzando una batteria da 9V perch\u00e9 ne abbiamo alcune in ufficio e perch\u00e9 sono compatte, sicure e facili da trovare in qualsiasi negozio.<\/p>\n\n\n\n

Poich\u00e9 questo \u00e8 solo un PoC, non ci andava di costruire qualcosa di alimentato con batterie al litio, e per lo scopo di questo progetto, il nostro regolatore di tensione e una batteria standard da 9V sono stati pi\u00f9 che sufficienti.<\/p>\n\n\n\n

Una volta assemblata, la scheda ha un aspetto simile a questo<\/p>\n\n\n\n

\"We<\/figure>\n\n\n\n

<\/p>\n\n\n\n

\"\"<\/figure>\n\n\n\n

Per il nodo coordinatore, abbiamo utilizzato un Raspberry Pi dotato di sistema operativo Raspbian, Greengrass e un semplice shield che abbiamo realizzato per alimentare e connettere il modulo XBee all’intestazione GPIO. Abbiamo utilizzato la porta seriale hardware integrata.<\/p>\n\n\n\n

Lo shield<\/p>\n\n\n\n

\"Raspberry<\/figure>\n\n\n\n

<\/p>\n\n\n\n

\"Raspberry<\/figure>\n\n\n\n

Il coordinatore completamente assemblato<\/p>\n\n\n\n

\"The<\/figure>\n\n\n\n

<\/p>\n\n\n

\n
\"The<\/figure><\/div>\n\n\n

<\/p>\n\n\n\n

Il software<\/h2>\n\n\n\n

Dopo aver installato Greengrass sul Raspberry pi (puoi seguire la documentazione ufficiale o il nostro articolo che dovrebbe aiutarti a farlo in pochi passaggi), possiamo sviluppare il nostro codice sorgente.<\/p>\n\n\n\n

Il compito del nostro Raspberry pi \u00e8 raccogliere i messaggi ricevuti tramite ZigBee, analizzarli e infine inviare il valore letto dal sensore tramite MQTT su un named shadow IoT Core. Fortunatamente, come accennato in precedenza, possiamo leggere facilmente questi dati collegandoci al dispositivo seriale Linux e leggendo i byte in ingresso. Il codice \u00e8 uno script Python piuttosto semplice:<\/p>\n\n\n\n

import json\nimport time\nfrom serial import Serial, PARITY_NONE\nimport awsiot.greengrasscoreipc\nimport awsiot.greengrasscoreipc.client as client\nfrom awsiot.greengrasscoreipc.model import UpdateThingShadowRequest\n\nLIGHT_TOPIC = \"$aws\/things\/<your_iot_device_name>\/shadow\/name\/<named_shadow>\"\nQOS = QOS.AT_LEAST_ONCE\nipc_client = awsiot.greengrasscoreipc.connect()\n\n\ndef send_light_value(payload):\n\tupdate_thing_shadow_request = UpdateThingShadowRequest()\n\tupdate_thing_shadow_request.thing_name = \"p2bc-core-device\"\n\tupdate_thing_shadow_request.shadow_name = \"light\"\n\tupdate_thing_shadow_request.payload = json.dumps(\n    \t{\"state\": {\"reported\": payload}})\n\top = ipc_client.new_update_thing_shadow()\n\top.activate(update_thing_shadow_request)\n\tfut = op.get_response()\n\n\tresult = fut.result(10)\n\treturn result.payload\n\n\nwith Serial('\/dev\/ttyS0', 9600, timeout=None, parity=PARITY_NONE, rtscts=1) as ser:\n\twhile True:\n    \ts = ser.read(1)\n    \tbuff = list(s)\n    \tif len(buff) == 0 or buff[0] != 126:\n        \tprint(\"continuing\")\n        \tcontinue\n    \tbuff = buff + list(ser.read(2))\n    \tframe_length = buff[1] * 255 + buff[2]\n    \tbuff = buff + list(ser.read(frame_length + 1))\n\tprint(f\"Buffer: {buff}\")\n    \tprint(\"Sending to IoT core\")\n\tlight = get_light_intensity(buffer) # The implementation depends on the board you chose\n    \tsend_light_value({\"light\": light})\n<\/pre>\n\n\n\n

Possiamo impacchettare questo script e distribuirlo grazie alla funzionalit\u00e0 pi\u00f9 utile di Greengrass: le distribuzioni automatizzate delle funzione Lambda.<\/p>\n\n\n\n

Per fare ci\u00f2, dobbiamo solo creare una nuova funzione Lambda nel nostro account AWS e abilitare il versioning.<\/p>\n\n\n\n

Dopo averlo fatto, per inviare il pacchetto al nostro core device Greengrass, dobbiamo creare un custom component e collegarlo all’ultima versione della funzione Lambda che abbiamo appena creato. Ricorda che i componenti Greengrass Lambda possono essere di due tipi:<\/p>\n\n\n\n