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/
TCPConnector.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 | |
dvddnr | 8:89fe332bc412 | 7 | #define WIFI_WRITE_TIMEOUT 3000 |
dvddnr | 8:89fe332bc412 | 8 | #define WIFI_READ_TIMEOUT 25000 |
dvddnr | 8:89fe332bc412 | 9 | |
dvddnr | 8:89fe332bc412 | 10 | class TCPConnector |
dvddnr | 8:89fe332bc412 | 11 | { |
dvddnr | 8:89fe332bc412 | 12 | private: |
dvddnr | 8:89fe332bc412 | 13 | ES_WIFIObject_t m_es_wifi_ctx; |
dvddnr | 8:89fe332bc412 | 14 | |
dvddnr | 8:89fe332bc412 | 15 | public: |
dvddnr | 8:89fe332bc412 | 16 | |
dvddnr | 8:89fe332bc412 | 17 | TCPConnector() {} |
dvddnr | 8:89fe332bc412 | 18 | ~TCPConnector(){} |
dvddnr | 8:89fe332bc412 | 19 | |
dvddnr | 8:89fe332bc412 | 20 | bool wifi_connect(char *wifi_ssid, char* wifi_wpa_password, uint32_t max_attempts) |
dvddnr | 8:89fe332bc412 | 21 | { |
dvddnr | 8:89fe332bc412 | 22 | |
dvddnr | 8:89fe332bc412 | 23 | /* HW setup */ |
dvddnr | 8:89fe332bc412 | 24 | if (ES_WIFI_RegisterBusIO(&m_es_wifi_ctx, |
dvddnr | 8:89fe332bc412 | 25 | SPI_WIFI_Init, |
dvddnr | 8:89fe332bc412 | 26 | SPI_WIFI_DeInit, |
dvddnr | 8:89fe332bc412 | 27 | SPI_WIFI_Delay, |
dvddnr | 8:89fe332bc412 | 28 | SPI_WIFI_SendData, |
dvddnr | 8:89fe332bc412 | 29 | SPI_WIFI_ReceiveData) != ES_WIFI_STATUS_OK) |
dvddnr | 8:89fe332bc412 | 30 | return false; |
dvddnr | 8:89fe332bc412 | 31 | |
dvddnr | 8:89fe332bc412 | 32 | if (ES_WIFI_Init(&m_es_wifi_ctx) != ES_WIFI_STATUS_OK) |
dvddnr | 8:89fe332bc412 | 33 | return false; |
dvddnr | 8:89fe332bc412 | 34 | ES_WIFI_ResetToFactoryDefault(&m_es_wifi_ctx); |
dvddnr | 8:89fe332bc412 | 35 | |
dvddnr | 8:89fe332bc412 | 36 | /* JOIN AP */ |
dvddnr | 8:89fe332bc412 | 37 | for (int i = 0; i < max_attempts; i++) |
dvddnr | 8:89fe332bc412 | 38 | { |
dvddnr | 8:89fe332bc412 | 39 | if (ES_WIFI_Connect(&m_es_wifi_ctx, wifi_ssid, wifi_wpa_password, ES_WIFI_SEC_WPA_WPA2) == ES_WIFI_STATUS_OK) |
dvddnr | 8:89fe332bc412 | 40 | { |
dvddnr | 8:89fe332bc412 | 41 | return (ES_WIFI_GetNetworkSettings(&m_es_wifi_ctx) == ES_WIFI_STATUS_OK); |
dvddnr | 8:89fe332bc412 | 42 | } |
dvddnr | 8:89fe332bc412 | 43 | wait_ms(1000); |
dvddnr | 8:89fe332bc412 | 44 | } |
dvddnr | 8:89fe332bc412 | 45 | |
dvddnr | 8:89fe332bc412 | 46 | return false; |
dvddnr | 8:89fe332bc412 | 47 | } |
dvddnr | 8:89fe332bc412 | 48 | |
dvddnr | 8:89fe332bc412 | 49 | |
dvddnr | 8:89fe332bc412 | 50 | bool tcp_connect(uint8_t socket, char *domain_name, uint16_t remote_port, bool secure,uint32_t max_attempts) |
dvddnr | 8:89fe332bc412 | 51 | { |
dvddnr | 8:89fe332bc412 | 52 | ES_WIFI_Conn_t conn; |
dvddnr | 8:89fe332bc412 | 53 | ES_WIFI_Status_t res; |
dvddnr | 8:89fe332bc412 | 54 | |
dvddnr | 8:89fe332bc412 | 55 | conn.Number = socket; |
dvddnr | 8:89fe332bc412 | 56 | conn.RemotePort = remote_port; |
dvddnr | 8:89fe332bc412 | 57 | conn.LocalPort = 0; |
dvddnr | 8:89fe332bc412 | 58 | conn.Type = (secure)?ES_WIFI_TCP_SSL_CONNECTION:ES_WIFI_TCP_CONNECTION; |
dvddnr | 8:89fe332bc412 | 59 | strncpy((char *)conn.RemoteHost, domain_name, sizeof(conn.RemoteHost)); |
dvddnr | 8:89fe332bc412 | 60 | for(int i=0;i<max_attempts;i++) |
dvddnr | 8:89fe332bc412 | 61 | { |
dvddnr | 8:89fe332bc412 | 62 | res = ES_WIFI_ConnectToRemoteHost(&m_es_wifi_ctx, &conn); |
dvddnr | 8:89fe332bc412 | 63 | if(res == ES_WIFI_STATUS_OK) return true; |
dvddnr | 8:89fe332bc412 | 64 | } |
dvddnr | 8:89fe332bc412 | 65 | return false; |
dvddnr | 8:89fe332bc412 | 66 | } |
dvddnr | 8:89fe332bc412 | 67 | |
dvddnr | 8:89fe332bc412 | 68 | |
dvddnr | 8:89fe332bc412 | 69 | bool tcp_close(uint32_t socket) |
dvddnr | 8:89fe332bc412 | 70 | { |
dvddnr | 8:89fe332bc412 | 71 | ES_WIFI_Conn_t conn; |
dvddnr | 8:89fe332bc412 | 72 | conn.Number = socket; |
dvddnr | 8:89fe332bc412 | 73 | |
dvddnr | 8:89fe332bc412 | 74 | return (ES_WIFI_StopClientConnection(&m_es_wifi_ctx, &conn)== ES_WIFI_STATUS_OK); |
dvddnr | 8:89fe332bc412 | 75 | } |
dvddnr | 8:89fe332bc412 | 76 | |
dvddnr | 8:89fe332bc412 | 77 | |
dvddnr | 8:89fe332bc412 | 78 | bool tcp_write(uint8_t socket, char *data, uint32_t data_len) |
dvddnr | 8:89fe332bc412 | 79 | { |
dvddnr | 8:89fe332bc412 | 80 | uint16_t ack; |
dvddnr | 8:89fe332bc412 | 81 | uint16_t chunk_size; |
dvddnr | 8:89fe332bc412 | 82 | ES_WIFI_Status_t res; |
dvddnr | 8:89fe332bc412 | 83 | |
dvddnr | 8:89fe332bc412 | 84 | for(int i=0;i<data_len;i+=ES_WIFI_PAYLOAD_SIZE) |
dvddnr | 8:89fe332bc412 | 85 | { |
dvddnr | 8:89fe332bc412 | 86 | chunk_size = ((data_len-i)<ES_WIFI_PAYLOAD_SIZE)?(data_len-i):ES_WIFI_PAYLOAD_SIZE; |
dvddnr | 8:89fe332bc412 | 87 | res = ES_WIFI_SendData(&m_es_wifi_ctx, socket, (uint8_t*)data+i, chunk_size, &ack, WIFI_WRITE_TIMEOUT); |
dvddnr | 8:89fe332bc412 | 88 | if( res != ES_WIFI_STATUS_OK || chunk_size != ack ) return false; |
dvddnr | 8:89fe332bc412 | 89 | } |
dvddnr | 8:89fe332bc412 | 90 | return true; |
dvddnr | 8:89fe332bc412 | 91 | } |
dvddnr | 8:89fe332bc412 | 92 | |
dvddnr | 8:89fe332bc412 | 93 | |
dvddnr | 8:89fe332bc412 | 94 | bool tcp_read(uint8_t socket, char *rx_buffer, uint16_t rx_buffer_len, uint16_t *received_bytes,bool continued) |
dvddnr | 8:89fe332bc412 | 95 | { |
dvddnr | 8:89fe332bc412 | 96 | bool rx = false; |
dvddnr | 8:89fe332bc412 | 97 | *received_bytes = 0; |
dvddnr | 8:89fe332bc412 | 98 | |
dvddnr | 8:89fe332bc412 | 99 | rx = (continued)?( ES_WIFI_ReceiveData2(&m_es_wifi_ctx, (uint8_t*)rx_buffer, rx_buffer_len, received_bytes) == ES_WIFI_STATUS_OK ): |
dvddnr | 8:89fe332bc412 | 100 | ( ES_WIFI_ReceiveData(&m_es_wifi_ctx, socket, (uint8_t*)rx_buffer, rx_buffer_len, received_bytes, WIFI_READ_TIMEOUT) == ES_WIFI_STATUS_OK ); |
dvddnr | 8:89fe332bc412 | 101 | |
dvddnr | 8:89fe332bc412 | 102 | return rx; |
dvddnr | 8:89fe332bc412 | 103 | } |
dvddnr | 8:89fe332bc412 | 104 | |
dvddnr | 8:89fe332bc412 | 105 | |
dvddnr | 8:89fe332bc412 | 106 | |
dvddnr | 8:89fe332bc412 | 107 | |
dvddnr | 8:89fe332bc412 | 108 | |
dvddnr | 8:89fe332bc412 | 109 | }; |