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:
9:d24842a5a468
WITH_ARDUCAM_2640 default value to 0

Who changed what in which revision?

UserRevisionLine numberNew 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(&timestamp);
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(&timestamp),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