242 lines
6.5 KiB
C++
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;
|
|
}
|