Vabbe', allora
complice un cambio di programma e una piccola serie di fortunate coincidenze sono rientrato 12 ore prima
e quindi posso anticipare la presentazione della mia "libreria" per telegram
Ora, dalla documentazione di telegram sappiamo che per trasmettere un messaggio di testo basta inviare al server di telegram un "messaggio" così composto:
GET /botValoredelToken/sendMessage?chat_id=Account&text=TestodaTrasmettere&parse_mode=TipodiParsemode
dove si deve sostituire a
ValeredelToken la sequenza di caratteri che rappresenta il token del bot
TestodaTrasmettere con la sequenza di caratteri che rappresenta il messaggio, con gli eventuali a capo sostituiti dalla sequenza %0A
La parte &parse_mode è opzionale e si usa per cambiare certe caratteristiche grafiche di Telegram
Questa sequenza viene terminata da un '/n'
invece di "costruire" un unica gigantesca stringa, magari prorpio oggetto stringa, come ho visto fare nelle librerie che ho trovato ho preferito dividere l'operazione in tre fasi:
- aprire la comunicazione col bot
- con una serie di print (e mai nessuna println) "spedire" i vari pezzi successivi del messaggio
- chiudere il messaggio con una sola println, e magari la parte parsemode opzionale
ecco quindi le funzioni dedicate
bool botopen(unsigned long int destinatario)
{
digitalWrite(LED, 1); // led di trasmissione in corso
// inizia una trasmissione al bot
// non chiude la connessione, lascia aggiungere
// per Telegram il messaggio viene chiuso da un fine riga (a capo)
if (telegrambot.connect(telegram, PORTA))
{
telegrambot.print(F("GET /bot"));
telegrambot.print(token);
telegrambot.print(F("/sendMessage?chat_id="));
telegrambot.print(destinatario);
telegrambot.print(F("&text="));
return true;
// si commenta da solo
}
else
{
Serial.println(F("Errore trasmissione telegram"));
digitalWrite(LED, 0); // led di trasmissione in corso
return false;
}
}
che iniza la comunicazione col bot e per soprammercato accende anche un LED di segnalazione "trasmissione in corso"
void botclose(int parsemode)
{// chiude la connessione
// parse=0 per no parse
// parse 1 per parse= Markdown
if (parsemode == 1)
{
telegrambot.print(F("&parse_mode=Markdown"));
}
// il parametro opzionale parsemode permette di chiudere il messaggio
// dicendo a Telegram di seguire una differente convenzione grafica
telegrambot.println(); // il println chiude il messaggio
digitalWrite(LED, 0);
delay(350); // sembra che serva un delay minimale, anche se non ne ho trovato traccia nella documentazione
}
Che chiude la comunicazione ed eventualmente cambia il parsemode di Telegram
Per il corpo del messaggio è sufficente eseguire delle
telegrambot.print(quello che devo trasmettere);
anche più di una, usando "%0A" come ritorno a capo e solo alla fine della composizione del messaggio chiudere con la botclose()
per pura comodità ho anche creato una botsend(), che trasmette direttamente una stringa di 'C' (un array di caratteri), aprendo e chiudendo il bot come serve
void botsend(unsigned long int destinatario, char messaggio[])
{
// trasmette al bot il messaggio
// chiudendo il bot e non lasciando aggiungere
if (botopen(destinatario))
{
telegrambot.print(messaggio);
botclose();
// si commenta da solo
}
else
{
Serial.println(F("Errore apertura bot"));
}
}
naturalmente l'argomento destinatario è il "numero" dello account di Telegram, che non è il numero di telefono, e non è una stringa, ma un numero a 32 bit senza segno
parimenti l'argomento messaggio è l'array di char che contiene un messaggio completo
nella prossima puntata: Come ricevere