从 ESP32 向本地计算机上的 Django 项目发送数据时出现问题

问题描述 投票:0回答:1

我正在尝试将数据从 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”打印指令。

我尝试用 Pipedream 的测试 URL 替换 ESP32 代码中我的计算机地址,并从 ESP32 向 Pipedream.com 发送消息,该网站成功接收了来自我的 ESP32 的数据,在这种情况下,串行监视器显示:

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

另外,我在Postman中使用合适的body的POST方法测试了Django的接收能力,Django也能够接收数据并打印出来。

我认为这个问题可能与我的网络有关,或者我无法在 ESP32 代码中给出我的 Django 项目的正确地址,但是,我找不到解决问题的方法。尽管这些成功的测试,我仍然感到困惑为什么我的 Django 项目在连接到我的计算机时没有直接从 ESP32 接收数据。任何有关如何进一步解决此问题的建议或建议将不胜感激!

django networking connection httpresponse esp32
1个回答
0
投票

也许该地址中缺少“http”方法

尝试使用“http://xxx.xxx.xxx.xxx:8080/suitcase/esp32_test”作为IP地址,编辑

ALLOWED_HOSTS = ['*']
让所有网络都可以在settings.py中访问它并在0.0.0上托管Django项目.0.0:8000 可能有助于解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.