Controllare i dispositivi con Telegram

Senza pensarci più di tanto, in ogni istante della nostra routine quotidiana ormai siamo abituati ad usare le applicazioni di messaggistica istantanea sul nostro cellulare: WhatsApp, Telegram, Facebook Messenger sono solo alcune delle innumerevoli applicazioni che troviamo negli store. Ovviamente non tutti sono a conoscenza che alcune applicazioni nascondono delle funzionalità extra che consentono di realizzare grandi cose. Ad esempio, l’applicazione di messaggistica Telegram consente di realizzare degli utenti fittizi che possono essere programmati per gestire le interazioni con gli altri utenti: i cosiddetti bot. In questo articolo affronteremo proprio la realizzazione da zero di un bot che sarà animato da un dispositivo Arduino.

Introduzione

L’applicazione Telegram, anche se meno diffusa della ben nota WhatsApp, è disponibile agli utenti da quasi un decennio, infatti la data della prima versione risale all’agosto del 2014. Probabilmente alcuni di voi non l’hanno mai installata, o comunque utilizzata pochissimo. Dal punto di vista della messaggistica condivide la stragrande maggioranza delle funzionalità con le altre app: scambio di messaggi di testo e media, videochiamate e possibilità di realizzare gruppi con innumerevoli utenti. Un pò meno sono quelli a conoscenza della funzionalità dei bot, introdotta nel 2015.

Ma cosa sono i bot?

I bot sono delle tipologie di utente che possono essere create all’interno della piattaforma di Telegram e che, programmati opportunamente, consentono di inviare messaggi in automatico in modo da poter interagire con gli utenti reali. Di seguito vi realizzerò un tutorial dettagliato in cui vi mostrerò passo dopo passo la realizzazione di un bot all’interno della piattaforma Telegram e la configurazione del nostro dispositivo Arduino per poter dare vita al bot. Il tutorial è diviso in una prima parte in cui andiamo ad instaurare la comunicazione tra il bot e la nostra scheda Arduino (step 1-2-3) e una seconda parte in cui andremo ad approfondire i concetti per poter realizzare le funzionalità che più ci piacciono. Il tutorial è concentrato sull'utilizzo della libreria per Arduino denominata UniversalTelegramBot. Inoltre, per la realizzazione di questo tutorial userò anche uno smartphone con sistema operativo Android per poter operare all'interno dell’applicazione Telegram ed una scheda Arduino MKR Wi-Fi 1010 (vedi Figura 1) che integra l’interconnessione Wi-Fi e Bluetooth per realizzare in maniera veloce e immediata progetti di Internet of Things. La scheda è dotata di un ARM Cortex-M0 che si interfaccia con un chipset per le comunicazioni wireless, un modulo per la carica di eventuali batterie Litio.

Figura 1: Scheda Arduino MKR Wi-Fi 1010

Le caratteristiche complete della scheda sono:

  • Microcontroller SAMD21 Cortex®-M0+ 32bit low power ARM MCU
  • Modulo radio u-blox NINA-W102
  • Alimentazione (USB/VIN) 5 V
  • Tensione operativa 3.3 V
  • Secure Element ATECC508
  • Digital I/O Pins 8
  • PWM Pins 13 (0..8, 10, 12, 18/A3, 19/A4)
  • Comunicazioni: UART, SPI, I2C
  • Analog Input Pins 7 (ADC 8/10/12 bit)
  • Analog Output Pins 1 (DAC 10 bit)
  • External Interrupts 10
  • CPU Flash Memory 256 kB (internal)
  • SRAM 32 kB
  • LED_BUILTIN 6
  • USB Full-Speed USB Device and embedded Host
  • Dimensioni fisiche: 61.5 mm x 255 mm/peso 32 g

Step 1: Creare il bot Telegram

Il primo step da realizzare è la creazione di un bot all’interno dell’app Telegram attraverso BotFather. Questo non è altro che un account ricercabile sui Telegram (dalla barra di ricerca digitare @BotFather) che consente la generazione di qualsiasi altro bot. Una volta individuato il BotFather (Figura 2), utilizzeremo la chat per creare un nuovo bot eseguendo un semplice comando: “/newbot”. Questo è il comando generale per avviare la procedura di creazione di un nuovo bot. Alla ricezione di questo comando, il BotFather ci chiederà di assegnare un nome ed username univoco al nostro bot. Al termine di questa procedura il BotFather ci darà conferma della creazione e ci fornirà un codice alfanumerico detto Token, fondamentale per la configurazione con il nostro progetto da caricare su Arduino. Nel mio caso ho creato il bot con nome EOSexample e con username EOSexamplebot.

Figura 2: Schermata principale di BotFather nell'applicazione di messaggistica Telegram

Step 2: Configurazione dell’editor di Arduino

Passiamo ora al secondo step, in cui andremo a configurare l’editor per poter realizzare un software da caricare sulla nostra board Arduino MKR 1010. Nel mio caso specifico ho adoperato l’editor online di Arduino (all'indirizzo https://create.arduino.cc/editor) ma è possibile realizzare il progetto anche direttamente con l’IDE Arduino sul proprio computer. La configurazione dell’editor che affrontiamo in questo step prevede la necessità di aggiungere le librerie fondamentali per poter lavorare con Telegram. In particolar modo, avremo la necessità di adoperare le seguenti librerie:

  • UniversalTelegramBot: è la libreria realizzata per poter dotare il nostro progetto delle funzionalità principali di interazione con i bot di Telegram, a partire dalla ricezione e invio di semplici messaggi.
  • ArduinoJson: questa è una libreria che include il supporto a funzionalità quali serializzazione, streams, filtraggi e via dicendo ed è fondamentale per il corretto funzionamento della libreria UniversalTelegramBot.
  • WiFiNINA: consente l’utilizzo della connessione Wi-Fi sulla scheda MKR Wi-Fi 1010 e altri modelli di schede di Arduino.

Step 3: Progetto di ECHO

Il primo progetto che osserveremo è il cosiddetto ECHO, ossia caricheremo un software sulla nostra board Arduino capace di replicare ogni messaggio scritto all’interno della chat con il bot. Il software di questo progetto è già disponibile tra gli esempi della libreria UniversalTelegramBot (WiFiNINA -> ECHO) e di fatto non modificheremo nulla a meno della semplice configurazione: Token del nostro bot, SSID e password della rete Wi-Fi a cui collegarsi.

// Wifi network station credentials
char ssid[] = "SSID"; // your network SSID (name)
char password[] = "password"; // your network password
// Telegram BOT Token (Get from Botfather)
#define BOT_TOKEN "XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

Il principio di funzionamento dell’esempio di ECHO è estremamente semplice: configurato correttamente con il token del nostro bot, la scheda Arduino scansionerà periodicamente (parametro BOT_MTBS) la presenza di nuovi messaggi e, quando presenti, li invierà nuovamente all’utente che li ha generati. Nella sua banalità questa funzione di ECHO la considero al pari di “Hello World” per la comunicazione tra la nostra scheda Arduino e il bot che abbiamo realizzato al primo Step, in modo da poter verificare che tutto sia stato configurato correttamente.

La struttura dell’esempio di ECHO è la seguente:

  • Funzione di setup(): include la configurazione della seriale e del Wi-Fi. Attraverso la seriale è possibile monitorare lo stato di connessione del Wi-Fi o eventuali errori. In tal modo possiamo verificare che i parametri della nostra rete Wi-Fi siano stati immessi correttamente.
  • Funzione loop(): attraverso il primo costrutto if viene verificato che il tempo trascorso tra il ciclo attuale e l’ultimo ciclo di ricezione dei messaggi sia superiore al parametro BOT_MTBS. Quando questa condizione è verificata viene effettuato un controllo di quanti nuovi messaggi sono presenti e questi vengono gestiti attraverso la funzione handleNewMessages trattata nel punto successivo.
  • Funzione void handleNewMessages(int numNewMessages) è la funzione che gestisce i nuovi messaggi effettuando un invio dello stesso messaggio ricevuto. L’invio si ottiene attraverso la funzione bot.sendMessage.
  • Funzione printWiFiStatus(): la funzione consente di stampare sul monitor lo stato di connessione al Wi-Fi. La funzione è inclusa all'interno del codice ed è comoda, ma può essere modificata all'occorrenza per semplificare la quantità di informazioni stampate sul monitor seriale. Ad esempio, in alcuni casi mi è stato molto comodo modificare la funzione con il pilotaggio di un LED verde in caso di connessione stabilita e il LED rosso in caso di connessione fallita.

Di seguito riporto il codice completo che potrete trovare anche nel file dell'esempio ECHO incluso nella libreria. Mentre in Figura trovate un esempio di messaggi scambiati all'interno della chat con il bot.

#include <SPI.h>
#include <WiFiNINA.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>

// Wifi network station credentials
char ssid[] = "SSID"; // your network SSID (name)
char password[] = "password"; // your network password
// Telegram BOT Token (Get from Botfather)
#define BOT_TOKEN "XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

const unsigned long BOT_MTBS = 1000; // mean time between scan messages

int status = WL_IDLE_STATUS;

WiFiSSLClient client;
UniversalTelegramBot bot(BOT_TOKEN, client);
unsigned long bot_lasttime; // last time messages' scan has been done

void handleNewMessages(int numNewMessages)
{
for (int i = 0; i < numNewMessages; i++)
{
bot.sendMessage(bot.messages[i].chat_id, bot.messages[i].text, "");
}
}

void printWiFiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());

// print your board's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);

// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}

void setup()
{
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}

// check for the WiFi module:
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Communication with WiFi module failed!");
// don't continue
while (true);
}

String fv = WiFi.firmwareVersion();
if (fv < "1.0.0") {
Serial.println("Please upgrade the firmware");
}

// attempt to connect to WiFi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(ssid, password);

// wait 10 seconds for connection:
delay(10000);
}
Serial.println("Connected to wifi");
printWiFiStatus();
}

void loop()
{
if (millis() - bot_lasttime > BOT_MTBS)
{
int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

while (numNewMessages)
{
Serial.println("got response");
handleNewMessages(numNewMessages);
numNewMessages = bot.getUpdates(bot.last_message_received + 1);
}

bot_lasttime = millis();
}
}

Step 4: Impariamo la struttura dei messaggi

Allo Step 2 siamo riusciti a metter su facilmente una comunicazione semplice ed immediata tra la nostra scheda Arduino e il bot Telegram creato al primo step. Come osservato, la gestione del “comportamento” del nostro bot risiede tutta nella funzione di handleNewMessages. Si osserva anche che la sintassi del comando di invio di un nuovo messaggio è la seguente:

[...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2446 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend