Arduino_SourceCode_SmartCamera/gateway/sim5215_umts_shield.cpp
2022-01-20 00:37:51 +01:00

242 lines
6.5 KiB
C++

#include "sim5215_umts_shield.h"
Shield::Shield(int onPin, int shieldRX, int shieldTX) : shieldSerial(shieldRX, shieldTX){
shieldSerial.begin(115200);
onModulePin = onPin;
pinMode(onModulePin, OUTPUT);
}
int Shield::init(char pin_number[], char apn[], char user_name[], char password[]) {
char aux_str[50];
int answer = -1;
Serial.println("Starting...");
delay(3000);
//sets the PIN code
sprintf(aux_str, "AT+CPIN=%s", pin_number);
sendATcommand(aux_str, "OK", 2000);
delay(3000);
Serial.println("Connecting to the network...");
while( (sendATcommand("AT+CREG?", "+CREG: 0,1", 500) || sendATcommand("AT+CREG?", "+CREG: 0,5", 500)) == 0 );
Serial.print("Setting SMS mode...");
sendATcommand("AT+CMGF=1", "OK", 1000); // sets the SMS mode to text
// sets APN, user name and password
sprintf(aux_str, "AT+CGSOCKCONT=1,\"IP\",\"%s\"", apn);
answer &= sendATcommand(aux_str, "OK", 2000);
sprintf(aux_str, "AT+CSOCKAUTH=1,1,\"%s\",\"%s\"", user_name, password);
answer &= sendATcommand(aux_str, "OK", 2000);
return answer;
}
void Shield::power_on(){
uint8_t answer=0;
// checks if the module is started
answer = sendATcommand("AT", "OK", 2000);
if (answer == 0) {
// power on pulse
digitalWrite(onModulePin,HIGH);
delay(3000);
digitalWrite(onModulePin,LOW);
// waits for an answer from the module
while(answer == 0) {
// Send AT every two seconds and wait for the answer
answer = sendATcommand("AT", "OK", 2000);
Serial.println(answer);
}
}
}
int8_t Shield::sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout){
uint8_t x=0, answer=0;
char response[100];
unsigned long previous;
memset(response, '\0', 100); // Initialice the string
delay(100);
while( shieldSerial.available() > 0) shieldSerial.read(); // Clean the input buffer
int bytes = shieldSerial.println(ATcommand); // Send the AT command
x = 0;
previous = millis();
// this loop waits for the answer
do {
// if there are data in the UART input buffer, reads it and checks for the answer
if (shieldSerial.available() != 0){
// Serial.println("Data in UART");
response[x] = shieldSerial.read();
x++;
// check if the desired answer is in the response of the module
if (strstr(response, expected_answer) != NULL)
{
answer = 1;
}
}
// Waits for the answer with time out
}
while((answer == 0) && ((millis() - previous) < timeout));
return answer;
}
bool match(char * cible, char * current) {
int i = 0;
boolean ok = true;
while (i<6 && ok) {
ok = (cible[i] == current[i]);
i++;
}
return ok;
}
void add_c(char * chaine, char c) {
chaine[0] = chaine[1];
chaine[1] = chaine[2];
chaine[2] = chaine[3];
chaine[3] = chaine[4];
chaine[4] = chaine[5];
chaine[5] = c;
}
int8_t Shield::sendPOSTrequest(char url[], int port, char request[], unsigned int timeout) {
char aux_str[50];
unsigned long previous;
int data_size = 0;
int http_x, http_status, x, answer;
char data[400];
previous = millis();
sprintf(aux_str, "AT+CHTTPACT=\"%s\",%d", url, port);
answer = sendATcommand(aux_str, "+CHTTPACT: REQUEST", timeout);
if (answer == 1) {
// Sends the request
shieldSerial.println(request);
// Sends <Ctrl+Z>
shieldSerial.write(0x1A);
http_status = 1;
answer = sendATcommand("", "+CHTTPACT: ", timeout);
if (answer == 0) {
if (http_status == 1) {
http_status = 3;
Serial.println("ERROR : No first +CHTTPACT: ");
}
} else {
// answer == 1
Serial.println("+CHTTPACT: received");
while(shieldSerial.available()==0);
aux_str[0] = shieldSerial.read();
if ((aux_str[0] == 'D') && (http_status == 1)) {
while(shieldSerial.available()<4);
shieldSerial.read(); // A
shieldSerial.read(); // T
shieldSerial.read(); // A
shieldSerial.read(); // ,
// Reads the packet size
x=0;
do {
while(shieldSerial.available()==0);
aux_str[x] = shieldSerial.read();
x++;
} while((aux_str[x-1] != '\r') && (aux_str[x-1] != '\n'));
aux_str[x-1] = '\0';
data_size = atoi(aux_str);
// Now, search for (200 ok)
char cible[] = "200 ok";
char current[] = "\0\0\0\0\0\0";
while ((!match(cible,current)) && (data_size > 0)) {
while (shieldSerial.available() < 1);
add_c(current, shieldSerial.read());
data_size--;
}
if (match(cible,current)) {
Serial.println("Found 200 ok");
// End of the header found
http_status = 2;
// Vidus du buffer
while (data_size > 0) {
shieldSerial.read();
data_size--;
}
} else {
Serial.println("No 200 ok");
http_status = 3;
}
} else {
Serial.println("No first DATA");
http_status = 3;
}
}
if (http_status == 2) {
answer = sendATcommand("", "+CHTTPACT: ", timeout);
if (answer == 0) {
http_status = 3;
Serial.println("ERROR : No second +CHTTPACT: ");
} else {
// answer == 1
Serial.println("+CHTTPACT: received");
while(shieldSerial.available()==0);
aux_str[0] = shieldSerial.read();
Serial.println(aux_str[0]);
if (aux_str[0] == '0') {
http_status = 0;
} else {
Serial.println("No 0");
http_status = 3;
}
}
}
previous = millis() - previous;
} else {
Serial.println("!Error on CHTTPACT REQUEST!");
http_status = 3;
}
Serial.print(F("http_status= "));
Serial.println(http_status, DEC);
return http_status;
}
int8_t Shield::sendTextMessage(char phone_number[], char text[]) {
char aux_str[50];
int aux, answer;
sendATcommand("AT+CMGF=1", "OK", 1000); // sets the SMS mode to text
sprintf(aux_str,"AT+CMGS=\"%s\"", phone_number);
answer = sendATcommand(aux_str, ">", 2000); // send the SMS number
if (answer == 1) {
shieldSerial.println(text);
shieldSerial.write(0x1A);
answer = sendATcommand("", "OK", 20000);
if (answer == 1) {
Serial.print("Text message sent.");
} else {
Serial.print("Could not send text message.");
}
} else {
Serial.print("Could not send text message");
Serial.println(answer, DEC);
}
return answer;
}