Проблема с отправкой данных из 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, возможно, это поможет решить вопрос.