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/
main.cpp@10:28cf58359411, 2018-02-16 (annotated)
- Committer:
- dvddnr
- Date:
- Fri Feb 16 09:17:47 2018 +0000
- Revision:
- 10:28cf58359411
- Parent:
- 9:d24842a5a468
WITH_ARDUCAM_2640 default value to 0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dvddnr | 0:1fc46da4a976 | 1 | #include "mbed.h" |
dvddnr | 0:1fc46da4a976 | 2 | |
dvddnr | 0:1fc46da4a976 | 3 | #include "stm32l475e_iot01_tsensor.h" |
dvddnr | 0:1fc46da4a976 | 4 | #include "stm32l475e_iot01_hsensor.h" |
dvddnr | 0:1fc46da4a976 | 5 | #include "stm32l475e_iot01_psensor.h" |
dvddnr | 1:60fbd0835b9d | 6 | #include "es_wifi.h" |
dvddnr | 1:60fbd0835b9d | 7 | #include "es_wifi_io.h" |
dvddnr | 1:60fbd0835b9d | 8 | #include "jsmn.h" |
dvddnr | 8:89fe332bc412 | 9 | #include "TCPConnector.h" |
dvddnr | 8:89fe332bc412 | 10 | #include "HTTPHelper.h" |
dvddnr | 1:60fbd0835b9d | 11 | |
dvddnr | 1:60fbd0835b9d | 12 | |
dvddnr | 1:60fbd0835b9d | 13 | #define WIFI_SSID "" |
dvddnr | 1:60fbd0835b9d | 14 | #define WIFI_PASSWORD "" |
dvddnr | 1:60fbd0835b9d | 15 | #define TELEGRAM_BOT_APIKEY "" |
dvddnr | 10:28cf58359411 | 16 | #define WITH_ARDUCAM_2640 0 |
dvddnr | 6:94fc61e1cf40 | 17 | |
dvddnr | 1:60fbd0835b9d | 18 | #define CONNECTION_TRIAL_MAX 10 |
dvddnr | 1:60fbd0835b9d | 19 | |
dvddnr | 4:9926288a8703 | 20 | // LED |
dvddnr | 4:9926288a8703 | 21 | DigitalOut g_alivenessLED(LED1); |
dvddnr | 1:60fbd0835b9d | 22 | |
dvddnr | 9:d24842a5a468 | 23 | // secure tcp connector |
dvddnr | 8:89fe332bc412 | 24 | TCPConnector g_tcp_connector; |
dvddnr | 9:d24842a5a468 | 25 | // http parser utils |
dvddnr | 8:89fe332bc412 | 26 | HTTPHelper g_http_parser; |
dvddnr | 9:d24842a5a468 | 27 | // arducam driver |
dvddnr | 9:d24842a5a468 | 28 | #if WITH_ARDUCAM_2640 |
dvddnr | 9:d24842a5a468 | 29 | #include "ArduCAM2640.h" |
dvddnr | 8:89fe332bc412 | 30 | ArduCAM2640 g_arducam; |
dvddnr | 9:d24842a5a468 | 31 | /* jpeg buffer */ |
dvddnr | 9:d24842a5a468 | 32 | #define IMAGE_JPG_SIZE 16*1024 |
dvddnr | 9:d24842a5a468 | 33 | uint8_t g_image_buffer[IMAGE_JPG_SIZE]; |
dvddnr | 9:d24842a5a468 | 34 | #endif |
dvddnr | 0:1fc46da4a976 | 35 | |
dvddnr | 1:60fbd0835b9d | 36 | // http I/O buffer |
dvddnr | 1:60fbd0835b9d | 37 | char g_http_io_buffer[ES_WIFI_DATA_SIZE]; |
dvddnr | 1:60fbd0835b9d | 38 | |
dvddnr | 1:60fbd0835b9d | 39 | // Telegram json I/O buffer |
dvddnr | 8:89fe332bc412 | 40 | #define TBOT_JSON_BUFFER_SIZE 3 * 1024 |
dvddnr | 1:60fbd0835b9d | 41 | char g_json_io_buffer[TBOT_JSON_BUFFER_SIZE]; |
dvddnr | 1:60fbd0835b9d | 42 | |
dvddnr | 1:60fbd0835b9d | 43 | // telegram REST API |
dvddnr | 7:2b389a2e83c4 | 44 | const char TELEGRAM_GETUPDATES[] = "GET /bot" TELEGRAM_BOT_APIKEY "/getUpdates?offset=%d&timeout=20&limit=1 HTTP/1.1\r\nHost: api.telegram.org\r\nUser-Agent: curl/7.50.1\r\nAccept: */*\r\n\r\n"; |
dvddnr | 1:60fbd0835b9d | 45 | const char TELEGRAM_SENDMESSAGE[] = "GET /bot" TELEGRAM_BOT_APIKEY "/sendMessage HTTP/1.1\r\nHost: api.telegram.org\r\nUser-Agent: curl/7.50.1\r\nAccept: */*\r\nContent-Type: application/json\r\nContent-Length: %d\r\n\r\n"; |
dvddnr | 8:89fe332bc412 | 46 | const char TELEGRAM_SENDPHOTO[] = "POST /bot" TELEGRAM_BOT_APIKEY "/sendPhoto HTTP/1.1\r\nHost: api.telegram.org\r\nUser-Agent: curl/7.47.0\r\nAccept: */*\r\nContent-Length: %d\r\nConnection: close\r\n"; |
dvddnr | 9:d24842a5a468 | 47 | #if WITH_ARDUCAM_2640 |
dvddnr | 8:89fe332bc412 | 48 | const char TELEGRAM_CUSTOM_KEYBOARD[] = "{\"keyboard\": [[\"Temperature\",\"Humidity\",\"Pressure\"],[\"Daily\",\"RTC\",\"Camera\"]],\"one_time_keyboard\": true}"; |
dvddnr | 9:d24842a5a468 | 49 | #else |
dvddnr | 9:d24842a5a468 | 50 | const char TELEGRAM_CUSTOM_KEYBOARD[] = "{\"keyboard\": [[\"Temperature\",\"Humidity\",\"Pressure\"],[\"Daily\",\"RTC\"]],\"one_time_keyboard\": true}"; |
dvddnr | 9:d24842a5a468 | 51 | #endif |
dvddnr | 1:60fbd0835b9d | 52 | bool telegram_get_update(int32_t update_id); |
dvddnr | 8:89fe332bc412 | 53 | bool telegram_send_message(char *json_msg); |
dvddnr | 8:89fe332bc412 | 54 | bool telegram_send_photo(uint8_t *image, uint32_t image_size, int32_t chat_id, char *caption); |
dvddnr | 1:60fbd0835b9d | 55 | #define TELEGRAM_BOT_INCOMING_CMD_SIZE 80 |
dvddnr | 1:60fbd0835b9d | 56 | char g_incoming_msg[TELEGRAM_BOT_INCOMING_CMD_SIZE]; |
dvddnr | 8:89fe332bc412 | 57 | void telegram_bot(); |
dvddnr | 1:60fbd0835b9d | 58 | |
dvddnr | 5:f204a47aa813 | 59 | // now.httpbin.org |
dvddnr | 5:f204a47aa813 | 60 | const char NOW_HTTPBIN_ORG[] = "GET / HTTP/1.1\r\nHost: now.httpbin.org\r\nUser-Agent: curl/7.50.1\r\nAccept: */*\r\n\r\n"; |
dvddnr | 5:f204a47aa813 | 61 | bool set_rtc_from_network(void); |
dvddnr | 1:60fbd0835b9d | 62 | |
dvddnr | 1:60fbd0835b9d | 63 | // JSON parser |
dvddnr | 1:60fbd0835b9d | 64 | #define JSON_MAX_TOKENS 128 |
dvddnr | 1:60fbd0835b9d | 65 | jsmn_parser g_json_parser; |
dvddnr | 1:60fbd0835b9d | 66 | jsmntok_t g_json_tokens[JSON_MAX_TOKENS]; |
dvddnr | 1:60fbd0835b9d | 67 | bool jsoneq(const char *json, jsmntok_t *tok, const char *s,jsmntype_t type); |
dvddnr | 0:1fc46da4a976 | 68 | |
dvddnr | 7:2b389a2e83c4 | 69 | // Data history |
dvddnr | 7:2b389a2e83c4 | 70 | float g_daily_data_history_temp[24][60]; |
dvddnr | 7:2b389a2e83c4 | 71 | float g_daily_data_history_pres[24][60]; |
dvddnr | 7:2b389a2e83c4 | 72 | float g_daily_data_history_humi[24][60]; |
dvddnr | 7:2b389a2e83c4 | 73 | void daily_history_update(int hour, int min,float t, float p, float h); |
dvddnr | 7:2b389a2e83c4 | 74 | int32_t daily_humidity_history_chart(char *report_buffer, uint32_t buffer_len); |
dvddnr | 7:2b389a2e83c4 | 75 | int32_t daily_temperature_history_chart(char *report_buffer, uint32_t buffer_len); |
dvddnr | 7:2b389a2e83c4 | 76 | int32_t daily_pressure_history_chart(char *report_buffer, uint32_t buffer_len); |
dvddnr | 7:2b389a2e83c4 | 77 | |
dvddnr | 7:2b389a2e83c4 | 78 | |
dvddnr | 0:1fc46da4a976 | 79 | int main() |
dvddnr | 0:1fc46da4a976 | 80 | { |
dvddnr | 1:60fbd0835b9d | 81 | |
dvddnr | 9:d24842a5a468 | 82 | printf("> DISCO_L475VG_IOT01-Telegram-BOT started\r\n"); |
dvddnr | 8:89fe332bc412 | 83 | |
dvddnr | 9:d24842a5a468 | 84 | #if WITH_ARDUCAM_2640 |
dvddnr | 8:89fe332bc412 | 85 | /* Setup camera */ |
dvddnr | 8:89fe332bc412 | 86 | I2C camI2C(PB_9,PB_8); |
dvddnr | 8:89fe332bc412 | 87 | SPI camSPI(PA_7,PA_6,PA_5); |
dvddnr | 8:89fe332bc412 | 88 | DigitalOut cam_spi_cs(PA_2); |
dvddnr | 0:1fc46da4a976 | 89 | |
dvddnr | 8:89fe332bc412 | 90 | if( g_arducam.Setup( OV_RESOLUTION_CIF,92, &cam_spi_cs, &camSPI, &camI2C) == false) |
dvddnr | 8:89fe332bc412 | 91 | { |
dvddnr | 8:89fe332bc412 | 92 | printf("Arducam setup error \r\n"); |
dvddnr | 8:89fe332bc412 | 93 | while(1); |
dvddnr | 8:89fe332bc412 | 94 | } |
dvddnr | 9:d24842a5a468 | 95 | #endif |
dvddnr | 8:89fe332bc412 | 96 | |
dvddnr | 1:60fbd0835b9d | 97 | /* Setup env sensors */ |
dvddnr | 0:1fc46da4a976 | 98 | BSP_TSENSOR_Init(); |
dvddnr | 0:1fc46da4a976 | 99 | BSP_HSENSOR_Init(); |
dvddnr | 0:1fc46da4a976 | 100 | BSP_PSENSOR_Init(); |
dvddnr | 1:60fbd0835b9d | 101 | |
dvddnr | 0:1fc46da4a976 | 102 | |
dvddnr | 1:60fbd0835b9d | 103 | /* start chatbot */ |
dvddnr | 1:60fbd0835b9d | 104 | telegram_bot(); |
dvddnr | 1:60fbd0835b9d | 105 | } |
dvddnr | 0:1fc46da4a976 | 106 | |
dvddnr | 7:2b389a2e83c4 | 107 | |
dvddnr | 7:2b389a2e83c4 | 108 | |
dvddnr | 7:2b389a2e83c4 | 109 | |
dvddnr | 7:2b389a2e83c4 | 110 | |
dvddnr | 7:2b389a2e83c4 | 111 | |
dvddnr | 7:2b389a2e83c4 | 112 | |
dvddnr | 7:2b389a2e83c4 | 113 | |
dvddnr | 8:89fe332bc412 | 114 | void telegram_bot() |
dvddnr | 1:60fbd0835b9d | 115 | { |
dvddnr | 1:60fbd0835b9d | 116 | int32_t update_id = 0; |
dvddnr | 1:60fbd0835b9d | 117 | int32_t chat_id = 0; |
dvddnr | 1:60fbd0835b9d | 118 | int json_results; |
dvddnr | 1:60fbd0835b9d | 119 | bool well_done = false; |
dvddnr | 7:2b389a2e83c4 | 120 | time_t timestamp; |
dvddnr | 7:2b389a2e83c4 | 121 | struct tm *timestamp_tm; |
dvddnr | 7:2b389a2e83c4 | 122 | float temp,pres,humi; |
dvddnr | 7:2b389a2e83c4 | 123 | |
dvddnr | 0:1fc46da4a976 | 124 | |
dvddnr | 5:f204a47aa813 | 125 | /* wifi connect */ |
dvddnr | 8:89fe332bc412 | 126 | if(g_tcp_connector.wifi_connect(WIFI_SSID,WIFI_PASSWORD,CONNECTION_TRIAL_MAX)) |
dvddnr | 5:f204a47aa813 | 127 | { |
dvddnr | 4:9926288a8703 | 128 | printf("> Wifi connected\r\n"); |
dvddnr | 5:f204a47aa813 | 129 | } |
dvddnr | 4:9926288a8703 | 130 | else |
dvddnr | 4:9926288a8703 | 131 | { |
dvddnr | 4:9926288a8703 | 132 | NVIC_SystemReset(); |
dvddnr | 4:9926288a8703 | 133 | } |
dvddnr | 0:1fc46da4a976 | 134 | |
dvddnr | 5:f204a47aa813 | 135 | |
dvddnr | 5:f204a47aa813 | 136 | /* set RTC */ |
dvddnr | 5:f204a47aa813 | 137 | set_rtc_from_network(); |
dvddnr | 7:2b389a2e83c4 | 138 | |
dvddnr | 7:2b389a2e83c4 | 139 | /* init data history */ |
dvddnr | 7:2b389a2e83c4 | 140 | for(int i=0; i<24; i++) |
dvddnr | 7:2b389a2e83c4 | 141 | { |
dvddnr | 7:2b389a2e83c4 | 142 | for(int ii=0; ii<60; ii++) |
dvddnr | 7:2b389a2e83c4 | 143 | { |
dvddnr | 7:2b389a2e83c4 | 144 | g_daily_data_history_temp[i][ii]=0.0F; |
dvddnr | 7:2b389a2e83c4 | 145 | g_daily_data_history_pres[i][ii]=0.0F; |
dvddnr | 7:2b389a2e83c4 | 146 | g_daily_data_history_humi[i][ii]=0.0F; |
dvddnr | 7:2b389a2e83c4 | 147 | } |
dvddnr | 7:2b389a2e83c4 | 148 | } |
dvddnr | 7:2b389a2e83c4 | 149 | |
dvddnr | 5:f204a47aa813 | 150 | |
dvddnr | 5:f204a47aa813 | 151 | /* main loop */ |
dvddnr | 1:60fbd0835b9d | 152 | while (1) |
dvddnr | 1:60fbd0835b9d | 153 | { |
dvddnr | 4:9926288a8703 | 154 | g_alivenessLED = !g_alivenessLED; |
dvddnr | 4:9926288a8703 | 155 | |
dvddnr | 7:2b389a2e83c4 | 156 | /* history update */ |
dvddnr | 7:2b389a2e83c4 | 157 | timestamp = time(NULL); |
dvddnr | 7:2b389a2e83c4 | 158 | timestamp_tm = localtime(×tamp); |
dvddnr | 7:2b389a2e83c4 | 159 | temp = BSP_TSENSOR_ReadTemp(); |
dvddnr | 7:2b389a2e83c4 | 160 | pres = BSP_PSENSOR_ReadPressure(); |
dvddnr | 7:2b389a2e83c4 | 161 | humi = BSP_HSENSOR_ReadHumidity(); |
dvddnr | 7:2b389a2e83c4 | 162 | daily_history_update( timestamp_tm->tm_hour, timestamp_tm->tm_min, temp, pres, humi ); |
dvddnr | 7:2b389a2e83c4 | 163 | |
dvddnr | 7:2b389a2e83c4 | 164 | |
dvddnr | 1:60fbd0835b9d | 165 | // Get updates -- API method getUpdates |
dvddnr | 1:60fbd0835b9d | 166 | printf("> Get updates\r\n"); |
dvddnr | 1:60fbd0835b9d | 167 | g_json_io_buffer[0]=0; |
dvddnr | 1:60fbd0835b9d | 168 | if (telegram_get_update(update_id + 1) == false) |
dvddnr | 1:60fbd0835b9d | 169 | { |
dvddnr | 4:9926288a8703 | 170 | printf("> ERROR telegram_get_update\r\n> Reset wifi connection\r\n"); |
dvddnr | 8:89fe332bc412 | 171 | |
dvddnr | 8:89fe332bc412 | 172 | g_tcp_connector.wifi_connect(WIFI_SSID,WIFI_PASSWORD,CONNECTION_TRIAL_MAX); |
dvddnr | 1:60fbd0835b9d | 173 | continue; |
dvddnr | 1:60fbd0835b9d | 174 | } |
dvddnr | 1:60fbd0835b9d | 175 | printf("> JSON content: %s\r\n", g_json_io_buffer); |
dvddnr | 1:60fbd0835b9d | 176 | |
dvddnr | 1:60fbd0835b9d | 177 | // Parsing json response |
dvddnr | 1:60fbd0835b9d | 178 | jsmn_init(&g_json_parser); |
dvddnr | 1:60fbd0835b9d | 179 | json_results = jsmn_parse(&g_json_parser,g_json_io_buffer,strlen(g_json_io_buffer),g_json_tokens,JSON_MAX_TOKENS); |
dvddnr | 1:60fbd0835b9d | 180 | if(json_results < 4) |
dvddnr | 1:60fbd0835b9d | 181 | { |
dvddnr | 1:60fbd0835b9d | 182 | printf("> ERROR invalid json response\r\n"); |
dvddnr | 1:60fbd0835b9d | 183 | continue; |
dvddnr | 1:60fbd0835b9d | 184 | } |
dvddnr | 0:1fc46da4a976 | 185 | |
dvddnr | 1:60fbd0835b9d | 186 | /* check ok */ |
dvddnr | 1:60fbd0835b9d | 187 | if( jsoneq(g_json_io_buffer,&g_json_tokens[1],"ok",JSMN_STRING) == false ) continue; |
dvddnr | 1:60fbd0835b9d | 188 | if( jsoneq(g_json_io_buffer,&g_json_tokens[2],"true",JSMN_PRIMITIVE) == false ) continue; |
dvddnr | 0:1fc46da4a976 | 189 | |
dvddnr | 1:60fbd0835b9d | 190 | /* fetch update id */ |
dvddnr | 1:60fbd0835b9d | 191 | well_done = false; |
dvddnr | 1:60fbd0835b9d | 192 | for(int i=3;i<json_results;i++) |
dvddnr | 1:60fbd0835b9d | 193 | { |
dvddnr | 1:60fbd0835b9d | 194 | if( jsoneq(g_json_io_buffer,&g_json_tokens[i],"update_id",JSMN_STRING) == true ) |
dvddnr | 1:60fbd0835b9d | 195 | { |
dvddnr | 1:60fbd0835b9d | 196 | g_json_io_buffer[g_json_tokens[i+1].end]=0; |
dvddnr | 1:60fbd0835b9d | 197 | update_id = atoi(g_json_io_buffer+g_json_tokens[i+1].start); |
dvddnr | 1:60fbd0835b9d | 198 | well_done = true; |
dvddnr | 1:60fbd0835b9d | 199 | } |
dvddnr | 1:60fbd0835b9d | 200 | } |
dvddnr | 0:1fc46da4a976 | 201 | |
dvddnr | 1:60fbd0835b9d | 202 | // update_id not found ? |
dvddnr | 1:60fbd0835b9d | 203 | if(well_done == false) continue; |
dvddnr | 0:1fc46da4a976 | 204 | |
dvddnr | 1:60fbd0835b9d | 205 | /* fetch chat id */ |
dvddnr | 1:60fbd0835b9d | 206 | well_done = false; |
dvddnr | 1:60fbd0835b9d | 207 | for(int i=3;i<json_results;i++) |
dvddnr | 1:60fbd0835b9d | 208 | { |
dvddnr | 1:60fbd0835b9d | 209 | if( jsoneq(g_json_io_buffer,&g_json_tokens[i],"id",JSMN_STRING) == true ) |
dvddnr | 1:60fbd0835b9d | 210 | { |
dvddnr | 1:60fbd0835b9d | 211 | g_json_io_buffer[g_json_tokens[i+1].end]=0; |
dvddnr | 1:60fbd0835b9d | 212 | chat_id = atoi(g_json_io_buffer+g_json_tokens[i+1].start); |
dvddnr | 1:60fbd0835b9d | 213 | well_done = true; |
dvddnr | 1:60fbd0835b9d | 214 | } |
dvddnr | 1:60fbd0835b9d | 215 | } |
dvddnr | 0:1fc46da4a976 | 216 | |
dvddnr | 1:60fbd0835b9d | 217 | // chat_id not found ? |
dvddnr | 1:60fbd0835b9d | 218 | if(well_done == false) continue; |
dvddnr | 0:1fc46da4a976 | 219 | |
dvddnr | 1:60fbd0835b9d | 220 | /*fetch message */ |
dvddnr | 1:60fbd0835b9d | 221 | well_done = false; |
dvddnr | 1:60fbd0835b9d | 222 | g_incoming_msg[0]=0; |
dvddnr | 1:60fbd0835b9d | 223 | for(int i=3;i<json_results;i++) |
dvddnr | 1:60fbd0835b9d | 224 | { |
dvddnr | 1:60fbd0835b9d | 225 | if( jsoneq(g_json_io_buffer,&g_json_tokens[i],"text",JSMN_STRING) == true ) |
dvddnr | 1:60fbd0835b9d | 226 | { |
dvddnr | 1:60fbd0835b9d | 227 | int msg_len = g_json_tokens[i+1].end - g_json_tokens[i+1].start; |
dvddnr | 1:60fbd0835b9d | 228 | if( msg_len < TELEGRAM_BOT_INCOMING_CMD_SIZE) |
dvddnr | 1:60fbd0835b9d | 229 | { |
dvddnr | 1:60fbd0835b9d | 230 | memcpy(g_incoming_msg,g_json_io_buffer+g_json_tokens[i+1].start,msg_len); |
dvddnr | 1:60fbd0835b9d | 231 | g_incoming_msg[msg_len] = 0; |
dvddnr | 1:60fbd0835b9d | 232 | well_done = true; |
dvddnr | 1:60fbd0835b9d | 233 | } |
dvddnr | 1:60fbd0835b9d | 234 | break; |
dvddnr | 1:60fbd0835b9d | 235 | } |
dvddnr | 1:60fbd0835b9d | 236 | } |
dvddnr | 1:60fbd0835b9d | 237 | |
dvddnr | 1:60fbd0835b9d | 238 | printf("> Incoming msg: %s\n\r",g_incoming_msg); |
dvddnr | 1:60fbd0835b9d | 239 | |
dvddnr | 1:60fbd0835b9d | 240 | // parse incoming message |
dvddnr | 1:60fbd0835b9d | 241 | if( strstr(g_incoming_msg,"Temperature") != NULL) |
dvddnr | 1:60fbd0835b9d | 242 | { |
dvddnr | 1:60fbd0835b9d | 243 | snprintf(g_json_io_buffer,TBOT_JSON_BUFFER_SIZE,"{\"chat_id\":%d,\"text\":\"Temperature %.2f degC\",\"reply_markup\":%s}", |
dvddnr | 7:2b389a2e83c4 | 244 | chat_id,temp,TELEGRAM_CUSTOM_KEYBOARD); |
dvddnr | 1:60fbd0835b9d | 245 | } |
dvddnr | 1:60fbd0835b9d | 246 | else if( strstr(g_incoming_msg,"Humidity") != NULL) |
dvddnr | 1:60fbd0835b9d | 247 | { |
dvddnr | 1:60fbd0835b9d | 248 | snprintf(g_json_io_buffer,TBOT_JSON_BUFFER_SIZE,"{\"chat_id\":%d,\"text\":\"Humidity %.2f %%\",\"reply_markup\":%s}", |
dvddnr | 7:2b389a2e83c4 | 249 | chat_id,humi,TELEGRAM_CUSTOM_KEYBOARD); |
dvddnr | 1:60fbd0835b9d | 250 | } |
dvddnr | 1:60fbd0835b9d | 251 | else if( strstr(g_incoming_msg,"Pressure") != NULL) |
dvddnr | 1:60fbd0835b9d | 252 | { |
dvddnr | 1:60fbd0835b9d | 253 | snprintf(g_json_io_buffer,TBOT_JSON_BUFFER_SIZE,"{\"chat_id\":%d,\"text\":\"Pressure %.2f mBar\",\"reply_markup\":%s}", |
dvddnr | 7:2b389a2e83c4 | 254 | chat_id,pres,TELEGRAM_CUSTOM_KEYBOARD); |
dvddnr | 1:60fbd0835b9d | 255 | } |
dvddnr | 6:94fc61e1cf40 | 256 | else if( strstr(g_incoming_msg,"RTC") != NULL) |
dvddnr | 6:94fc61e1cf40 | 257 | { |
dvddnr | 6:94fc61e1cf40 | 258 | snprintf(g_json_io_buffer,TBOT_JSON_BUFFER_SIZE,"{\"chat_id\":%d,\"text\":\"%s UTC\",\"reply_markup\":%s}", |
dvddnr | 7:2b389a2e83c4 | 259 | chat_id,ctime(×tamp),TELEGRAM_CUSTOM_KEYBOARD); |
dvddnr | 7:2b389a2e83c4 | 260 | } |
dvddnr | 8:89fe332bc412 | 261 | else if( strstr(g_incoming_msg,"Daily") != NULL ) |
dvddnr | 7:2b389a2e83c4 | 262 | { |
dvddnr | 7:2b389a2e83c4 | 263 | int pivot = snprintf(g_json_io_buffer,TBOT_JSON_BUFFER_SIZE,"{\"chat_id\":%d,\"text\":\"", chat_id); |
dvddnr | 7:2b389a2e83c4 | 264 | pivot += daily_temperature_history_chart( g_json_io_buffer + pivot, TBOT_JSON_BUFFER_SIZE - pivot ); |
dvddnr | 7:2b389a2e83c4 | 265 | snprintf( g_json_io_buffer + pivot, TBOT_JSON_BUFFER_SIZE - pivot, "\"}"); |
dvddnr | 8:89fe332bc412 | 266 | if( telegram_send_message(g_json_io_buffer) == false) |
dvddnr | 7:2b389a2e83c4 | 267 | { |
dvddnr | 7:2b389a2e83c4 | 268 | printf("> ERROR telegram_send_message\r\n"); |
dvddnr | 7:2b389a2e83c4 | 269 | continue; |
dvddnr | 7:2b389a2e83c4 | 270 | } |
dvddnr | 7:2b389a2e83c4 | 271 | |
dvddnr | 7:2b389a2e83c4 | 272 | pivot = snprintf(g_json_io_buffer,TBOT_JSON_BUFFER_SIZE,"{\"chat_id\":%d,\"text\":\"", chat_id); |
dvddnr | 7:2b389a2e83c4 | 273 | pivot += daily_humidity_history_chart( g_json_io_buffer + pivot, TBOT_JSON_BUFFER_SIZE - pivot ); |
dvddnr | 7:2b389a2e83c4 | 274 | snprintf( g_json_io_buffer + pivot, TBOT_JSON_BUFFER_SIZE - pivot, "\"}"); |
dvddnr | 8:89fe332bc412 | 275 | if( telegram_send_message(g_json_io_buffer) == false) |
dvddnr | 7:2b389a2e83c4 | 276 | { |
dvddnr | 7:2b389a2e83c4 | 277 | printf("> ERROR telegram_send_message\r\n"); |
dvddnr | 7:2b389a2e83c4 | 278 | continue; |
dvddnr | 7:2b389a2e83c4 | 279 | } |
dvddnr | 7:2b389a2e83c4 | 280 | |
dvddnr | 7:2b389a2e83c4 | 281 | pivot = snprintf(g_json_io_buffer,TBOT_JSON_BUFFER_SIZE,"{\"chat_id\":%d,\"text\":\"", chat_id); |
dvddnr | 7:2b389a2e83c4 | 282 | pivot += daily_pressure_history_chart( g_json_io_buffer + pivot, TBOT_JSON_BUFFER_SIZE - pivot ); |
dvddnr | 7:2b389a2e83c4 | 283 | snprintf( g_json_io_buffer + pivot, TBOT_JSON_BUFFER_SIZE - pivot, "\",\"reply_markup\":%s}",TELEGRAM_CUSTOM_KEYBOARD); |
dvddnr | 7:2b389a2e83c4 | 284 | |
dvddnr | 7:2b389a2e83c4 | 285 | |
dvddnr | 6:94fc61e1cf40 | 286 | } |
dvddnr | 9:d24842a5a468 | 287 | #if WITH_ARDUCAM_2640 |
dvddnr | 8:89fe332bc412 | 288 | else if( strstr(g_incoming_msg,"Camera") != NULL ) |
dvddnr | 8:89fe332bc412 | 289 | { |
dvddnr | 8:89fe332bc412 | 290 | uint32_t image_size; |
dvddnr | 8:89fe332bc412 | 291 | uint32_t idx; |
dvddnr | 8:89fe332bc412 | 292 | |
dvddnr | 8:89fe332bc412 | 293 | snprintf(g_json_io_buffer,TBOT_JSON_BUFFER_SIZE,"{\"chat_id\":%d,\"text\":\"Sending photos ...\",\"reply_markup\":%s}", |
dvddnr | 8:89fe332bc412 | 294 | chat_id,TELEGRAM_CUSTOM_KEYBOARD); |
dvddnr | 8:89fe332bc412 | 295 | if( telegram_send_message(g_json_io_buffer) == false) |
dvddnr | 8:89fe332bc412 | 296 | { |
dvddnr | 8:89fe332bc412 | 297 | printf("> ERROR telegram_send_message\r\n"); |
dvddnr | 8:89fe332bc412 | 298 | continue; |
dvddnr | 8:89fe332bc412 | 299 | } |
dvddnr | 8:89fe332bc412 | 300 | |
dvddnr | 8:89fe332bc412 | 301 | for(int i=0; i<3; i++) |
dvddnr | 8:89fe332bc412 | 302 | { |
dvddnr | 8:89fe332bc412 | 303 | image_size = g_arducam.CaptureImage(g_image_buffer,IMAGE_JPG_SIZE,&idx); |
dvddnr | 8:89fe332bc412 | 304 | if( image_size == 0 || telegram_send_photo(g_image_buffer+idx, image_size, chat_id, "Images from space") == false ) |
dvddnr | 8:89fe332bc412 | 305 | { |
dvddnr | 8:89fe332bc412 | 306 | printf("Photo failure %d\r\n",image_size); |
dvddnr | 8:89fe332bc412 | 307 | break; |
dvddnr | 8:89fe332bc412 | 308 | } |
dvddnr | 8:89fe332bc412 | 309 | } |
dvddnr | 8:89fe332bc412 | 310 | |
dvddnr | 8:89fe332bc412 | 311 | snprintf(g_json_io_buffer,TBOT_JSON_BUFFER_SIZE,"{\"chat_id\":%d,\"text\":\"Done.\",\"reply_markup\":%s}", |
dvddnr | 8:89fe332bc412 | 312 | chat_id,TELEGRAM_CUSTOM_KEYBOARD); |
dvddnr | 8:89fe332bc412 | 313 | } |
dvddnr | 9:d24842a5a468 | 314 | #endif |
dvddnr | 1:60fbd0835b9d | 315 | else |
dvddnr | 1:60fbd0835b9d | 316 | { |
dvddnr | 1:60fbd0835b9d | 317 | snprintf(g_json_io_buffer,TBOT_JSON_BUFFER_SIZE,"{\"chat_id\":%d,\"text\":\"Available commands\",\"reply_markup\":%s}", |
dvddnr | 1:60fbd0835b9d | 318 | chat_id,TELEGRAM_CUSTOM_KEYBOARD); |
dvddnr | 1:60fbd0835b9d | 319 | } |
dvddnr | 1:60fbd0835b9d | 320 | |
dvddnr | 8:89fe332bc412 | 321 | if( telegram_send_message(g_json_io_buffer) == false) |
dvddnr | 1:60fbd0835b9d | 322 | { |
dvddnr | 1:60fbd0835b9d | 323 | printf("> ERROR telegram_send_message\r\n"); |
dvddnr | 1:60fbd0835b9d | 324 | continue; |
dvddnr | 1:60fbd0835b9d | 325 | } |
dvddnr | 1:60fbd0835b9d | 326 | |
dvddnr | 1:60fbd0835b9d | 327 | jsmn_init(&g_json_parser); |
dvddnr | 1:60fbd0835b9d | 328 | json_results = jsmn_parse(&g_json_parser,g_json_io_buffer,strlen(g_json_io_buffer),g_json_tokens,JSON_MAX_TOKENS); |
dvddnr | 1:60fbd0835b9d | 329 | if(json_results < 4) |
dvddnr | 1:60fbd0835b9d | 330 | { |
dvddnr | 1:60fbd0835b9d | 331 | printf("> ERROR invalid json response\r\n"); |
dvddnr | 1:60fbd0835b9d | 332 | continue; |
dvddnr | 1:60fbd0835b9d | 333 | } |
dvddnr | 0:1fc46da4a976 | 334 | |
dvddnr | 1:60fbd0835b9d | 335 | /* check ok */ |
dvddnr | 1:60fbd0835b9d | 336 | if( jsoneq(g_json_io_buffer,&g_json_tokens[1],"ok",JSMN_STRING) == false ) continue; |
dvddnr | 1:60fbd0835b9d | 337 | if( jsoneq(g_json_io_buffer,&g_json_tokens[2],"true",JSMN_PRIMITIVE) == false ) continue; |
dvddnr | 0:1fc46da4a976 | 338 | |
dvddnr | 0:1fc46da4a976 | 339 | } |
dvddnr | 0:1fc46da4a976 | 340 | } |
dvddnr | 1:60fbd0835b9d | 341 | |
dvddnr | 7:2b389a2e83c4 | 342 | /***************************************************************************************** |
dvddnr | 7:2b389a2e83c4 | 343 | * |
dvddnr | 7:2b389a2e83c4 | 344 | * |
dvddnr | 7:2b389a2e83c4 | 345 | * Daily history update |
dvddnr | 7:2b389a2e83c4 | 346 | * |
dvddnr | 7:2b389a2e83c4 | 347 | * |
dvddnr | 7:2b389a2e83c4 | 348 | ******************************************************************************************/ |
dvddnr | 7:2b389a2e83c4 | 349 | void daily_history_update( int hour, int min, float t, float p, float h ) |
dvddnr | 7:2b389a2e83c4 | 350 | { |
dvddnr | 7:2b389a2e83c4 | 351 | g_daily_data_history_temp[hour][min] = t; |
dvddnr | 7:2b389a2e83c4 | 352 | g_daily_data_history_pres[hour][min] = p; |
dvddnr | 7:2b389a2e83c4 | 353 | g_daily_data_history_humi[hour][min] = h; |
dvddnr | 7:2b389a2e83c4 | 354 | } |
dvddnr | 1:60fbd0835b9d | 355 | |
dvddnr | 1:60fbd0835b9d | 356 | |
dvddnr | 7:2b389a2e83c4 | 357 | int32_t daily_temperature_history_chart(char *report_buffer, uint32_t buffer_len) |
dvddnr | 7:2b389a2e83c4 | 358 | { |
dvddnr | 7:2b389a2e83c4 | 359 | float sum; |
dvddnr | 7:2b389a2e83c4 | 360 | uint32_t num; |
dvddnr | 7:2b389a2e83c4 | 361 | int32_t pivot = 0; |
dvddnr | 7:2b389a2e83c4 | 362 | |
dvddnr | 7:2b389a2e83c4 | 363 | // temperature chart |
dvddnr | 7:2b389a2e83c4 | 364 | pivot = snprintf(report_buffer,buffer_len,"Daily temperature chart\n\nhttps://image-charts.com/chart?chxt=x,y&chxr=1,0,%d&cht=lc&chd=t:",50); |
dvddnr | 7:2b389a2e83c4 | 365 | for(int i=0;i<24;i++) |
dvddnr | 7:2b389a2e83c4 | 366 | { |
dvddnr | 7:2b389a2e83c4 | 367 | sum = 0.0F; |
dvddnr | 7:2b389a2e83c4 | 368 | num = 0; |
dvddnr | 7:2b389a2e83c4 | 369 | for(int ii=0;ii<60;ii++) |
dvddnr | 7:2b389a2e83c4 | 370 | { |
dvddnr | 7:2b389a2e83c4 | 371 | if(g_daily_data_history_temp[i][ii] > 0.0F) |
dvddnr | 7:2b389a2e83c4 | 372 | { |
dvddnr | 7:2b389a2e83c4 | 373 | num++; |
dvddnr | 7:2b389a2e83c4 | 374 | sum += g_daily_data_history_temp[i][ii]; |
dvddnr | 7:2b389a2e83c4 | 375 | } |
dvddnr | 7:2b389a2e83c4 | 376 | } |
dvddnr | 7:2b389a2e83c4 | 377 | pivot += snprintf(report_buffer+pivot,buffer_len-pivot,"%d,",(num>0)?(int32_t)sum/num:0); |
dvddnr | 7:2b389a2e83c4 | 378 | } |
dvddnr | 7:2b389a2e83c4 | 379 | pivot--; |
dvddnr | 7:2b389a2e83c4 | 380 | pivot += snprintf(report_buffer+pivot,buffer_len-pivot,"%s","&chco=76A4FB&chls=2.0&chs=600x300&chg=10,10"); |
dvddnr | 7:2b389a2e83c4 | 381 | |
dvddnr | 7:2b389a2e83c4 | 382 | report_buffer[pivot]=0; |
dvddnr | 7:2b389a2e83c4 | 383 | return pivot; |
dvddnr | 7:2b389a2e83c4 | 384 | } |
dvddnr | 7:2b389a2e83c4 | 385 | |
dvddnr | 7:2b389a2e83c4 | 386 | int32_t daily_humidity_history_chart(char *report_buffer, uint32_t buffer_len) |
dvddnr | 7:2b389a2e83c4 | 387 | { |
dvddnr | 7:2b389a2e83c4 | 388 | float sum; |
dvddnr | 7:2b389a2e83c4 | 389 | uint32_t num; |
dvddnr | 7:2b389a2e83c4 | 390 | int32_t pivot = 0; |
dvddnr | 7:2b389a2e83c4 | 391 | |
dvddnr | 7:2b389a2e83c4 | 392 | // humidity chart |
dvddnr | 7:2b389a2e83c4 | 393 | pivot += snprintf(report_buffer+pivot,buffer_len-pivot,"Daily humidity chart\n\nhttps://image-charts.com/chart?chxt=x,y&chxr=1,0,%d&cht=lc&chd=t:",100); |
dvddnr | 7:2b389a2e83c4 | 394 | for(int i=0;i<24;i++) |
dvddnr | 7:2b389a2e83c4 | 395 | { |
dvddnr | 7:2b389a2e83c4 | 396 | sum = 0.0F; |
dvddnr | 7:2b389a2e83c4 | 397 | num = 0; |
dvddnr | 7:2b389a2e83c4 | 398 | for(int ii=0;ii<60;ii++) |
dvddnr | 7:2b389a2e83c4 | 399 | { |
dvddnr | 7:2b389a2e83c4 | 400 | if(g_daily_data_history_humi[i][ii] > 0.0F) |
dvddnr | 7:2b389a2e83c4 | 401 | { |
dvddnr | 7:2b389a2e83c4 | 402 | num++; |
dvddnr | 7:2b389a2e83c4 | 403 | sum += g_daily_data_history_humi[i][ii]; |
dvddnr | 7:2b389a2e83c4 | 404 | } |
dvddnr | 7:2b389a2e83c4 | 405 | } |
dvddnr | 7:2b389a2e83c4 | 406 | pivot += snprintf(report_buffer+pivot,buffer_len-pivot,"%d,",(num>0)?(int32_t)sum/num:0); |
dvddnr | 7:2b389a2e83c4 | 407 | } |
dvddnr | 7:2b389a2e83c4 | 408 | pivot--; |
dvddnr | 7:2b389a2e83c4 | 409 | pivot += snprintf(report_buffer+pivot,buffer_len-pivot,"%s","&chco=76A4FB&chls=2.0&chs=600x300&chg=10,10\n\n"); |
dvddnr | 7:2b389a2e83c4 | 410 | |
dvddnr | 7:2b389a2e83c4 | 411 | report_buffer[pivot]=0; |
dvddnr | 7:2b389a2e83c4 | 412 | return pivot; |
dvddnr | 7:2b389a2e83c4 | 413 | } |
dvddnr | 7:2b389a2e83c4 | 414 | |
dvddnr | 7:2b389a2e83c4 | 415 | |
dvddnr | 7:2b389a2e83c4 | 416 | int32_t daily_pressure_history_chart(char *report_buffer, uint32_t buffer_len) |
dvddnr | 7:2b389a2e83c4 | 417 | { |
dvddnr | 7:2b389a2e83c4 | 418 | float sum; |
dvddnr | 7:2b389a2e83c4 | 419 | uint32_t num; |
dvddnr | 7:2b389a2e83c4 | 420 | int32_t pivot = 0; |
dvddnr | 7:2b389a2e83c4 | 421 | |
dvddnr | 7:2b389a2e83c4 | 422 | // pressure chart |
dvddnr | 7:2b389a2e83c4 | 423 | pivot += snprintf(report_buffer+pivot,buffer_len-pivot,"Daily pressure chart\n\nhttps://image-charts.com/chart?chxt=x,y&chxr=1,%d,%d&cht=lc&chd=t:",900,1100); |
dvddnr | 7:2b389a2e83c4 | 424 | for(int i=0;i<24;i++) |
dvddnr | 7:2b389a2e83c4 | 425 | { |
dvddnr | 7:2b389a2e83c4 | 426 | sum = 0.0F; |
dvddnr | 7:2b389a2e83c4 | 427 | num = 0; |
dvddnr | 7:2b389a2e83c4 | 428 | for(int ii=0;ii<60;ii++) |
dvddnr | 7:2b389a2e83c4 | 429 | { |
dvddnr | 7:2b389a2e83c4 | 430 | if(g_daily_data_history_pres[i][ii] > 0.0F) |
dvddnr | 7:2b389a2e83c4 | 431 | { |
dvddnr | 7:2b389a2e83c4 | 432 | num++; |
dvddnr | 7:2b389a2e83c4 | 433 | sum += g_daily_data_history_pres[i][ii]; |
dvddnr | 7:2b389a2e83c4 | 434 | } |
dvddnr | 7:2b389a2e83c4 | 435 | } |
dvddnr | 7:2b389a2e83c4 | 436 | pivot += snprintf(report_buffer+pivot,buffer_len-pivot,"%d,",(num>0)?(int32_t)sum/num:0); |
dvddnr | 7:2b389a2e83c4 | 437 | } |
dvddnr | 7:2b389a2e83c4 | 438 | pivot--; |
dvddnr | 7:2b389a2e83c4 | 439 | pivot += snprintf(report_buffer+pivot,buffer_len-pivot,"%s","&chco=76A4FB&chls=2.0&chs=600x300&chg=10,10&chds=a"); |
dvddnr | 7:2b389a2e83c4 | 440 | |
dvddnr | 7:2b389a2e83c4 | 441 | report_buffer[pivot]=0; |
dvddnr | 7:2b389a2e83c4 | 442 | return pivot; |
dvddnr | 7:2b389a2e83c4 | 443 | } |
dvddnr | 7:2b389a2e83c4 | 444 | |
dvddnr | 5:f204a47aa813 | 445 | /***************************************************************************************** |
dvddnr | 5:f204a47aa813 | 446 | * |
dvddnr | 5:f204a47aa813 | 447 | * |
dvddnr | 5:f204a47aa813 | 448 | * update RTC using now.httpbin.org free service |
dvddnr | 5:f204a47aa813 | 449 | * |
dvddnr | 5:f204a47aa813 | 450 | * |
dvddnr | 5:f204a47aa813 | 451 | * ***************************************************************************************/ |
dvddnr | 5:f204a47aa813 | 452 | |
dvddnr | 5:f204a47aa813 | 453 | #define HTTPBIN_EPOCH_TAG "epoch\":" |
dvddnr | 5:f204a47aa813 | 454 | bool set_rtc_from_network(void) |
dvddnr | 5:f204a47aa813 | 455 | { |
dvddnr | 8:89fe332bc412 | 456 | uint32_t http_content_len=0; |
dvddnr | 8:89fe332bc412 | 457 | bool http_ok = false; |
dvddnr | 8:89fe332bc412 | 458 | |
dvddnr | 5:f204a47aa813 | 459 | /* prepare http get header */ |
dvddnr | 5:f204a47aa813 | 460 | strcpy(g_http_io_buffer,NOW_HTTPBIN_ORG); |
dvddnr | 8:89fe332bc412 | 461 | |
dvddnr | 8:89fe332bc412 | 462 | |
dvddnr | 8:89fe332bc412 | 463 | // CONNECT http://now.httpbin.org |
dvddnr | 8:89fe332bc412 | 464 | if( g_tcp_connector.tcp_connect(0x01,"now.httpbin.org",80,false,3) ) |
dvddnr | 8:89fe332bc412 | 465 | { |
dvddnr | 8:89fe332bc412 | 466 | // send HTML GET |
dvddnr | 8:89fe332bc412 | 467 | if( g_tcp_connector.tcp_write(0x01,g_http_io_buffer,strlen(g_http_io_buffer))) |
dvddnr | 8:89fe332bc412 | 468 | { |
dvddnr | 8:89fe332bc412 | 469 | // read json response |
dvddnr | 8:89fe332bc412 | 470 | if( g_http_parser.HttpParseResponse(&g_tcp_connector,0x01,g_json_io_buffer,TBOT_JSON_BUFFER_SIZE,&http_ok,&http_content_len) ) |
dvddnr | 8:89fe332bc412 | 471 | { |
dvddnr | 8:89fe332bc412 | 472 | if(http_ok) |
dvddnr | 8:89fe332bc412 | 473 | { |
dvddnr | 8:89fe332bc412 | 474 | g_json_io_buffer[http_content_len] = 0; |
dvddnr | 8:89fe332bc412 | 475 | } |
dvddnr | 8:89fe332bc412 | 476 | } |
dvddnr | 8:89fe332bc412 | 477 | } |
dvddnr | 8:89fe332bc412 | 478 | } |
dvddnr | 8:89fe332bc412 | 479 | g_tcp_connector.tcp_close(0x01); |
dvddnr | 8:89fe332bc412 | 480 | |
dvddnr | 8:89fe332bc412 | 481 | // parse and set time |
dvddnr | 8:89fe332bc412 | 482 | if( http_ok ) |
dvddnr | 5:f204a47aa813 | 483 | { |
dvddnr | 5:f204a47aa813 | 484 | char *epoch = strstr(g_json_io_buffer,HTTPBIN_EPOCH_TAG); |
dvddnr | 5:f204a47aa813 | 485 | if(epoch == NULL) return false; |
dvddnr | 5:f204a47aa813 | 486 | epoch += sizeof( HTTPBIN_EPOCH_TAG ); |
dvddnr | 5:f204a47aa813 | 487 | for(int i=0;i<20;i++) |
dvddnr | 5:f204a47aa813 | 488 | { |
dvddnr | 5:f204a47aa813 | 489 | if( epoch[i] == '.') |
dvddnr | 5:f204a47aa813 | 490 | { |
dvddnr | 5:f204a47aa813 | 491 | epoch[i] = 0; |
dvddnr | 5:f204a47aa813 | 492 | printf("> now.httpbin.org epoch: %s\r\n",epoch); |
dvddnr | 5:f204a47aa813 | 493 | set_time( atoi(epoch) ); |
dvddnr | 5:f204a47aa813 | 494 | return true; |
dvddnr | 5:f204a47aa813 | 495 | } |
dvddnr | 5:f204a47aa813 | 496 | } |
dvddnr | 5:f204a47aa813 | 497 | } |
dvddnr | 5:f204a47aa813 | 498 | |
dvddnr | 5:f204a47aa813 | 499 | return false; |
dvddnr | 5:f204a47aa813 | 500 | |
dvddnr | 5:f204a47aa813 | 501 | } |
dvddnr | 1:60fbd0835b9d | 502 | |
dvddnr | 1:60fbd0835b9d | 503 | /***************************************************************************************** |
dvddnr | 1:60fbd0835b9d | 504 | * |
dvddnr | 1:60fbd0835b9d | 505 | * |
dvddnr | 1:60fbd0835b9d | 506 | * telegram rest api |
dvddnr | 1:60fbd0835b9d | 507 | * |
dvddnr | 1:60fbd0835b9d | 508 | * |
dvddnr | 1:60fbd0835b9d | 509 | ******************************************************************************************/ |
dvddnr | 1:60fbd0835b9d | 510 | |
dvddnr | 1:60fbd0835b9d | 511 | bool telegram_get_update(int32_t update_id) |
dvddnr | 1:60fbd0835b9d | 512 | { |
dvddnr | 8:89fe332bc412 | 513 | uint32_t http_content_len=0; |
dvddnr | 8:89fe332bc412 | 514 | bool http_ok = false; |
dvddnr | 8:89fe332bc412 | 515 | |
dvddnr | 1:60fbd0835b9d | 516 | /* prepare http get header */ |
dvddnr | 1:60fbd0835b9d | 517 | snprintf(g_http_io_buffer, ES_WIFI_PAYLOAD_SIZE, TELEGRAM_GETUPDATES, update_id); |
dvddnr | 8:89fe332bc412 | 518 | |
dvddnr | 8:89fe332bc412 | 519 | |
dvddnr | 8:89fe332bc412 | 520 | // CONNECT https://api.telegram.org |
dvddnr | 8:89fe332bc412 | 521 | if( g_tcp_connector.tcp_connect(0x01,"api.telegram.org",443,true,3) ) |
dvddnr | 8:89fe332bc412 | 522 | { |
dvddnr | 8:89fe332bc412 | 523 | // send HTML GET getUpdates |
dvddnr | 8:89fe332bc412 | 524 | if( g_tcp_connector.tcp_write(0x01,g_http_io_buffer,strlen(g_http_io_buffer))) |
dvddnr | 8:89fe332bc412 | 525 | { |
dvddnr | 8:89fe332bc412 | 526 | // read json response |
dvddnr | 8:89fe332bc412 | 527 | if( g_http_parser.HttpParseResponse(&g_tcp_connector,0x01,g_json_io_buffer,TBOT_JSON_BUFFER_SIZE,&http_ok,&http_content_len) ) |
dvddnr | 8:89fe332bc412 | 528 | { |
dvddnr | 8:89fe332bc412 | 529 | if(http_ok) |
dvddnr | 8:89fe332bc412 | 530 | { |
dvddnr | 8:89fe332bc412 | 531 | g_json_io_buffer[http_content_len] = 0; |
dvddnr | 8:89fe332bc412 | 532 | } |
dvddnr | 8:89fe332bc412 | 533 | } |
dvddnr | 8:89fe332bc412 | 534 | } |
dvddnr | 8:89fe332bc412 | 535 | g_tcp_connector.tcp_close(0x01); |
dvddnr | 8:89fe332bc412 | 536 | } |
dvddnr | 8:89fe332bc412 | 537 | |
dvddnr | 8:89fe332bc412 | 538 | return http_ok; |
dvddnr | 1:60fbd0835b9d | 539 | } |
dvddnr | 1:60fbd0835b9d | 540 | |
dvddnr | 1:60fbd0835b9d | 541 | |
dvddnr | 1:60fbd0835b9d | 542 | |
dvddnr | 8:89fe332bc412 | 543 | bool telegram_send_message(char *json_msg) |
dvddnr | 1:60fbd0835b9d | 544 | { |
dvddnr | 8:89fe332bc412 | 545 | uint32_t http_content_len=0,msg_len; |
dvddnr | 8:89fe332bc412 | 546 | bool http_ok = false; |
dvddnr | 8:89fe332bc412 | 547 | |
dvddnr | 8:89fe332bc412 | 548 | msg_len = strlen(json_msg); |
dvddnr | 1:60fbd0835b9d | 549 | |
dvddnr | 8:89fe332bc412 | 550 | /* prepare http get header */ |
dvddnr | 8:89fe332bc412 | 551 | snprintf(g_http_io_buffer, ES_WIFI_PAYLOAD_SIZE, TELEGRAM_SENDMESSAGE, msg_len); |
dvddnr | 1:60fbd0835b9d | 552 | |
dvddnr | 8:89fe332bc412 | 553 | // CONNECT https://api.telegram.org |
dvddnr | 8:89fe332bc412 | 554 | if( g_tcp_connector.tcp_connect(0x01,"api.telegram.org",443,true,3) ) |
dvddnr | 1:60fbd0835b9d | 555 | { |
dvddnr | 8:89fe332bc412 | 556 | // send HTML GET sendMessage |
dvddnr | 8:89fe332bc412 | 557 | if( g_tcp_connector.tcp_write(0x01,g_http_io_buffer,strlen(g_http_io_buffer))) |
dvddnr | 8:89fe332bc412 | 558 | { |
dvddnr | 8:89fe332bc412 | 559 | // send payload |
dvddnr | 8:89fe332bc412 | 560 | if( g_tcp_connector.tcp_write(0x01,json_msg,msg_len) ) |
dvddnr | 8:89fe332bc412 | 561 | { |
dvddnr | 8:89fe332bc412 | 562 | // read json response |
dvddnr | 8:89fe332bc412 | 563 | if( g_http_parser.HttpParseResponse(&g_tcp_connector,1,g_json_io_buffer,TBOT_JSON_BUFFER_SIZE,&http_ok,&http_content_len) ) |
dvddnr | 8:89fe332bc412 | 564 | { |
dvddnr | 8:89fe332bc412 | 565 | if(http_ok) |
dvddnr | 8:89fe332bc412 | 566 | { |
dvddnr | 8:89fe332bc412 | 567 | g_json_io_buffer[http_content_len] = 0; |
dvddnr | 8:89fe332bc412 | 568 | } |
dvddnr | 8:89fe332bc412 | 569 | } |
dvddnr | 8:89fe332bc412 | 570 | } |
dvddnr | 8:89fe332bc412 | 571 | } |
dvddnr | 8:89fe332bc412 | 572 | g_tcp_connector.tcp_close(0x01); |
dvddnr | 1:60fbd0835b9d | 573 | } |
dvddnr | 1:60fbd0835b9d | 574 | |
dvddnr | 8:89fe332bc412 | 575 | return http_ok; |
dvddnr | 1:60fbd0835b9d | 576 | } |
dvddnr | 1:60fbd0835b9d | 577 | |
dvddnr | 1:60fbd0835b9d | 578 | |
dvddnr | 8:89fe332bc412 | 579 | bool telegram_send_photo(uint8_t *image, uint32_t image_size, int32_t chat_id, char *caption) |
dvddnr | 8:89fe332bc412 | 580 | { |
dvddnr | 8:89fe332bc412 | 581 | char chat_id_str[32]; |
dvddnr | 8:89fe332bc412 | 582 | uint32_t content_len = 0; |
dvddnr | 8:89fe332bc412 | 583 | uint32_t http_content_len=0; |
dvddnr | 8:89fe332bc412 | 584 | bool http_ok = false; |
dvddnr | 1:60fbd0835b9d | 585 | |
dvddnr | 8:89fe332bc412 | 586 | content_len = 383; // pre-calculated boundary len |
dvddnr | 8:89fe332bc412 | 587 | content_len += snprintf(chat_id_str,sizeof(chat_id_str),"%d",chat_id); |
dvddnr | 8:89fe332bc412 | 588 | content_len += strlen(caption); |
dvddnr | 8:89fe332bc412 | 589 | content_len += image_size; |
dvddnr | 8:89fe332bc412 | 590 | |
dvddnr | 8:89fe332bc412 | 591 | /* prepare http post header */ |
dvddnr | 8:89fe332bc412 | 592 | snprintf(g_http_io_buffer, ES_WIFI_PAYLOAD_SIZE, TELEGRAM_SENDPHOTO, content_len); |
dvddnr | 8:89fe332bc412 | 593 | |
dvddnr | 8:89fe332bc412 | 594 | // CONNECT https://api.telegram.org |
dvddnr | 8:89fe332bc412 | 595 | if( g_tcp_connector.tcp_connect(0x01,"api.telegram.org",443,true,3) ) |
dvddnr | 8:89fe332bc412 | 596 | { |
dvddnr | 8:89fe332bc412 | 597 | // send HTML POST sendMessage |
dvddnr | 8:89fe332bc412 | 598 | if( g_tcp_connector.tcp_write(0x01,g_http_io_buffer,strlen(g_http_io_buffer))) |
dvddnr | 8:89fe332bc412 | 599 | { |
dvddnr | 8:89fe332bc412 | 600 | strcpy(g_http_io_buffer,"Content-Type: multipart/form-data; boundary=------------------------660d8ea934533f2b\r\n"); |
dvddnr | 8:89fe332bc412 | 601 | if( g_tcp_connector.tcp_write(0x01,g_http_io_buffer,strlen(g_http_io_buffer))) |
dvddnr | 8:89fe332bc412 | 602 | { |
dvddnr | 8:89fe332bc412 | 603 | snprintf(g_http_io_buffer, ES_WIFI_PAYLOAD_SIZE, "\r\n--------------------------660d8ea934533f2b\r\nContent-Disposition: form-data; name=\"chat_id\"\r\n\r\n%s", chat_id_str); |
dvddnr | 8:89fe332bc412 | 604 | if( g_tcp_connector.tcp_write(0x01,g_http_io_buffer,strlen(g_http_io_buffer))) |
dvddnr | 8:89fe332bc412 | 605 | { |
dvddnr | 8:89fe332bc412 | 606 | snprintf(g_http_io_buffer, ES_WIFI_PAYLOAD_SIZE, "\r\n--------------------------660d8ea934533f2b\r\nContent-Disposition: form-data; name=\"caption\"\r\n\r\n%s", caption); |
dvddnr | 8:89fe332bc412 | 607 | if( g_tcp_connector.tcp_write(0x01,g_http_io_buffer,strlen(g_http_io_buffer))) |
dvddnr | 8:89fe332bc412 | 608 | { |
dvddnr | 8:89fe332bc412 | 609 | strcpy(g_http_io_buffer, "\r\n--------------------------660d8ea934533f2b\r\nContent-Disposition: form-data; name=\"photo\"; filename=\"acam2640.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n"); |
dvddnr | 8:89fe332bc412 | 610 | if( g_tcp_connector.tcp_write(0x01,g_http_io_buffer,strlen(g_http_io_buffer))) |
dvddnr | 8:89fe332bc412 | 611 | { |
dvddnr | 8:89fe332bc412 | 612 | if( g_tcp_connector.tcp_write(0x01,(char*)image,image_size)) |
dvddnr | 8:89fe332bc412 | 613 | { |
dvddnr | 8:89fe332bc412 | 614 | strcpy(g_http_io_buffer,"\r\n--------------------------660d8ea934533f2b--\r\n"); |
dvddnr | 8:89fe332bc412 | 615 | if( g_tcp_connector.tcp_write(0x01,g_http_io_buffer,strlen(g_http_io_buffer)) ) |
dvddnr | 8:89fe332bc412 | 616 | { |
dvddnr | 8:89fe332bc412 | 617 | // read json response |
dvddnr | 8:89fe332bc412 | 618 | if( g_http_parser.HttpParseResponse(&g_tcp_connector,0x01,g_json_io_buffer,TBOT_JSON_BUFFER_SIZE,&http_ok,&http_content_len) ) |
dvddnr | 8:89fe332bc412 | 619 | { |
dvddnr | 8:89fe332bc412 | 620 | if(http_ok) |
dvddnr | 8:89fe332bc412 | 621 | { |
dvddnr | 8:89fe332bc412 | 622 | g_json_io_buffer[http_content_len] = 0; |
dvddnr | 8:89fe332bc412 | 623 | } |
dvddnr | 8:89fe332bc412 | 624 | } |
dvddnr | 8:89fe332bc412 | 625 | } |
dvddnr | 8:89fe332bc412 | 626 | } |
dvddnr | 8:89fe332bc412 | 627 | } |
dvddnr | 8:89fe332bc412 | 628 | } |
dvddnr | 8:89fe332bc412 | 629 | } |
dvddnr | 8:89fe332bc412 | 630 | } |
dvddnr | 8:89fe332bc412 | 631 | } |
dvddnr | 8:89fe332bc412 | 632 | g_tcp_connector.tcp_close(0x01); |
dvddnr | 8:89fe332bc412 | 633 | } |
dvddnr | 8:89fe332bc412 | 634 | |
dvddnr | 8:89fe332bc412 | 635 | return http_ok; |
dvddnr | 8:89fe332bc412 | 636 | } |
dvddnr | 1:60fbd0835b9d | 637 | |
dvddnr | 1:60fbd0835b9d | 638 | /***************************************************************************************** |
dvddnr | 1:60fbd0835b9d | 639 | * |
dvddnr | 1:60fbd0835b9d | 640 | * |
dvddnr | 1:60fbd0835b9d | 641 | * JSON parsing |
dvddnr | 1:60fbd0835b9d | 642 | * |
dvddnr | 1:60fbd0835b9d | 643 | * |
dvddnr | 1:60fbd0835b9d | 644 | ******************************************************************************************/ |
dvddnr | 1:60fbd0835b9d | 645 | |
dvddnr | 1:60fbd0835b9d | 646 | bool jsoneq(const char *json, jsmntok_t *tok, const char *s,jsmntype_t type) |
dvddnr | 1:60fbd0835b9d | 647 | { |
dvddnr | 1:60fbd0835b9d | 648 | if (tok->type == type && (int) strlen(s) == tok->end - tok->start && |
dvddnr | 1:60fbd0835b9d | 649 | strncmp(json + tok->start, s, tok->end - tok->start) == 0) { |
dvddnr | 1:60fbd0835b9d | 650 | return true; |
dvddnr | 1:60fbd0835b9d | 651 | } |
dvddnr | 1:60fbd0835b9d | 652 | return false; |
dvddnr | 1:60fbd0835b9d | 653 | } |
dvddnr | 1:60fbd0835b9d | 654 | |
dvddnr | 1:60fbd0835b9d | 655 |