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/

TCPConnector.h

Committer:
dvddnr
Date:
2018-02-15
Revision:
8:89fe332bc412

File content as of revision 8:89fe332bc412:

#pragma once

#include <mbed.h>
#include "es_wifi.h"


#define WIFI_WRITE_TIMEOUT 3000
#define WIFI_READ_TIMEOUT 25000

class TCPConnector
{
private:
    ES_WIFIObject_t m_es_wifi_ctx;

public:

    TCPConnector() {}
    ~TCPConnector(){}

    bool wifi_connect(char *wifi_ssid, char* wifi_wpa_password, uint32_t max_attempts)
    {
        
        /* HW setup */
        if (ES_WIFI_RegisterBusIO(&m_es_wifi_ctx,
                                    SPI_WIFI_Init,
                                    SPI_WIFI_DeInit,
                                    SPI_WIFI_Delay,
                                    SPI_WIFI_SendData,
                                    SPI_WIFI_ReceiveData) != ES_WIFI_STATUS_OK)
            return false;

        if (ES_WIFI_Init(&m_es_wifi_ctx) != ES_WIFI_STATUS_OK)
            return false;
        ES_WIFI_ResetToFactoryDefault(&m_es_wifi_ctx);

        /* JOIN AP */
        for (int i = 0; i < max_attempts; i++)
        {
            if (ES_WIFI_Connect(&m_es_wifi_ctx, wifi_ssid, wifi_wpa_password, ES_WIFI_SEC_WPA_WPA2) == ES_WIFI_STATUS_OK)
            {
                return (ES_WIFI_GetNetworkSettings(&m_es_wifi_ctx) == ES_WIFI_STATUS_OK);
            }
            wait_ms(1000);
        }

        return false;      
    }


    bool tcp_connect(uint8_t socket, char *domain_name, uint16_t remote_port, bool secure,uint32_t max_attempts)
    {
        ES_WIFI_Conn_t conn;
        ES_WIFI_Status_t res;

        conn.Number = socket;
        conn.RemotePort = remote_port;
        conn.LocalPort = 0;
        conn.Type = (secure)?ES_WIFI_TCP_SSL_CONNECTION:ES_WIFI_TCP_CONNECTION;
        strncpy((char *)conn.RemoteHost, domain_name, sizeof(conn.RemoteHost));
        for(int i=0;i<max_attempts;i++)
        {
            res = ES_WIFI_ConnectToRemoteHost(&m_es_wifi_ctx, &conn);
            if(res == ES_WIFI_STATUS_OK) return true;
        }
        return false;
    }


    bool tcp_close(uint32_t socket)
    {
        ES_WIFI_Conn_t conn;
        conn.Number = socket;
        
        return (ES_WIFI_StopClientConnection(&m_es_wifi_ctx, &conn)== ES_WIFI_STATUS_OK);
    }


    bool tcp_write(uint8_t socket, char *data, uint32_t data_len)
    {
        uint16_t ack;
        uint16_t chunk_size;
        ES_WIFI_Status_t res;

        for(int i=0;i<data_len;i+=ES_WIFI_PAYLOAD_SIZE)
        {
            chunk_size = ((data_len-i)<ES_WIFI_PAYLOAD_SIZE)?(data_len-i):ES_WIFI_PAYLOAD_SIZE;
            res = ES_WIFI_SendData(&m_es_wifi_ctx, socket, (uint8_t*)data+i, chunk_size, &ack, WIFI_WRITE_TIMEOUT);
            if( res != ES_WIFI_STATUS_OK || chunk_size != ack ) return false;
        }
        return true;
    }


    bool tcp_read(uint8_t socket, char *rx_buffer, uint16_t rx_buffer_len, uint16_t *received_bytes,bool continued)
    {
        bool rx = false;
        *received_bytes = 0;

        rx = (continued)?( ES_WIFI_ReceiveData2(&m_es_wifi_ctx, (uint8_t*)rx_buffer, rx_buffer_len, received_bytes) == ES_WIFI_STATUS_OK ):
                         ( ES_WIFI_ReceiveData(&m_es_wifi_ctx, socket, (uint8_t*)rx_buffer, rx_buffer_len, received_bytes, WIFI_READ_TIMEOUT) == ES_WIFI_STATUS_OK );
        
        return rx;
    }





};