210 lines
5.2 KiB
C++
210 lines
5.2 KiB
C++
#include <HardwareSerial.h>
|
|
|
|
#define RXD2 16
|
|
#define TXD2 17
|
|
#define PWRKEY 4
|
|
|
|
|
|
int parseLenFromSHREQ(const String& buf) {
|
|
int start = 0;
|
|
while (start < (int)buf.length()) {
|
|
int end = buf.indexOf('\n', start);
|
|
if (end == -1) end = buf.length();
|
|
String line = buf.substring(start, end);
|
|
line.trim();
|
|
if (line.startsWith("+SHREQ:")) {
|
|
int lastComma = line.lastIndexOf(',');
|
|
if (lastComma < 0) return -1;
|
|
int i = lastComma + 1;
|
|
while (i < (int)line.length() && line[i] == ' ') i++;
|
|
int j = i;
|
|
while (j < (int)line.length() && isDigit(line[j])) j++;
|
|
if (j <= i) return -1;
|
|
return line.substring(i, j).toInt();
|
|
}
|
|
start = end + 1;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
|
|
String at(const String& cmd, uint32_t timeoutMs=5000, uint32_t urcWindowMs=500) {
|
|
Serial.print(">> "); Serial.println(cmd);
|
|
while (Serial2.available()) (void)Serial2.read();
|
|
Serial2.println(cmd);
|
|
|
|
String resp;
|
|
uint32_t t0 = millis();
|
|
while (millis()-t0 < timeoutMs) {
|
|
while (Serial2.available()) {
|
|
char c = (char)Serial2.read();
|
|
resp += c; Serial.print(c);
|
|
t0 = millis(); // extend on activity
|
|
}
|
|
}
|
|
|
|
// Short URC window to catch lines like +SHREQ: "GET",200,<len>
|
|
uint32_t u0 = millis();
|
|
while (millis()-u0 < urcWindowMs) {
|
|
while (Serial2.available()) {
|
|
char c = (char)Serial2.read();
|
|
resp += c; Serial.print(c);
|
|
u0 = millis(); // extend on activity
|
|
}
|
|
}
|
|
|
|
resp.trim();
|
|
Serial.println("\n[Resp]\n" + resp);
|
|
return resp;
|
|
}
|
|
|
|
void powerOnSIM7080() {
|
|
pinMode(PWRKEY, OUTPUT);
|
|
digitalWrite(PWRKEY, LOW); delay(2000);
|
|
digitalWrite(PWRKEY, HIGH); delay(1000);
|
|
digitalWrite(PWRKEY, LOW); delay(30000);
|
|
}
|
|
|
|
bool waitLTE(uint32_t ms=120000) {
|
|
uint32_t t0=millis();
|
|
while (millis()-t0 < ms) {
|
|
String r = at("AT+CEREG?", 3000);
|
|
if (r.indexOf("+CEREG: 0,1")!=-1 || r.indexOf("+CEREG: 0,5")!=-1) return true;
|
|
delay(2000);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void attachPDP() {
|
|
at("AT",2000);
|
|
at("AT+CMEE=1",2000);
|
|
at("AT+CPIN?",2000);
|
|
at("AT+CSQ",2000);
|
|
at("AT+CNMP=38",3000);
|
|
at("AT+CMNB=1",3000);
|
|
at("AT+CGDCONT=1,\"IP\",\"hologram\"",3000);
|
|
at("AT+CGATT=1",10000);
|
|
if (!waitLTE()) { Serial.println("No LTE"); while(true) delay(1000); }
|
|
at("AT+CNCFG=0,1,\"hologram\"",3000);
|
|
at("AT+CNACT=0,1",20000);
|
|
at("AT+CNACT?",2000);
|
|
at("AT+CDNSCFG=\"8.8.8.8\",\"1.1.1.1\"",2000);
|
|
}
|
|
|
|
// Pure SH GET for one host+path, prints raw SHREAD output(s)
|
|
void shGet(const String& base, const String& path) {
|
|
Serial.println("\n=== SH GET ===");
|
|
Serial.println("Base: " + base);
|
|
Serial.println("Path: " + path);
|
|
|
|
at("AT+SHDISC", 2000); // clear any stale session (ignore CME 3)
|
|
at("AT+SHCHEAD", 2000); // clear headers
|
|
|
|
|
|
at("AT+SHCONF=\"URL\",\"" + base + "\"", 4000);
|
|
//at("AT+SHCONF=\"BODYLEN\",1024", 2000);
|
|
//at("AT+SHCONF=\"HEADERLEN\",350", 2000);
|
|
|
|
String r = at("AT+SHCONN", 12000);
|
|
|
|
Serial.println("---- CONNECTION !!----");
|
|
Serial.println(r);
|
|
|
|
if (r.indexOf("OK")==-1) { Serial.println("SHCONN failed"); return; }
|
|
|
|
at("AT+SHCHEAD", 2000);
|
|
// Optionally set UA if your server cares:
|
|
//at("AT+SHAHEAD=\"User-Agent\",\"SIM7080G\"",2000);
|
|
|
|
at("AT+SHAHEAD=\"User-Agent\",\"IOE Client\"",2000);
|
|
// at("AT+SHAHEAD=\"User-Agent\",\"curl/7.47.0\"",2000);
|
|
at("AT+SHAHEAD=\"Cache-control\",\"no-cache\"",2000);
|
|
at("AT+SHAHEAD=\"Connection\",\"keep-alive\"",2000);
|
|
|
|
// at("AT+SHAHEAD=\"Content-Type\",\"application/json\"",2000);
|
|
|
|
// at("AT+SHAHEAD=\"Content-Type\",\"text/html\"",2000);
|
|
at("AT+SHAHEAD=\"Accept\",\"text/html,*/*\"",2000);
|
|
//at("AT+SHAHEAD=\"Accept-encoding\",\"gzip, deflate\"",2000);
|
|
|
|
String u = at("AT+SHREQ=\"" +path + "\",1", 20000); // 1 = GET
|
|
|
|
|
|
Serial.println("---- REQUESTED !!----");
|
|
Serial.println(u);
|
|
|
|
|
|
|
|
|
|
//String u = at("AT+SHREQ=\"" + path + "\",1", 20000);
|
|
int bodyLen = parseLenFromSHREQ(u);
|
|
Serial.print("Parsed body length: "); Serial.println(bodyLen);
|
|
|
|
|
|
if (bodyLen > 0) {
|
|
String body = at("AT+SHREAD=0," + String(bodyLen), 5000);
|
|
Serial.println("---- SHREAD(N) RAW ----");
|
|
Serial.println(body);
|
|
}
|
|
|
|
|
|
// First read
|
|
|
|
//String body0 = at("AT+SHREAD=0,8", 3000);
|
|
//Serial.println("---- SHREAD(8) RAW ----");
|
|
//Serial.println(body0);
|
|
|
|
|
|
|
|
//String body1 = at("AT+SHREAD=0,2048", 4000);
|
|
//Serial.println("01 ---- SHREAD(2048) RAW ----");
|
|
//Serial.println(body1);
|
|
// Second smaller read
|
|
//String body2 = at("AT+SHREAD=0,512", 3000);
|
|
//Serial.println("---- SHREAD(512) RAW ----");
|
|
//Serial.println(body2);
|
|
|
|
|
|
//String body3 = at("AT+SHREAD=0,20", 3000);
|
|
//Serial.println("---- SHREAD(20) RAW ----");
|
|
//Serial.println(body3);
|
|
|
|
|
|
|
|
|
|
at("AT+SHDISC", 2000);
|
|
}
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
|
|
|
|
powerOnSIM7080();
|
|
attachPDP();
|
|
|
|
// 1) Your Laravel endpoint
|
|
shGet("http://laravel-server.lab.audasmedia.com.au",
|
|
"/api/device/860016049744324/commands");
|
|
|
|
|
|
//shGet("http://httpforever.com/","/");
|
|
|
|
// 2) Example.com root
|
|
// shGet("http://example.com", "/");
|
|
|
|
// 3) Adafruit WiFi test page
|
|
// shGet("http://wifitest.adafruit.com", "/testwifi/index.html");
|
|
|
|
// 4) httpbin GET
|
|
// shGet("http://httpbin.org", "/get");
|
|
|
|
Serial.println("\n--- All GETs attempted ---");
|
|
}
|
|
|
|
|
|
|
|
|
|
void loop() {
|
|
delay(1000);
|
|
}
|