Сергей Купавцев
/
123
123
main.cpp@2:16796fbfa94d, 2019-07-06 (annotated)
- 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?
User | Revision | Line number | New 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 | } |