Проблема с отправкой данных из ESP32 в проект Django на локальном компьютере

Я пытаюсь отправить данные с моего ESP32 на Django проект, развернутый на моем компьютере. Однако ESP32, похоже, не может получить адрес проекта Django, вот подробности:

Мой компьютер

и чип ESP32 подключены к одной и той же сети Wi-Fi. Проект Django запущен на 127.0.0.1:8000, и я пытаюсь отправить данные с ESP32 на xxx.xxx.xxx.xxx:8000/suitcase/esp32_test (где xxx.xxx.xxx.xxx - IP-адрес моего компьютера). Однако ESP32 не смог успешно передать данные на этот адрес, локальный терминал Django ничего не показал о сообщении ESP32. Я попробовал изменить адрес сервера в коде ESP32 на 127.0.0.1:8000, но это, видимо, не решило проблему. Что может быть причиной этой проблемы и как я могу ее устранить?

Код esp32:

#include <HardwareSerial.h>
#include <HTTPClient.h>
#include "WiFi.h"
#define GPSRX_PIN 16
#define GPSTX_PIN 17
#define GPS_SERIAL Serial2

const String serverAddress = "xxx.xxx.xxx.xxx:8000/suitcase/esp32_test";

void initWiFi(String ssid, String password) {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("***********Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println("WiFi connected");

  Serial.println("IP address: ");
    Serial.println(WiFi.localIP()); 
    Serial.println(WiFi.RSSI()); 
}

bool HaveUsefulData(String data){
  if(data.startsWith("$GNGLL")){
    return true;
  }else{
    return false;
  }
}

String ExtractProxy(String data){
    int commaIndex = data.indexOf(',');

    if (commaIndex != -1 && data.length() > commaIndex + 13) {

      String longitude = data.substring(commaIndex + 1, commaIndex + 10);

      String latitude = data.substring(commaIndex + 14, commaIndex + 24);


      return "{'latitude': "+ latitude +", 'longitude': "+ longitude +"}";
    }else{
      return "";
    }
}

void SendProxyToServer(String proxy){

  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin(serverAddress); 
    http.addHeader("Content-Type", "application/x-www-form-urlencoded");
    Serial.println("check2");


    int httpResponseCode = http.POST(proxy);
    if (httpResponseCode > 0) {//*********where the program cannot get in **************//
      Serial.println("check3");
      Serial.print("HTTP Response code: ");
      Serial.println(httpResponseCode);
    } else {
      Serial.print("Error code: ");
      Serial.println(httpResponseCode);
    }


    http.end();
  } else {
    Serial.println("WiFi Disconnected");
  }
};

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  GPS_SERIAL.begin(115200, SERIAL_8N1, GPSTX_PIN, GPSRX_PIN);

  const String ssid     = "Redmi K70 Pro";
  const String password = "password";
  initWiFi(ssid, password);
}

void loop() {
  static String ubxData = "";
  while (GPS_SERIAL.available()) {
          char c = GPS_SERIAL.read();
          ubxData += c;
          if (c == '\n') {

              if (HaveUsefulData(ubxData)){
                
                String ProxyJSON = ExtractProxy(ubxData);

                Serial.println(ProxyJSON);

                if(ProxyJSON != ""){
                  Serial.println("check1");
                  SendProxyToServer(ProxyJSON);
                }
                
              }

              ubxData = "";
              }
  }

}

связанный код в views.py:

@csrf_exempt
def esp32_test(request):
    if request.method == 'POST':

        longitude = request.POST.get('longitude', '')
        latitude = request.POST.get('latitude', '')


        print("Received data from ESP32:", request.POST)


        return JsonResponse({'message': 'Data received successfully'})


    return JsonResponse({'error': 'Invalid request method'})

urls.py:

urlpatterns = [
    path("esp32_test", views.esp32_test, name="esp32_test")
]

каждый раз, когда чип ESP32 отправляет запрос к Django, я получаю эту ошибку на последовательном мониторе

{'latitude': xxxxx.xxxx, 'longitude': xxxx.xxxx}
check1
check2
Error code: -1

инструкция печати "check3" не может быть запущена.

Я попытался заменить адрес моего компьютера в коде ESP32 на тестовый URL из Pipedream, и отправил сообщения с ESP32 на pipedream.com, сайт успешно получил данные с моего ESP32, при этом последовательный монитор показал:

{'latitude': xxxxx.xxxx, 'longitude': xxxx.xxxx}
check1
check2
check3
HTTP Response code: 200

Дополнительно я проверил возможность получения данных Django, используя метод POST в Postman с подходящим телом, и Django смог получить данные и распечатать их.

Я предполагаю, что эта проблема может быть связана с моей сетью, или я не могу указать правильный адрес моего проекта Django в коде ESP32, однако, я не могу найти способы решения этой проблемы.Несмотря на эти успешные тесты, я все еще озадачен вопросом, почему мой проект Django не получает данные непосредственно от ESP32 при подключении к моему компьютеру. Любые советы или предложения по дальнейшему устранению неполадок будут очень признательны!

возможно, в адресе отсутствует метод 'http'

попробуйте использовать "http://xxx.xxx.xxx.xxx:8080/suitcase/esp32_test" в качестве IP-адреса, отредактируйте ALLOWED_HOSTS = ['*'], чтобы все сети могли получить к нему доступ в settings.py и разместите проект Django на 0.0.0.0:8000, возможно, это поможет решить вопрос.

Вернуться на верх