My sketch is pretty straightforward… I look for an incoming SMS, and if there is one, I send it back out on a Hologram.io. It works fine until a few hours goes by and then the modem returns ERROR. Here’s the sketch.
#include <MKRGSM.h>
const char PINNUMBER[] = " ";
const char GPRS_APN[] = "hologram";
const char GPRS_LOGIN[] = " ";
const char GPRS_PASSWORD[] = " ";
String HOLOGRAM_DEVICE_KEY = "******";
String HOLOGRAM_TOPIC = "_SOCKETAPI_";
GSMClient client;
GPRS gprs;
GSM gsm(1); // Enable debug
GSM_SMS sms;
char server[] = "cloudsocket.hologram.io";
int port = 9999;
boolean isSMSAvailable = false;
char sms_message[145];
void setup() {
Serial.begin(115200);
while(!Serial);
connectGSM();
}
void connectGSM() {
boolean connected = false;
while (!connected) {
Serial.println("Begin GSM Access");
if ((gsm.begin() == GSM_READY) &&
(gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD) == GPRS_READY)) {
connected = true;
Serial.println("GSM Access Success");
}
else {
Serial.println("Not connected");
delay(1000);
}
}
}
void loop() {
// Get any new incoming txt messages
int c;
if (sms.available()) {
int i = 0;
while ((c = sms.read()) != -1) {
sms_message[i++] = (char)c;
}
sms_message[i] = '\0'; // Terminate message
isSMSAvailable = true;
sms.flush();
}
// Send message back through hologram
if(isSMSAvailable) {
isSMSAvailable = false;
if (client.connect(server, port)) {
client.print("{\"k\":\"" + HOLOGRAM_DEVICE_KEY + "\",\"d\":\"");
client.print(sms_message);
client.println("\",\"t\":\""+HOLOGRAM_TOPIC+"\"}");
client.stop();
}
}
delay(5000);
}
When it works fine, the output looks like this:
AT+CMGL="REC UNREAD"
+CMGL: 19,"REC UNREAD","+19495472010",,"18/07/26,00:57:17+04"
Tgghgfh
OK
AT+CMGD=19
OK
AT+USOCR=6
+USOCR: 0
OK
AT+USOCO=0,"cloudsocket.hologram.io",9999
OK
AT+USOWR=0,21,"7B226B223A22433E383375242B57222C2264223A22"
+USOWR: 0,21
OK
AT+USOWR=0,7,"54676768676668"
+USOWR: 0,7
OK
AT+USOWR=0,20,"222C2274223A225F534F434B45544150495F227D"
+USOWR: 0,20
OK
AT+USOWR=0,2,"0D0A"
+USOWR: 0,2
OK
AT+USOCL=0
OK
AT+CMGL="REC UNREAD"
OK
When it failes, here’s what happens:
AT+CMGL="REC UNREAD"
OK
AT+CMGL="REC UNREAD"
OK
AT+CMGL="REC UNREAD"
+CMGL: 19,"REC UNREAD","+19495472010",,"18/07/26,03:09:53+04"
Testing one two three
OK
AT+CMGD=19
OK
AT+USOCR=6
ERROR
AT+CMGL="REC UNREAD"
OK
Any ideas?