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:
- A modified version of the wifi library provided by ST in order to enable the TCP-SSL connection.
- An open source json parser jsmn (https://github.com/zserge/jsmn).
- A web service (http://now.http.org) to initialize the RTC.
- A web service (https://image-charts.com) to publish temperature,humidity and pressure charts.
- A modified version of the Arducam driver (https://os.mbed.com/users/dflet/)
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
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/
HTTPHelper.h@10:28cf58359411, 2018-02-16 (annotated)
- 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?
User | Revision | Line number | New 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 | }; |