gsm and sd card

Dependencies:   Base64 sd-driver

Committer:
Sergey_K
Date:
Thu Jul 11 11:14:05 2019 +0000
Revision:
3:7b76a34e07c0
Parent:
2:16796fbfa94d
add new SD work

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