A Telegram BOT for this awesome all-in-one board.

Dependencies:   BSP_B-L475E-IOT01 mbed es_wifi jsmn

Telegram Bot for DISCO_L475VG_IOT01

This application embeds aTelegram chatbot into the DISCO_L475VG_IOT01 board.

The Bot answers to the users queries about:

  • Real time environmental data taken from the on board sensors.
  • Environmental data history of the latest 24 hours stored on board.
  • Camera images taken from the Arducam-mini-2mp (optional).

This software uses:

Compilation

Import in your compiler and modify the following defines:

  • WIFI_SSID
  • WIFI_PASSWORD
  • TELEGRAM_BOT_APIKEY

Please follow the Telegram bots documentation (https://core.telegram.org/bots) to better understand how the Telegram API works and how to create your bot.

In order to support the Arducam-Mini-2MP set WITH_ARDUCAM_2640 #define to 1.

Screenshots

/media/uploads/dvddnr/screenshot_20180130-073732.png /media/uploads/dvddnr/screenshot_20180130-073703.png /media/uploads/dvddnr/arducam.jpeg /media/uploads/dvddnr/screenshot_20180216-102601.png

Security

The Inventek wifi module creates the ssl connection but does not authenticate the server's certificate ( AT cmd P9=0 ).

For more details http://www.inventeksys.com/IWIN/programming-certificates-tcp-ssltls/

Committer:
dvddnr
Date:
Fri Feb 16 09:17:47 2018 +0000
Revision:
10:28cf58359411
Parent:
8:89fe332bc412
WITH_ARDUCAM_2640 default value to 0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dvddnr 8:89fe332bc412 1 #pragma once
dvddnr 8:89fe332bc412 2
dvddnr 8:89fe332bc412 3 #include <mbed.h>
dvddnr 8:89fe332bc412 4 #include "es_wifi.h"
dvddnr 8:89fe332bc412 5
dvddnr 8:89fe332bc412 6 #define HTTP_200OK "200 OK\r\n"
dvddnr 8:89fe332bc412 7 #define HTTP_CL "Content-Length: "
dvddnr 8:89fe332bc412 8
dvddnr 8:89fe332bc412 9 class HTTPHelper
dvddnr 8:89fe332bc412 10 {
dvddnr 8:89fe332bc412 11 private:
dvddnr 8:89fe332bc412 12 char m_io_buffer[ES_WIFI_PAYLOAD_SIZE];
dvddnr 8:89fe332bc412 13
dvddnr 8:89fe332bc412 14 public:
dvddnr 8:89fe332bc412 15
dvddnr 8:89fe332bc412 16 HTTPHelper() {}
dvddnr 8:89fe332bc412 17 ~HTTPHelper(){}
dvddnr 8:89fe332bc412 18
dvddnr 8:89fe332bc412 19
dvddnr 8:89fe332bc412 20 bool HttpParseResponse(TCPConnector *net,uint8_t socket, char *content_buffer, uint32_t content_buffer_size, bool *status_ok, uint32_t *content_size)
dvddnr 8:89fe332bc412 21 {
dvddnr 8:89fe332bc412 22 uint16_t recv_bytes = 0;
dvddnr 8:89fe332bc412 23 uint16_t http_content_len = 0;
dvddnr 8:89fe332bc412 24 char *http_content_pivot = NULL;
dvddnr 8:89fe332bc412 25 uint16_t content_chunk_size;
dvddnr 8:89fe332bc412 26 bool res = false;
dvddnr 8:89fe332bc412 27
dvddnr 8:89fe332bc412 28 *status_ok = false;
dvddnr 8:89fe332bc412 29 *content_size = 0;
dvddnr 8:89fe332bc412 30
dvddnr 8:89fe332bc412 31 // receive RESPONSE
dvddnr 8:89fe332bc412 32 m_io_buffer[0] = 0;
dvddnr 8:89fe332bc412 33 if(net->tcp_read(socket,m_io_buffer,ES_WIFI_PAYLOAD_SIZE,&recv_bytes,false))
dvddnr 8:89fe332bc412 34 {
dvddnr 8:89fe332bc412 35 if (recv_bytes > 0)
dvddnr 8:89fe332bc412 36 {
dvddnr 8:89fe332bc412 37 m_io_buffer[recv_bytes]=0;
dvddnr 8:89fe332bc412 38 printf("%s\r\n",m_io_buffer);
dvddnr 8:89fe332bc412 39 http_parse_response(m_io_buffer, recv_bytes, status_ok, &http_content_len);
dvddnr 8:89fe332bc412 40 printf("> HTTP OK = %d Content len = %d\r\n", *status_ok, http_content_len);
dvddnr 8:89fe332bc412 41 *content_size = http_content_len;
dvddnr 8:89fe332bc412 42
dvddnr 8:89fe332bc412 43 /* fetch content */
dvddnr 8:89fe332bc412 44 http_content_pivot = strstr(m_io_buffer, "\r\n\r\n");
dvddnr 8:89fe332bc412 45 if (http_content_pivot != NULL)
dvddnr 8:89fe332bc412 46 {
dvddnr 8:89fe332bc412 47 /* copy first content chunk */
dvddnr 8:89fe332bc412 48 http_content_pivot += 4;
dvddnr 8:89fe332bc412 49 content_chunk_size = strlen(http_content_pivot);
dvddnr 8:89fe332bc412 50 if (content_chunk_size < content_buffer_size) strcpy(content_buffer, http_content_pivot);
dvddnr 8:89fe332bc412 51 http_content_len -= content_chunk_size;
dvddnr 8:89fe332bc412 52 printf("http_content_len %d content_chunk_size %d\r\n",http_content_len,content_chunk_size);
dvddnr 8:89fe332bc412 53
dvddnr 8:89fe332bc412 54 /* continue to fetch content chunck */
dvddnr 8:89fe332bc412 55 while (http_content_len > 0)
dvddnr 8:89fe332bc412 56 {
dvddnr 8:89fe332bc412 57 printf("http_content_len %d\r\n",http_content_len);
dvddnr 8:89fe332bc412 58 if( net->tcp_read(socket,m_io_buffer,ES_WIFI_PAYLOAD_SIZE,&recv_bytes,true) == false ) break;
dvddnr 8:89fe332bc412 59 m_io_buffer[recv_bytes] = 0;
dvddnr 8:89fe332bc412 60 http_content_len -= recv_bytes;
dvddnr 8:89fe332bc412 61 if (recv_bytes == 0)
dvddnr 8:89fe332bc412 62 {
dvddnr 8:89fe332bc412 63 printf("> ERROR : http content len overflow\r\n");
dvddnr 8:89fe332bc412 64 break;
dvddnr 8:89fe332bc412 65 }
dvddnr 8:89fe332bc412 66 strcat(content_buffer,m_io_buffer);
dvddnr 8:89fe332bc412 67 }
dvddnr 8:89fe332bc412 68 res = (http_content_len == 0);
dvddnr 8:89fe332bc412 69 }
dvddnr 8:89fe332bc412 70
dvddnr 8:89fe332bc412 71 }
dvddnr 8:89fe332bc412 72 }
dvddnr 8:89fe332bc412 73
dvddnr 8:89fe332bc412 74 return res;
dvddnr 8:89fe332bc412 75
dvddnr 8:89fe332bc412 76 }
dvddnr 8:89fe332bc412 77
dvddnr 8:89fe332bc412 78 private:
dvddnr 8:89fe332bc412 79
dvddnr 8:89fe332bc412 80 void http_parse_response(char *http_chunk, uint16_t http_chunk_len, bool *status_code_ok, uint16_t *content_len)
dvddnr 8:89fe332bc412 81 {
dvddnr 8:89fe332bc412 82 char *line_pivot, *key_pivot;
dvddnr 8:89fe332bc412 83
dvddnr 8:89fe332bc412 84 *status_code_ok = false;
dvddnr 8:89fe332bc412 85 *content_len = 0;
dvddnr 8:89fe332bc412 86
dvddnr 8:89fe332bc412 87 line_pivot = strstr(http_chunk, "\r\n");
dvddnr 8:89fe332bc412 88 if (line_pivot == NULL)
dvddnr 8:89fe332bc412 89 return ;
dvddnr 8:89fe332bc412 90
dvddnr 8:89fe332bc412 91 key_pivot = strstr(http_chunk, HTTP_200OK);
dvddnr 8:89fe332bc412 92
dvddnr 8:89fe332bc412 93 if (key_pivot != NULL)
dvddnr 8:89fe332bc412 94 *status_code_ok = true;
dvddnr 8:89fe332bc412 95 else
dvddnr 8:89fe332bc412 96 *status_code_ok = false;
dvddnr 8:89fe332bc412 97
dvddnr 8:89fe332bc412 98 *content_len = 0;
dvddnr 8:89fe332bc412 99 while (1)
dvddnr 8:89fe332bc412 100 {
dvddnr 8:89fe332bc412 101 line_pivot = strstr(line_pivot + 2, "\r\n");
dvddnr 8:89fe332bc412 102 if (line_pivot == NULL)
dvddnr 8:89fe332bc412 103 break;
dvddnr 8:89fe332bc412 104 key_pivot = strstr(http_chunk, HTTP_CL);
dvddnr 8:89fe332bc412 105 if (key_pivot == NULL)
dvddnr 8:89fe332bc412 106 continue;
dvddnr 8:89fe332bc412 107 if (key_pivot < line_pivot)
dvddnr 8:89fe332bc412 108 {
dvddnr 8:89fe332bc412 109 key_pivot += strlen(HTTP_CL);
dvddnr 8:89fe332bc412 110 *content_len = atoi((char const *)key_pivot);
dvddnr 8:89fe332bc412 111 break;
dvddnr 8:89fe332bc412 112 }
dvddnr 8:89fe332bc412 113 }
dvddnr 8:89fe332bc412 114 }
dvddnr 8:89fe332bc412 115
dvddnr 8:89fe332bc412 116
dvddnr 8:89fe332bc412 117 };