Arduino + 4G HTTP Request return code -2 (ArduinoHTTPClient + Modem GSM)

I'm developing a system in which an Atmega328 acts as a gateway, receiving data from a sensor via NRF24L01 and sending it to an HTTP server in Spring via 4G.
Well, everything was working perfectly until yesterday, I edited a few things in the data reception EndPoint in Spring, and now my Gateway returns HTTP code -2 (Which doesn't exist in standard HTTP, I looked it up and this is a code from the ArduinoHTTPClient library itself [You are receiving an HTTP response code of -2, which means there was an error sending the request header1]).

Well, I tested the 4G modem and it has a signal and is connected to the mobile internet network.
I tested a test endpoint and the same thing, code -2.

#include <SoftwareSerial.h>
#include "RF24.h"

RF24 radio(7, 8);
const byte radio_address[6] = "00006";

#define TINY_GSM_MODEM_SIM7600

#define TINY_GSM_USE_WIFI false

#define GSM_PIN ""

#define UART_BAUD 115200
#define PIN_DTR 25
#define PIN_TX 3
#define PIN_RX 2
#define PWR_PIN 7

#define RESET_ATMEGA 6

SoftwareSerial SerialAT(PIN_RX, PIN_TX);

const char apn[] = "zap.vivo.com.br";
const char gprsUser[] = "vivo";
const char gprsPass[] = "vivo";

#include <TinyGsmClient.h>
#include <ArduinoHttpClient.h>

#define TINY_GSM_USE_GPRS true

TinyGsm modem(Serial);

//AWS Spring Server Host
const char server[] = "******************.compute.amazonaws.com";
const char resource[] = "/data/register";
const int port = 8080;
const char resourceTest[] = "/data/test";

const uint8_t cid = 1;

TinyGsmClient client(modem);
HttpClient http(client, server, port);

int g = 0;
bool connectedToNetwork = false;

#define TRANSMISSION_DATA_PACKAGE 5

struct __attribute__((__packed__)) Data {
  char type;  // 'D' para Data
  char key[6];
  float rms[3];
  float temperature;
} data;

struct __attribute__((__packed__)) VibrationPackage {
  char type;  // 'V' para VibrationPackage
  char key[6];
  float dataPackage[TRANSMISSION_DATA_PACKAGE];
  int start;
  int end;
} vibrationPackage;

void initGSM() {
  if (!connectedToNetwork) {

    SerialAT.print("Waiting for network...");
    if (!modem.waitForNetwork()) {
      SerialAT.println(" fail");

      delay(10000);
      return;
    }
    SerialAT.println(" success");
    connectedToNetwork = true;

    if (modem.isNetworkConnected()) {
      SerialAT.println("Network connected");
    }
  }

  if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
    SerialAT.println("fail");
    return;
  }

  g = 1;
}

void setup() {
  pinMode(RESET_ATMEGA, OUTPUT);
  digitalWrite(RESET_ATMEGA, HIGH);
  Serial.begin(115200);
  SerialAT.begin(UART_BAUD);

  pinMode(PWR_PIN, OUTPUT);

  digitalWrite(PWR_PIN, LOW);
  delay(100);
  digitalWrite(PWR_PIN, HIGH);
  delay(1000);
  digitalWrite(PWR_PIN, LOW);

  SerialAT.println("Wait...");

  delay(11000);

  SerialAT.println("Initializing modem...");
  if (!modem.init()) {
    SerialAT.println("Failed to restart modem, delaying 10s and retrying");
    return;
  }

  if (GSM_PIN && modem.getSimStatus() != 3) {
    modem.simUnlock(GSM_PIN);
  }

  if (!radio.begin()) {
    SerialAT.println(F("[ERROR] Radio hardware is not responding..."));

    while (1) {}
  }

  radio.setPALevel(RF24_PA_MAX);
  radio.setDataRate(RF24_250KBPS);
  radio.setChannel(76);
  radio.setCRCLength(RF24_CRC_16);
  radio.openReadingPipe(1, radio_address);
  radio.startListening();
}

void httpRequest(String json) {
  SerialAT.println("");
  SerialAT.println("");

  SerialAT.println("making POST request");
  SerialAT.println(json);

  http.beginRequest();

  http.sendHeader("Connection", "keep-alive");
  http.sendHeader("User-Agent", "ArduinoHttpClient");
  http.sendHeader("Accept", "*/*");
  http.sendHeader("Accept-Encoding", "gzip, deflate");
  http.sendHeader("HTTP-Version", "HTTP/1.1");
  http.sendHeader("Host", server);
  http.sendHeader("Content-Type", "application/json");
  http.sendHeader("Content-Length", json.length());

  http.post(resource);
  http.beginBody();
  http.print(json);
  http.endRequest();
  http.stop();

  int statusCode = http.responseStatusCode();
  SerialAT.print("HTTP Response Code: ");
  SerialAT.println(statusCode);
}

//unsigned long previousMillis = 0;
//const unsigned long interval = 180000;
void (*resetFunc)(void) = 0;
void loop() {

  if (g == 0)
    initGSM();

  //unsigned long currentMillis = millis();
  //if (currentMillis - previousMillis >= interval) {
  //SerialAT.println(F("Reset"));
  //resetFunc();

  //previousMillis = currentMillis;
  //}

  uint8_t pipe;
  if (radio.available(&pipe)) {
    SerialAT.println("Res ");
    SerialAT.print("Recieved ");
    int size = radio.getDynamicPayloadSize();
    SerialAT.print(size);
    SerialAT.println(" bytes on pipe");

    byte packet[size];
    radio.read(&packet, size);

    if (packet[0] == 'D') {
      memcpy(&data, &packet, sizeof(data));  //0 | Type 1-6 | Key
      String dataJson = "";

      dataJson += "{\"type\":\"";
      dataJson += data.type;
      dataJson += "\",\"key\":\"";
      dataJson += data.key;
      dataJson += "\",\"rms\":[";
      dataJson += data.rms[0];
      dataJson += ",";
      dataJson += data.rms[1];
      dataJson += ",";
      dataJson += data.rms[2];
      dataJson += "],\"temperature\":";
      dataJson += data.temperature;
      dataJson += "}";
      httpRequest(dataJson);
    } else {
      memcpy(&vibrationPackage, &packet, sizeof(vibrationPackage));
      String vibrationJson = "";

      vibrationJson += "{\"type\":\"";
      vibrationJson += vibrationPackage.type;
      vibrationJson += "\",\"key\":\"";
      vibrationJson += vibrationPackage.key;
      vibrationJson += "\",\"dataPackage\":[";

      for (int i = 0; i < TRANSMISSION_DATA_PACKAGE; i++) {
        vibrationJson += vibrationPackage.dataPackage[i];
        if (i < TRANSMISSION_DATA_PACKAGE - 1) {
          vibrationJson += ",";
        }
      }

      vibrationJson += "\",\"start\":\"";
      vibrationJson += vibrationPackage.start;
      vibrationJson += "\",\"end\":\"";
      vibrationJson += vibrationPackage.end;

      vibrationJson += "]}";
      httpRequest(vibrationJson);
    }
  }
}

enter image description here

@RestController
@RequestMapping("/data")
public class DataController {

	@Autowired
	private DataRepository repository;
	@Autowired
	private VibrationPackageRepository vibrationPackageRepository;
	@Autowired
	private ClientRepository clientRepository;
	@Autowired
	private AssetRepository assetRepository;
	@Autowired
	private ApplicationContext applicationContext;

	@PostMapping("/register")
	public ResponseEntity<String> register(@RequestBody String object) {
		System.out.println("JSON Chegou!");
		try {
			ObjectMapper objectMapper = new ObjectMapper();
			JsonNode requestBody = objectMapper.readTree(object);
			if (requestBody.has("key")) {
				String assetKey = requestBody.get("key").asText();
				Optional<Asset> assetOptional = assetRepository.findByKey(assetKey);
				if (assetOptional.isPresent()) {
					Asset asset = assetOptional.get();
					if (requestBody.has("type")) {
						String objectType = requestBody.get("type").asText();
						switch (objectType) {

						case "D":
							DataRequest dataRequest = objectMapper.treeToValue(requestBody, DataRequest.class);
							System.out.println("Objeto do tipo DataRequest: " + dataRequest.toString());
							Data data = dataRequest.getData();
							// Run FFT
							Analyzer analyzer = new Analyzer(
									asset.getDataList(),
									asset.getVibrationPackages(),
									asset,
									applicationContext
									);
							
							asset.getVibrationPackages().clear();
							data.setAsset(asset);
						
							repository.save(data);
							assetRepository.save(asset);
						break;

						case "P":
							VibrationPackageRequest vibrationPackageRequest = objectMapper.treeToValue(requestBody,
									VibrationPackageRequest.class);
							System.out.println("Objeto do tipo VibrationPackage: " + vibrationPackageRequest.toString());
							VibrationPackage vibrationPackage = vibrationPackageRequest.getVibrationPackage(asset);

							if (asset.getVibrationPackages().size() > 0) {
								if (asset.getVibrationPackages().get(0).getStart() == 0) {
									vibrationPackage.setAsset(asset);
									vibrationPackageRepository.save(vibrationPackage);
								} else {
									asset.getVibrationPackages().clear();
									assetRepository.save(asset);
								}
							} else if (vibrationPackage.getStart() == 0)
								vibrationPackageRepository.save(vibrationPackage);
	
						break;

						default:
							System.out.println("Tipo de objeto desconhecido: " + objectType);
							return ResponseEntity.badRequest().build();
						}
						
					} else {
						System.out.println("Campo 'type' não encontrado no JSON: " + requestBody);
						return ResponseEntity.badRequest().build();
					}

				}
			}

		} catch (Exception e) {
			System.out.println("JSON inválido: " + object);
			e.printStackTrace();
			return ResponseEntity.badRequest().build();
		}

		return ResponseEntity.ok().build();
	}
}

I don't know what's going on, as I said, yesterday it was working. I've made changes to the server but nothing that would result in this.

Tests on the server using Postman:

enter image description here

enter image description here

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.