我正在尝试将数据从 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 接收数据。任何有关如何进一步解决此问题的建议或建议将不胜感激!
也许该地址中缺少“http”方法
尝试使用“http://xxx.xxx.xxx.xxx:8080/suitcase/esp32_test”作为IP地址,编辑
ALLOWED_HOSTS = ['*']
让所有网络都可以在settings.py中访问它并在0.0.0上托管Django项目.0.0:8000 可能有助于解决问题。