我正在构建一个项目,我使用2个ESP8266和1个ESP32设备,在那里我用ESP8266上的传感器收集数据,并将收集到的数据发送到ESP32。然后,这个ESP32设备发送一个HTTP请求(w/HTTPClient)到我的Node.js Web服务器,接收到的数据最终将在那里处理并保存到数据库。
我有一个问题;当我使用一些模拟数据,并且只使用ESP32而不使用ESP-NOW和与其他设备的任何其他连接时,我得到状态码200,这表明我的HTTP请求已成功发送。当我使用ESP- now在ESP设备之间建立连接,而不发送任何HTTP请求时,我可以成功地发送和接收数据。
然而,当我使用ESP-NOW发送和接收数据,并使用HTTPClient请求将数据发送到ESP32上的Web服务器时,我得到状态码-1(拒绝连接)。
我还使用了无痛网格库在ESP设备之间发送/接收数据,但这给了我同样的问题。我使用wi - fi模式STA ESP32设备,连接到我的路由器连接到互联网。
不能同时使用ESP-NOW和WiFi;这是非此即彼的。例外:如果您为两个使用相同的通道(可能不可能)!
选项1
你可以在两种协议之间交替使用。因此,一旦节点1的ESP-NOW传输完成(数据完全接收),您将关闭ESP-NOW,连接到WiFi,通过MQTT发布,然后反转。不用说,当您的ESP32在WiFi上时,您无法通过ESP32 - now从节点1或节点2接收数据。
选项2
之间的网关使用某种ESP-NOW和WiFi。例如,该产品包含两个ESP32(通过UART连接),一个用于ESP-NOW,一个用于WiFi: https://thingpulse.com/product/espgateway/。免责声明:我是ThingPulse的联合创始人。
可以在同一个esp32中运行web服务器和esp_now。检查我的代码在这里https://github.com/Servayejc/esp_now_web_server服务器发送方https://github.com/Servayejc/esp_now_web_server这段代码还自动配对了esp_now的节点。这个代码是基于randomnerdtutorial…
如果你在onReceive()回调函数被调用时发送HTTP请求,你会得到一个状态码-1,因为wifi内置卡在回调执行结束之前是不可用的。另外请注意,发送方使用的WiFi通道需要与Marcel提到的接收方的WiFi通道匹配。
我已经在这里讨论过这个问题:https://github.com/m1cr0lab-esp32/esp-now-network-and-wifi-gateway/issues/6.
一个简单的解决方法是使用bool变量并在循环函数中发送HTTP请求:bool sendHTTPReq = false;
void onReceive(const uint8_t *mac_addr, const uint8_t *data, int len) {
Serial.printf("received: %3u from %02x:%02x:%02x:%02x:%02x:%02xn",
(uint8_t) *data,
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]
);
sendHTTPReq = true;
} // You can use boolean variables to trigger wifi-related events in the loop function following onReceive() call.
void loop() {
if (sendHTTPReq) {
// Send your request here
}
}
在连接到WiFi网关时配置与ESP-NOW通信的发送方和接收方的代码可在我的Github存储库中获得:https://github.com/lukalafaye/ESP-NOW-WiFi-Gateway。