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:
Thu Feb 15 14:31:15 2018 +0000
Revision:
8:89fe332bc412
Parent:
7:2b389a2e83c4
Child:
9:d24842a5a468
First version

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