#include #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, 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); }