Questo blocco funzione da eseguire in task Back, gestisce ricezione e trasmissione di messaggi Telegram tramite le web APIs, la massima lunghezza gestita è 1Kb (1024 caratteri). Il blocco funzione è protetto per utilizzarlo occorre richiedere il codice di protezione, vedi protezione funzioni e blocchi funzione. E’ comunque possibile utilizzarlo liberamente in modo test per 30 Min.
Ricezione messaggio: Viene ciclicamente eseguita con il tempo definito in TUpdate una richiesta al metodo “getUpdates” per verificare la presenza di messaggi nel proprio chatbot, i messaggi ricevuti se non letti vengono automaticamente cancellati dopo 24 ore. Se messaggi presenti viene attivato RxDone, il messaggio viene ritornato nel buffer RxMessage e cancellato dal chatbot, in RxMLength è ritornata la lunghezza del messaggio. In SChatID è ritornato il “chat id” dell’utente che ha inviato il messaggio e in RChatID è ritornato il proprio “chat id“. Eseguita la lettura del messaggio occorre attivare per un loop di programma RxAck.
Trasmissione messaggio: Attivando Send viene inviato il messaggio puntato da TxMessage alla “chat id” indicata in TxChatID tramite il metodo “sendMessage”. Terminato l’invio viene attivata l’uscita TxDone. In SChatID è ritornato il proprio “chat id” in RChatID è ritornato il “chat id” a cui è stato inviato il messaggio (Valore di TxChatID).
In caso di errore esecuzione viene attivata per un loop di programma l’uscita Fault.
Upgrade list
- Se l’oggetto aggiornato non è nell’ultima versione del package, vedi capitolo “Aggiornamento librerie” in questo articolo.
- Gli oggetti obsoleti sono inseriti nella libreria eLLabObsoleteLib fare riferimento al relativo manuale ed al manuale programmazione in formato pdf.
Telegram_v1
Utilizza la nuova versione FB HTTPClient_v5.
Creazione Bot su Telegram
Per utilizzare il FB per la ricezione e l’invio di messaggi Telegram, occorre appoggiarsi ad un bot. Un Telegram bot è paragonabile ad un utente umano, la grossa differenza è che non ha alcun bisogno di un numero di telefono mentre è obbligatorio per un utente. Vediamo ora in semplici passi come creare il nostro bot.
- Dall’app di Telegram premi sull’icona della lente di ingrandimento cerca BotFather ed avvialo.
- Cliccare su AVVIA.
- Digitare il comando “/newbot” e dare invio.
- Adesso invia il nome del bot che vuoi creare (es. testerbot).
- Ora devi scegliere username che deve terminare per forza in bot (es. tester_bot).
- Adesso botfather ti invierà un messaggio con il codice token del bot.
Il codice token ricevuto (Stringa tipo 270***zSjiQ7_y4TMA**kHm9T0) rappresenta il sistema di autenticazione ed è il valore da passare nel campo Token del FB. Digitando in un browser l’URL https://api.telegram.org/bot<TOKEN>/getMe verrà ritornato un oggetto JSON con tutte le informazioni del bot.
Ora occorre eseguire il bot, da Telegram sullo smartphone cercare il nome del bot creato (es. tester_bot). I messaggi inviati al bot saranno letti dal FB ed i messaggi inviati dal FB al bot saranno inoltrati all’utente indirizzato.

Come inviare messaggi ad un bot
Naturalmente i bot non hanno un numero di telefono abbinato, per inviare un messaggio ad un bot o ad un utente di cui non conosci il numero ti basta conoscere il loro username, in modo da cercarlo nel motore di ricerca dell’app.
Avvia l’app di Telegram e premi sul campo di testo Cerca situato in corrispondenza dell’icona della lente di ingrandimento, poi digita il nome utente della persona od il nome del bot a cui vuoi inviare il messaggio e selezionalo nei risultati della ricerca. Ora puoi digitare il testo del messaggio nel campo di testo ed inviarlo, premendo sull’icona della freccia situata in basso.
Come conoscere la chat ID di un utente
Per inviare un messaggio ad un utente Telegram occorre conoscere il chat id. Per conoscere il proprio chat id avvia l’app di Telegram e premi sul campo di testo Cerca situato in corrispondenza dell’icona della lente di ingrandimento, poi digita userinfobot, e selezionalo nei risultati della ricerca. Ora basta inviare un qualsiasi messaggio per ricevere il proprio “chat id“.
Descrizione
Enable (BOOL) Attivazione esecuzione.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento del FB (Vedi articolo).
RxAck (BOOL) Acnowledge risposta ricevuta, settare dopo avere acquisito la risposta.
HTTPClient (@HTTPClient_v5) Indirizzo allocazione FB HTTPClient di supporto.
Token (@STRING) Indirizzo stringa definizione token fornito con la registrazione a Telegram.
TxChatID (ULINT) “chat id” a cui inviare il messaggio.
TxMessage (@STRING) Indirizzo stringa definizione messaggio.
TPolling (TIME) Definizione tempo di polling verifica ricezione mesaggi.
Fault (BOOL) Attivo per un loop di programma se errore gestione.
RxDone (BOOL) Attivo alla ricezione di un messaggio. Il messaggio è presente nel buffer puntato da RxMessage e rimane attivo sino alla attivazione di RxAck.
TxDone (BOOL) Attivo per un loop al termine della trasmissione messaggio.
SChatID (ULINT) Su ricezione/trasmissione messaggio, ritorna la “chat id” di chi ha inviato il messaggio.
RChatID (ULINT) Su ricezione/trasmissione messaggio, ritorna la “chat id” di chi ha ricevuto il messaggio.
RxMessage (@STRING) Su ricezione messaggio, ritorna indirizzo allocazione messaggio ricevuto. Rimane valido fino all’acknowledge della risposta (Attivazione RxAck) da parte del programma.
RxMLength (UDINT) Su ricezione messaggio, ritorna lunghezza messaggio ricevuto.
RxTxMDate (UDINT) Valorizzato su ricezione messaggio, ritorna l’Epoch time del messaggio.
PCounter (UDINT) Contatore polling messaggi, incrementato ad ogni verifica ricezione messaggio.
RxCounter (UDINT) Contatore messaggi ricevuti.
TxCounter (UDINT) Contatore messaggi trasmessi.
Errors (UDINT) Contatore errori esecuzine.

Spionaggio funzionamento
Se SpyOn attivo è possibile utilizzare di spiare il funzionamento della FB. Sono previsti vari livelli di triggers.
Trigger di spionaggio
16#00000001 | ‘Rx’ Ricezione messaggio |
16#00000002 | ‘Tx’ Trasmissione mesaggio |
16#40000000 | ‘Er’ Errori di esecuzione |
Esempi
Come utilizzare gli esempi.
Ogni 30 secondi viene eseguita la verifica vi sono messaggi ricevuti, se ricevuto messaggio il messaggio viene reinviato al mittente. Attivando da debug la variabile MSend viene inviato un messaggio al destinatario definito in TxChatID. Per utilizzare l’esempio bisogna definire correttamente il token del proprio Bot e la “chat id” del destinatario.
LogicLab (Ptp156, ST_Telegram)
PROGRAM ST_Telegram
VAR
MSend : BOOL; (* Message send command *)
CaseNr : USINT; (* Program case *)
RxMessage : STRING[ 32 ]; (* Received message buffer *)
TxMessage : STRING[ 32 ]; (* Transmission message buffer *)
TCPClient : SysTCPClient; (* TCP client management *)
TLSClient : SysTLSClient; (* TLS client *)
HTTPRq : HTTPClient_v5; (* HTTP client *)
TGClient : Telegram_v1; (* Telegram client *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_Telegram"
// *****************************************************************************
// The program manages the Telegram messenger. On a command it sends a message
// to a user. On a message reception the message is echoed back to the sender.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATIONS
// -------------------------------------------------------------------------
// Program initializations.
IF (SysFirstLoop) THEN
// Set TCPClient parameters.
TCPClient.PeerAdd:=ADR('api.telegram.org'); //Peer address
TCPClient.PeerPort:=443; //Peer port
TCPClient.LocalAdd:=ADR('0.0.0.0'); //Local address
TCPClient.LocalPort:=0; //Local port
TCPClient.FlushTm:=50; //Flush time (mS)
TCPClient.LifeTm:=60; //Life time (S)
TCPClient.RxSize:=512; //Rx buffer size
TCPClient.TxSize:=512; //Tx buffer size
// Set TLSClient parameters.
TLSClient.SpyOn:=FALSE; //Spy active
TLSClient.Mode:=TLS_MODE_TCP; //TLS mode
TLSClient.Server:=TCPClient.PeerAdd; //Server name
TLSClient.CAFile:=eNULL; //CA file
TLSClient.CAVerify:=TLS_CA_NONE; //Certificate verify type
// Set HTTPClient parameters.
HTTPRq.SpyOn:=FALSE; //Activate the spy
HTTPRq.KeepAlive:=TRUE; //HTTP keep-alive
HTTPRq.RMethod:=HTTP_REQUEST#HTTP_POST; //Request method
HTTPRq.HostName:=TCPClient.PeerAdd; // Hostname
HTTPRq.Page:=eNULL; //Web page
HTTPRq.Request:=eNULL; //Request string
HTTPRq.Header:=eNULL; //HTTP header
HTTPRq.DBSize:=512; //Data buffer size
HTTPRq.Timeout:=T#10s; //Execution timeout (S)
// Set Telegram client parameters.
TGClient.SpyOn:=TRUE; //Spy On
TGClient.HTTPClient:=ADR(HTTPRq); //HTTP client
TGClient.Token:=ADR('8*08***27:AA**++++++++++++++3muqw'); //BOT token
TGClient.TPolling:=T#30s; //Polling time
END_IF;
// -------------------------------------------------------------------------
// FBs MANAGEMENT
// -------------------------------------------------------------------------
// All the needed FBs are managed.
TCPClient(Connect:=HTTPRq.Connect); //TCP client management
IF (TCPClient.Fault) THEN CaseNr:=0; END_IF;
TLSClient(IFile:=TCPClient.File); //TLS client management
IF (TLSClient.Fault) THEN CaseNr:=0; END_IF;
HTTPRq(File:=TLSClient.OFile); //HTTP client management
IF (HTTPRq.Fault) THEN CaseNr:=0; END_IF;
TGClient(Enable:=TRUE); //Telegram client management
IF (TGClient.Fault) THEN CaseNr:=0; END_IF;
TGClient.RxAck:=FALSE; //Rx message acknowledge
// -------------------------------------------------------------------------
// PROGRAM SEQUENCIES
// -------------------------------------------------------------------------
// Program sequencies.
CASE (CaseNr) OF
// ---------------------------------------------------------------------
// Reset any active commands.
// Check if a Telegram send message command has been set.
// Check if a Telegram message has been received.
0:
TGClient.Send:=FALSE; //Send message
IF (MSend) THEN CaseNr:=10; RETURN; END_IF;
IF (TGClient.RxDone) THEN CaseNr:=20; RETURN; END_IF;
// ---------------------------------------------------------------------
// SEND A TELEGRAM MESSAGE
// ---------------------------------------------------------------------
// Define the chat ID to send the message. To know the own chat ID send
// a message to @userinfobot by your phone app.
10:
MSend:=FALSE; //Message send command
eTO_JUNK(SysVsnprintf(ADR(TxMessage), SIZEOF(TxMessage), ADR('Message Nr:%d'), UDINT_TYPE, ADR(TGClient.TxCounter)));
TGClient.TxChatID:=12345678; //Tx chat id
TGClient.TxMessage:=ADR(TxMessage); //Tx message
TGClient.Send:=TRUE; //Send message
CaseNr:=CaseNr+1; //Program case
// ---------------------------------------------------------------------
// Message sending wait.
11:
IF NOT(TGClient.TxDone) THEN RETURN; END_IF;
TGClient.Send:=FALSE; //Send message
CaseNr:=0; //Program case
// ---------------------------------------------------------------------
// RECEIVE A TELEGRAM MESSAGE
// ---------------------------------------------------------------------
// The received message is transfert in the received buffer.
20:
eTO_JUNK(Sysmemmove(ADR(RxMessage), TGClient.RxMessage, TGClient.RxMLength));
TGClient.RxAck:=TRUE; //Rx message acknowledge
// The received message is send back to the sender.
TGClient.TxChatID:=TGClient.SChatID; //Tx chat id
TGClient.TxMessage:=ADR(RxMessage); //Tx message
TGClient.Send:=TRUE; //Send message
CaseNr:=CaseNr+1; //Program case
// ---------------------------------------------------------------------
// Message sending wait.
21:
IF NOT(TGClient.TxDone) THEN RETURN; END_IF;
TGClient.Send:=FALSE; //Send message
CaseNr:=0; //Program case
END_CASE;
// [End of file]