123

Dependencies:  

Committer:
Sergey_K
Date:
Sat Jul 06 07:22:50 2019 +0000
Revision:
2:16796fbfa94d
Parent:
1:441cdd24333e
sd card and gsm

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sergey_K 0:f7e73515c3fc 1 //It is the code of the GPRS communication by the use of the Sim800 module.
Sergey_K 0:f7e73515c3fc 2 //This code has work is "to upload data on data.sparkfun.com in every 5 seconds.
Sergey_K 0:f7e73515c3fc 3 //To check the uploaded data the URL is "data.sparkfun.com/streams/roYVdJgWrXUpxVpDYJpA".
Sergey_K 0:f7e73515c3fc 4
Sergey_K 0:f7e73515c3fc 5 #include "mbed.h"
Sergey_K 0:f7e73515c3fc 6 #include <string>
Sergey_K 1:441cdd24333e 7 #include "SDBlockDevice.h"
Sergey_K 1:441cdd24333e 8 #include "FATFileSystem.h"
Sergey_K 2:16796fbfa94d 9
Sergey_K 0:f7e73515c3fc 10 #define GSMRX PA_9
Sergey_K 0:f7e73515c3fc 11 #define GSMTX PA_10
Sergey_K 0:f7e73515c3fc 12 #define SAMPLE_FLAG1 (1UL << 0)
Sergey_K 0:f7e73515c3fc 13 #define SAMPLE_FLAG2 (1UL << 9)
Sergey_K 1:441cdd24333e 14 #define BUFFER_SIZE 50
Sergey_K 0:f7e73515c3fc 15
Sergey_K 1:441cdd24333e 16 typedef struct {
Sergey_K 1:441cdd24333e 17 uint8_t *lcdData;
Sergey_K 1:441cdd24333e 18 char logMessage;
Sergey_K 1:441cdd24333e 19 } message_t;
Sergey_K 2:16796fbfa94d 20 //Инициализация ивентов и очереди
Sergey_K 1:441cdd24333e 21 Queue<message_t, 32> queue;
Sergey_K 1:441cdd24333e 22 MemoryPool<message_t, 100> mpool;
Sergey_K 1:441cdd24333e 23 EventQueue evq;
Sergey_K 2:16796fbfa94d 24 EventQueue sdEvent;
Sergey_K 2:16796fbfa94d 25 //Инициализация потоков
Sergey_K 1:441cdd24333e 26 Thread eventThread;
Sergey_K 1:441cdd24333e 27 Thread gsmTask;
Sergey_K 1:441cdd24333e 28 Thread sdEventThread;
Sergey_K 1:441cdd24333e 29 Thread sdLogWrite;
Sergey_K 2:16796fbfa94d 30 //Флаги
Sergey_K 2:16796fbfa94d 31 int timeCounter = 0;
Sergey_K 1:441cdd24333e 32 int c;
Sergey_K 2:16796fbfa94d 33 bool pressedButton = false;
Sergey_K 2:16796fbfa94d 34 uint8_t counter=0;
Sergey_K 2:16796fbfa94d 35 int answerCounter = 0;
Sergey_K 2:16796fbfa94d 36 int readTimeStart=0;
Sergey_K 2:16796fbfa94d 37 //Буфферы
Sergey_K 1:441cdd24333e 38 string timeBuffer;
Sergey_K 2:16796fbfa94d 39 uint8_t request[50] = "Hello!I am SIM800,I send you message from stm32";
Sergey_K 1:441cdd24333e 40 uint8_t *receiveMsg[50];
Sergey_K 0:f7e73515c3fc 41 char answer[300];
Sergey_K 2:16796fbfa94d 42 char sslBuffer[1402];
Sergey_K 2:16796fbfa94d 43 //Прерывания
Sergey_K 1:441cdd24333e 44 InterruptIn button(BUTTON1);
Sergey_K 2:16796fbfa94d 45 //Настройка пинов
Sergey_K 0:f7e73515c3fc 46 DigitalOut myLed(LED1);
Sergey_K 0:f7e73515c3fc 47 Serial sim800(GSMRX,GSMTX); //Serial communication of the sim800 and pc.
Sergey_K 0:f7e73515c3fc 48 Serial pc(SERIAL_TX,SERIAL_RX);
Sergey_K 2:16796fbfa94d 49 //Инициализации SD карты
Sergey_K 1:441cdd24333e 50 SDBlockDevice sd(D11, D12, D13, D4);
Sergey_K 1:441cdd24333e 51 FATFileSystem fs("sd");
Sergey_K 0:f7e73515c3fc 52
Sergey_K 2:16796fbfa94d 53 //Настройка времени
Sergey_K 1:441cdd24333e 54 void simTime()
Sergey_K 1:441cdd24333e 55 {
Sergey_K 2:16796fbfa94d 56 sim800.printf("AT\r\n");
Sergey_K 2:16796fbfa94d 57 wait(1);
Sergey_K 2:16796fbfa94d 58 sim800.printf("AT+CLTS=1\r\n");
Sergey_K 2:16796fbfa94d 59 wait(1);
Sergey_K 2:16796fbfa94d 60 sim800.printf("AT+CNTPCID=1\r\n");
Sergey_K 2:16796fbfa94d 61 wait(1);
Sergey_K 2:16796fbfa94d 62 sim800.printf("AT+CNTP=ntp1.vniiftri.ru,7\r\n");
Sergey_K 2:16796fbfa94d 63 wait(1);
Sergey_K 2:16796fbfa94d 64 sim800.printf("AT+CNTP\r\n");
Sergey_K 2:16796fbfa94d 65 wait(1);
Sergey_K 2:16796fbfa94d 66 sim800.printf("AT+CCLK?\r\n");
Sergey_K 2:16796fbfa94d 67 wait(1);
Sergey_K 2:16796fbfa94d 68 sim800.printf("AT&W\r\n");
Sergey_K 2:16796fbfa94d 69 wait(1);
Sergey_K 1:441cdd24333e 70 }
Sergey_K 2:16796fbfa94d 71 //Отправка команд в модуль СИМ800
Sergey_K 1:441cdd24333e 72 void sendAt(const char *AT)
Sergey_K 0:f7e73515c3fc 73 {
Sergey_K 1:441cdd24333e 74 sim800.printf("%s\r\n",AT);
Sergey_K 1:441cdd24333e 75 wait(1);
Sergey_K 1:441cdd24333e 76 }
Sergey_K 2:16796fbfa94d 77 //Отправка сообщения с дисплея
Sergey_K 1:441cdd24333e 78 void lcdStartWork() {
Sergey_K 2:16796fbfa94d 79 myLed=!myLed;
Sergey_K 2:16796fbfa94d 80 message_t *message = mpool.alloc();
Sergey_K 2:16796fbfa94d 81 message->lcdData = request;
Sergey_K 2:16796fbfa94d 82 queue.put(message);
Sergey_K 0:f7e73515c3fc 83 }
Sergey_K 2:16796fbfa94d 84 //Запись сертификата с SD карты
Sergey_K 1:441cdd24333e 85 void sdReadSsl()
Sergey_K 0:f7e73515c3fc 86 {
Sergey_K 1:441cdd24333e 87 sd.init();
Sergey_K 1:441cdd24333e 88 fs.mount(&sd);
Sergey_K 1:441cdd24333e 89 FILE *fp = fopen("/sd/ssl.txt", "r");
Sergey_K 1:441cdd24333e 90 if (fp == NULL) {
Sergey_K 1:441cdd24333e 91 printf("Fail open txt file\r\n");
Sergey_K 1:441cdd24333e 92 }
Sergey_K 1:441cdd24333e 93 fread(sslBuffer, sizeof(sslBuffer), 1, fp );
Sergey_K 1:441cdd24333e 94 fclose(fp);
Sergey_K 1:441cdd24333e 95 printf("File successfully read!\r\n");
Sergey_K 1:441cdd24333e 96 printf(" Your data:\n%s\n",sslBuffer);
Sergey_K 1:441cdd24333e 97 fs.unmount();
Sergey_K 1:441cdd24333e 98 sd.deinit();
Sergey_K 1:441cdd24333e 99
Sergey_K 0:f7e73515c3fc 100 }
Sergey_K 0:f7e73515c3fc 101
Sergey_K 2:16796fbfa94d 102 //Отправка сообщения на сервер через модуль
Sergey_K 1:441cdd24333e 103 void gsmStartWork() {
Sergey_K 1:441cdd24333e 104 while(1)
Sergey_K 1:441cdd24333e 105 {
Sergey_K 1:441cdd24333e 106 osEvent evt = queue.get();
Sergey_K 1:441cdd24333e 107 if (evt.status == osEventMessage)
Sergey_K 1:441cdd24333e 108 {
Sergey_K 2:16796fbfa94d 109 message_t *message = (message_t*)evt.value.p;
Sergey_K 2:16796fbfa94d 110 *receiveMsg = (uint8_t*)message->lcdData;
Sergey_K 2:16796fbfa94d 111 printf("lcdData: %s\n\r" , *receiveMsg);
Sergey_K 1:441cdd24333e 112 if(timeCounter == 0)
Sergey_K 1:441cdd24333e 113 {
Sergey_K 1:441cdd24333e 114 timeCounter = 1;
Sergey_K 1:441cdd24333e 115 simTime();
Sergey_K 1:441cdd24333e 116 }
Sergey_K 1:441cdd24333e 117
Sergey_K 1:441cdd24333e 118 sendAt("AT\r\n");
Sergey_K 1:441cdd24333e 119 /* sim800.printf("AT+FSDEL=C:\\USER\\SSL1.CRT\n\r");
Sergey_K 1:441cdd24333e 120 wait(0.5);
Sergey_K 1:441cdd24333e 121 sim800.printf("AT+FSCREATE=C:\\USER\\SSL1.CRT\n\r");
Sergey_K 1:441cdd24333e 122 wait(1.5);
Sergey_K 1:441cdd24333e 123 sim800.printf("AT+FSWRITE=C:\\USER\\SSL1.CRT,0,1402,10\n\r");
Sergey_K 1:441cdd24333e 124 wait(0.2);
Sergey_K 1:441cdd24333e 125 sim800.printf("%s\n\r",sslBuffer);
Sergey_K 1:441cdd24333e 126 wait(1);*/
Sergey_K 1:441cdd24333e 127 sim800.printf("AT+SSLSETCERT=C:\\USER\\SSL1.CRT\n\r");
Sergey_K 1:441cdd24333e 128 wait(3);
Sergey_K 1:441cdd24333e 129 answerCounter=1;
Sergey_K 1:441cdd24333e 130 sendAt("AT+CCLK?\r\n");
Sergey_K 2:16796fbfa94d 131 wait(1.5);
Sergey_K 1:441cdd24333e 132 answerCounter=0;
Sergey_K 1:441cdd24333e 133 sendAt("AT+SAPBR=3,1,Contype,GPRS\r\n");
Sergey_K 1:441cdd24333e 134 sendAt("AT+SAPBR=3,1,APN,internet.mts.ru\r\n");
Sergey_K 1:441cdd24333e 135 sendAt("AT+SAPBR=3,1,USER,mts\r\n");
Sergey_K 1:441cdd24333e 136 sendAt("AT+SAPBR=3,1,PWD,mts");
Sergey_K 1:441cdd24333e 137 sendAt("AT+SAPBR=1,1");
Sergey_K 1:441cdd24333e 138 sendAt("AT+HTTPINIT");
Sergey_K 1:441cdd24333e 139 sendAt("AT+HTTPSSL=1");
Sergey_K 1:441cdd24333e 140 sendAt("AT+HTTPPARA=URL,157.230.245.76:1880/message");
Sergey_K 1:441cdd24333e 141 sendAt("AT+HTTPPARA=CONTENT,application/octet-stream");
Sergey_K 1:441cdd24333e 142 sendAt("AT+HTTPDATA=51,10000");
Sergey_K 1:441cdd24333e 143 sim800.write(*receiveMsg,51,NULL,SERIAL_EVENT_TX_COMPLETE);
Sergey_K 1:441cdd24333e 144 wait(0.5);
Sergey_K 1:441cdd24333e 145 sendAt("AT+HTTPACTION=1");
Sergey_K 1:441cdd24333e 146 wait(1.5);
Sergey_K 1:441cdd24333e 147 sendAt("AT+HTTPTERM");
Sergey_K 1:441cdd24333e 148 wait(1.5);
Sergey_K 1:441cdd24333e 149 sendAt("AT+HTTPTERM");
Sergey_K 1:441cdd24333e 150 wait(1.5);
Sergey_K 1:441cdd24333e 151 sendAt("AT+SAPBR=0,1");
Sergey_K 2:16796fbfa94d 152 pc.printf("Time: %s\n\r",timeBuffer);
Sergey_K 1:441cdd24333e 153 mpool.free(message);
Sergey_K 1:441cdd24333e 154 }
Sergey_K 1:441cdd24333e 155 }
Sergey_K 0:f7e73515c3fc 156 }
Sergey_K 0:f7e73515c3fc 157
Sergey_K 2:16796fbfa94d 158 //Запись логов
Sergey_K 1:441cdd24333e 159 void sdWriteLog()
Sergey_K 0:f7e73515c3fc 160 {
Sergey_K 1:441cdd24333e 161 sd.init();
Sergey_K 1:441cdd24333e 162 fs.mount(&sd);
Sergey_K 1:441cdd24333e 163 printf(" Log write start!\n\n");
Sergey_K 1:441cdd24333e 164 FILE *fp2 = fopen("/sd/log.txt", "a+");
Sergey_K 1:441cdd24333e 165 fprintf(fp2, "Hello World!%s\r\n",timeBuffer);
Sergey_K 1:441cdd24333e 166 fclose(fp2);
Sergey_K 1:441cdd24333e 167 printf(" Log write DONE!\n\n");
Sergey_K 1:441cdd24333e 168 fs.unmount();
Sergey_K 1:441cdd24333e 169 sd.deinit();
Sergey_K 0:f7e73515c3fc 170 }
Sergey_K 2:16796fbfa94d 171 //Прерывание на нажатие кнопки
Sergey_K 1:441cdd24333e 172 void buttonPressed()
Sergey_K 1:441cdd24333e 173 {
Sergey_K 1:441cdd24333e 174 // sdEvent.call(&sdReadSsl);
Sergey_K 1:441cdd24333e 175 counter++;
Sergey_K 1:441cdd24333e 176 evq.call(&lcdStartWork);
Sergey_K 1:441cdd24333e 177 pressedButton=true;
Sergey_K 1:441cdd24333e 178 //sdReadSsl();
Sergey_K 0:f7e73515c3fc 179 }
Sergey_K 2:16796fbfa94d 180
Sergey_K 2:16796fbfa94d 181 //Прерывание на отжим кнопки
Sergey_K 1:441cdd24333e 182 void buttonReleased()
Sergey_K 1:441cdd24333e 183 {
Sergey_K 1:441cdd24333e 184 myLed=!myLed;
Sergey_K 1:441cdd24333e 185 pressedButton=false;
Sergey_K 1:441cdd24333e 186 }
Sergey_K 2:16796fbfa94d 187 //Задача для записи логов
Sergey_K 1:441cdd24333e 188 void sdWork()
Sergey_K 1:441cdd24333e 189 {
Sergey_K 0:f7e73515c3fc 190 while(1)
Sergey_K 0:f7e73515c3fc 191 {
Sergey_K 2:16796fbfa94d 192 sdEvent.call(&sdWriteLog);
Sergey_K 2:16796fbfa94d 193 wait(15);
Sergey_K 0:f7e73515c3fc 194 }
Sergey_K 2:16796fbfa94d 195 }
Sergey_K 0:f7e73515c3fc 196 //MAIN-----------------------------------------------
Sergey_K 0:f7e73515c3fc 197 int main()
Sergey_K 0:f7e73515c3fc 198 {
Sergey_K 1:441cdd24333e 199 pc.baud(9600);
Sergey_K 0:f7e73515c3fc 200 sim800.baud(9600);
Sergey_K 2:16796fbfa94d 201
Sergey_K 0:f7e73515c3fc 202 pc.printf("*******GPRS TEST*******\r\n");
Sergey_K 2:16796fbfa94d 203
Sergey_K 1:441cdd24333e 204 sdReadSsl();
Sergey_K 1:441cdd24333e 205 button.rise(&buttonReleased);
Sergey_K 1:441cdd24333e 206 button.fall(&buttonPressed);
Sergey_K 2:16796fbfa94d 207
Sergey_K 0:f7e73515c3fc 208 gsmTask.start(gsmStartWork);
Sergey_K 1:441cdd24333e 209 sdLogWrite.start(sdWork);
Sergey_K 2:16796fbfa94d 210
Sergey_K 1:441cdd24333e 211 eventThread.start(callback(&evq, &EventQueue::dispatch_forever));
Sergey_K 1:441cdd24333e 212 sdEventThread.start(callback(&sdEvent,&EventQueue::dispatch_forever));
Sergey_K 1:441cdd24333e 213 while(1) {
Sergey_K 1:441cdd24333e 214 if(answerCounter==0)
Sergey_K 1:441cdd24333e 215 {
Sergey_K 1:441cdd24333e 216 if(pc.readable()) {
Sergey_K 1:441cdd24333e 217 sim800.putc(pc.getc());
Sergey_K 1:441cdd24333e 218 }
Sergey_K 1:441cdd24333e 219 if(sim800.readable()) {
Sergey_K 1:441cdd24333e 220 pc.putc(sim800.getc());
Sergey_K 1:441cdd24333e 221 }
Sergey_K 0:f7e73515c3fc 222 }
Sergey_K 1:441cdd24333e 223 else
Sergey_K 0:f7e73515c3fc 224 {
Sergey_K 2:16796fbfa94d 225 if(sim800.readable())
Sergey_K 2:16796fbfa94d 226 {
Sergey_K 2:16796fbfa94d 227 if(readTimeStart == 1)
Sergey_K 2:16796fbfa94d 228 {
Sergey_K 2:16796fbfa94d 229 if(readTimeStart == 1) timeBuffer += char(c);
Sergey_K 2:16796fbfa94d 230 if(char(c) =='+') readTimeStart = 0;
Sergey_K 2:16796fbfa94d 231 }
Sergey_K 2:16796fbfa94d 232 if(char(c) =='"') readTimeStart = 1;
Sergey_K 2:16796fbfa94d 233 c = sim800.getc();
Sergey_K 2:16796fbfa94d 234 }
Sergey_K 0:f7e73515c3fc 235 }
Sergey_K 0:f7e73515c3fc 236 }
Sergey_K 0:f7e73515c3fc 237 }