123

Dependencies:  

main.cpp

Committer:
Sergey_K
Date:
2019-07-06
Revision:
2:16796fbfa94d
Parent:
1:441cdd24333e

File content as of revision 2:16796fbfa94d:

//It is the code of the GPRS communication by the use of the Sim800 module.
//This code has work is "to upload data on data.sparkfun.com in every 5 seconds.
//To check the uploaded data the URL is "data.sparkfun.com/streams/roYVdJgWrXUpxVpDYJpA".
 
#include "mbed.h"
#include <string> 
#include "SDBlockDevice.h"
#include "FATFileSystem.h"

#define GSMRX PA_9
#define GSMTX PA_10 
#define SAMPLE_FLAG1 (1UL << 0)
#define SAMPLE_FLAG2 (1UL << 9)
#define BUFFER_SIZE 50

typedef struct {
uint8_t *lcdData;
char logMessage;      
} message_t;
//Инициализация ивентов и очереди
Queue<message_t, 32> queue;
MemoryPool<message_t, 100> mpool;
EventQueue evq;
EventQueue sdEvent;
//Инициализация потоков
Thread eventThread;
Thread gsmTask;
Thread sdEventThread;
Thread sdLogWrite;
//Флаги
int timeCounter = 0;
int c;
bool pressedButton = false;
uint8_t counter=0;
int answerCounter = 0;
int readTimeStart=0;
//Буфферы
string timeBuffer;
uint8_t request[50] = "Hello!I am SIM800,I send you message from stm32";
uint8_t *receiveMsg[50];
char answer[300];
char sslBuffer[1402];
//Прерывания
InterruptIn button(BUTTON1);
//Настройка пинов
DigitalOut myLed(LED1);
Serial sim800(GSMRX,GSMTX);                                   //Serial communication of the sim800 and pc.
Serial pc(SERIAL_TX,SERIAL_RX);
//Инициализации SD карты 
SDBlockDevice sd(D11, D12, D13, D4);
FATFileSystem fs("sd");

//Настройка времени
void simTime()
{   
    sim800.printf("AT\r\n");
    wait(1);
    sim800.printf("AT+CLTS=1\r\n");
    wait(1);
    sim800.printf("AT+CNTPCID=1\r\n");
    wait(1);
    sim800.printf("AT+CNTP=ntp1.vniiftri.ru,7\r\n");
    wait(1);
    sim800.printf("AT+CNTP\r\n");
    wait(1);
    sim800.printf("AT+CCLK?\r\n");
    wait(1); 
    sim800.printf("AT&W\r\n");
    wait(1); 
}
//Отправка команд в модуль СИМ800
void sendAt(const char *AT)
{
  sim800.printf("%s\r\n",AT);
  wait(1);
}
//Отправка сообщения с дисплея 
void lcdStartWork() {
    myLed=!myLed;       
    message_t *message = mpool.alloc();
    message->lcdData = request; 
    queue.put(message);      
}
//Запись сертификата с SD карты 
void sdReadSsl()
{
    sd.init();
    fs.mount(&sd);
    FILE *fp = fopen("/sd/ssl.txt", "r");   
    if (fp == NULL) {
        printf("Fail open txt file\r\n");
    }
    fread(sslBuffer, sizeof(sslBuffer), 1, fp );
    fclose(fp);
    printf("File successfully read!\r\n");
    printf(" Your data:\n%s\n",sslBuffer);
    fs.unmount();
    sd.deinit();
    
}

//Отправка сообщения на сервер через модуль 
void gsmStartWork() {
    while(1)
    {
        osEvent evt = queue.get();
        if (evt.status == osEventMessage) 
        {
            message_t *message = (message_t*)evt.value.p;
            *receiveMsg = (uint8_t*)message->lcdData; 
            printf("lcdData: %s\n\r"   , *receiveMsg);   
        if(timeCounter == 0)
        {
            timeCounter = 1;
            simTime();
        }
        
        sendAt("AT\r\n");
      /*  sim800.printf("AT+FSDEL=C:\\USER\\SSL1.CRT\n\r");
        wait(0.5);
        sim800.printf("AT+FSCREATE=C:\\USER\\SSL1.CRT\n\r");
        wait(1.5);
        sim800.printf("AT+FSWRITE=C:\\USER\\SSL1.CRT,0,1402,10\n\r");
        wait(0.2);
        sim800.printf("%s\n\r",sslBuffer);
        wait(1);*/
        sim800.printf("AT+SSLSETCERT=C:\\USER\\SSL1.CRT\n\r");
        wait(3);
        answerCounter=1;
        sendAt("AT+CCLK?\r\n");
        wait(1.5);
        answerCounter=0;
        sendAt("AT+SAPBR=3,1,Contype,GPRS\r\n");     
        sendAt("AT+SAPBR=3,1,APN,internet.mts.ru\r\n");
        sendAt("AT+SAPBR=3,1,USER,mts\r\n");
        sendAt("AT+SAPBR=3,1,PWD,mts");
        sendAt("AT+SAPBR=1,1");
        sendAt("AT+HTTPINIT");
        sendAt("AT+HTTPSSL=1");
        sendAt("AT+HTTPPARA=URL,157.230.245.76:1880/message");
        sendAt("AT+HTTPPARA=CONTENT,application/octet-stream");
        sendAt("AT+HTTPDATA=51,10000");
        sim800.write(*receiveMsg,51,NULL,SERIAL_EVENT_TX_COMPLETE);
        wait(0.5);
        sendAt("AT+HTTPACTION=1");
        wait(1.5);
        sendAt("AT+HTTPTERM");
        wait(1.5);
        sendAt("AT+HTTPTERM");
        wait(1.5);
        sendAt("AT+SAPBR=0,1");
        pc.printf("Time: %s\n\r",timeBuffer);   
        mpool.free(message);  
            }
        }
}

//Запись логов 
void sdWriteLog()
{
    sd.init();
    fs.mount(&sd);
    printf(" Log write start!\n\n");
    FILE *fp2 = fopen("/sd/log.txt", "a+");
    fprintf(fp2, "Hello World!%s\r\n",timeBuffer);
    fclose(fp2);
    printf(" Log write DONE!\n\n");
    fs.unmount();
    sd.deinit();
}
//Прерывание на нажатие кнопки
void buttonPressed()
{   
   // sdEvent.call(&sdReadSsl);
    counter++;
    evq.call(&lcdStartWork);
    pressedButton=true;
    //sdReadSsl();
}

//Прерывание на отжим кнопки
void buttonReleased()
{
    myLed=!myLed;
    pressedButton=false; 
}
//Задача для записи логов
void sdWork()
{
    while(1)
    {
        sdEvent.call(&sdWriteLog);
        wait(15);
    }
}
//MAIN-----------------------------------------------    
int main()
{
    pc.baud(9600);
    sim800.baud(9600);
    
    pc.printf("*******GPRS TEST*******\r\n");
    
    sdReadSsl();
    button.rise(&buttonReleased);
    button.fall(&buttonPressed);
    
    gsmTask.start(gsmStartWork);
    sdLogWrite.start(sdWork);
    
    eventThread.start(callback(&evq, &EventQueue::dispatch_forever));
    sdEventThread.start(callback(&sdEvent,&EventQueue::dispatch_forever));
    while(1) {
        if(answerCounter==0)
        {
            if(pc.readable()) { 
            sim800.putc(pc.getc()); 
            } 
            if(sim800.readable()) { 
            pc.putc(sim800.getc()); 
            } 
        }
        else
        {
             if(sim800.readable()) 
             { 
                 if(readTimeStart == 1)
                 {
                     if(readTimeStart == 1) timeBuffer += char(c);
                     if(char(c) =='+') readTimeStart = 0;
                 }
                            if(char(c) =='"') readTimeStart = 1;
                            c = sim800.getc(); 
            } 
        }
    }
}