#include <SPI.h> #include <Ethernet.h> #include <String.h> #include "SIM900.h" #include <SoftwareSerial.h> #include "sms.h" #include <LiquidCrystal_I2C.h> #include <Wire.h> byte mac[] = { 0x90, 0xA2, 0x00, 0x00, 0x00, 0x01 }; IPAddress ip(192,168,34,139); EthernetServer server(80); char char_in = 0; String HTTP_req; SMSGSM sms; boolean started=false; bool power = false; LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); void setup() { Serial.begin(9600); lcd.begin(16,2); lcd.setCursor(0,0); lcd.print("INIT GSM..."); lcd.setCursor(0,1); lcd.print("WAIT!!!"); //powerUp(); gsm.forceON(); if (gsm.begin(4800)) { Serial.println("\nstatus=READY"); lcd.clear(); lcd.setCursor(0,0); lcd.print("READY"); started=true; } else { Serial.println("\nstatus=IDLE"); lcd.clear(); lcd.setCursor(0,0); lcd.print("IDLE"); } Ethernet.begin(mac, ip); server.begin(); } void software_reset() { asm volatile (" jmp 0"); } void loop() { EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { char_in = client.read(); // HTTP_req += char_in; if (char_in == '\n') { Serial.println(HTTP_req); if(HTTP_req.indexOf("GET /res") >= 0) { reset_processing(&HTTP_req, &client); break; } if(HTTP_req.indexOf("GET /sms") >= 0) { sms_processing(&HTTP_req, &client); break; } if(HTTP_req.indexOf("GET /test") >= 0) { test_processing(&HTTP_req, &client); break; } else { client_header(&client); break; } } } } HTTP_req = ""; client.stop(); } if(power) { delay(1000); software_reset(); } } char* string2char(String command) { if(command.length()!=0){ char *p = const_cast<char*>(command.c_str()); return p; } } void parse_data(String *data) { data->replace("GET /sms/",""); data->replace("GET /test/", ""); int lastPost = data->indexOf("\r"); *data = data->substring(0, lastPost); data->replace(" HTTP/1.1", ""); data->replace(" HTTP/1.0", ""); data->trim(); } // explode String request_value(String *data, char separator, int index) { int found = 0; int strIndex[] = {0, -1}; int maxIndex = data->length()-1; for(int i=0; i<=maxIndex && found<=index; i++) { if(data->charAt(i)==separator || i==maxIndex) { found++; strIndex[0] = strIndex[1]+1; strIndex[1] = (i == maxIndex) ? i+1 : i; } } return found>index ? data->substring(strIndex[0], strIndex[1]) : ""; } bool gsm_status() { bool result = false; switch(gsm.CheckRegistration()) { case 1: result = true; break; default: break; } return result; } bool gsm_send(char *number_str, char *message_str) { bool result = false; switch(sms.SendSMS(number_str, message_str)) { case 1: result = true; break; default: break; } return result; } void reset_processing(String *data, EthernetClient *cl) { client_header(cl); cl->println("\{\"error\": 0, \"message\": \"restarting...\"\}"); power = true; } void test_processing(String *data, EthernetClient *cl) { parse_data(data); if(started) { client_header(cl); cl->println("\{\"id\":" + request_value(data, '/',0) + ",\"error\":0" + ",\"message\":\"test success\"\}"); } } void sms_processing(String *data, EthernetClient *cl) { parse_data(data); if(started) { if (gsm_send(string2char(request_value(data, '/', 1)), string2char(request_value(data, '/', 2)))) { client_header(cl); cl->println("\{\"id\":" + request_value(data, '/',0) + ",\"error\":0" + ",\"message\":\"success\"\}"); } else { if(!gsm_status()) { client_header(cl); cl->println("\{\"id\":" + request_value(data, '/',0) + ",\"error\":2" + ",\"message\":\"gsm not registered\"\}"); power = true; } else { client_header(cl); cl->println("\{\"id\":" + request_value(data, '/',0) + ",\"error\":1" + ",\"message\":\"fail\"\}"); } } } } void client_header(EthernetClient *cl) { cl->println("HTTP/1.1 200 OK"); cl->println("Content-Type: text/plain"); cl->println("Connection: close"); cl->println(); }