日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ESP32的ESP-NOW通訊踩坑記

機(jī)智云 ? 2025-09-13 10:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1、背景

前段時(shí)間看到樂鑫推出了一種很有意思的Wi-Fi通訊協(xié)議,它允許設(shè)備在連接的時(shí)候進(jìn)行直接通訊。

樂鑫對它的概述如下:

ESP-NOW是一種由樂鑫公司定義的無連接Wi-Fi通信協(xié)議。在ESP-NOW中,應(yīng)用程序數(shù)據(jù)被封裝在各個(gè)供應(yīng)商的動(dòng)作幀中,然后在無連接的情況下,從一個(gè)Wi-Fi設(shè)備傳輸?shù)搅硪粋€(gè) Wi-Fi 設(shè)備。

感覺很有意思,于是找了樂鑫IDF提供的demo進(jìn)行驗(yàn)證。這里用到的demo在IDF的路徑為:esp-idf/examples/wifi/espnow。

找來幾個(gè)ESP32-C3模組,燒錄完之后,確實(shí)在沒有連接路由器的情況下可以進(jìn)行直接通訊。

2、例程改造

通過運(yùn)行demo:esp-idf/examples/wifi/espnow發(fā)現(xiàn)這個(gè)Demo有點(diǎn)不足的地方是沒有連接路由器,那么我在想,有沒有可能在既連接路由器的情況下,又可以直接與其他沒有連接路由器的設(shè)備進(jìn)行通訊呢?

那么我的想法如下圖

e1fdfc06-9045-11f0-8ce9-92fbcf53809c.png

在上面這里,A設(shè)備既連接路由器也直接與B/C/D三個(gè)設(shè)備基于ESP_NOW進(jìn)行直接通訊。

這里我讓A設(shè)備工作在STA+AP模式下,其中STA用于連接路由,AP用于ESP_NOW進(jìn)行通訊。基于此設(shè)想,我還專門問了deepSeek,它也給出了方案可行的確定回答;e218362a-9045-11f0-8ce9-92fbcf53809c.png

于是開開心心的寫了代碼,其中Wi-Fi和ESP_NOW的初始化程序如下,然后分別替換esp-idf/examples/wifi/espnow這里的初始化;

  • Wi-Fi的初始化如下

#defineESP_AP_CHANNEL 6// 固定使用信道6
staticvoidexample_wifi_init(void)
{
wifi_config_twifi_config = {
.sta = {
.ssid ="xLogMonitor",
.password ="1234567890",
},
};
// 配置AP模式參數(shù) - 關(guān)鍵部分!
wifi_config_tap_config = {
.ap = {
.ssid ="", // 空SSID,不廣播
.ssid_len =0,
.channel = ESP_AP_CHANNEL,// 這是我們真正關(guān)心的參數(shù)
.authmode = WIFI_AUTH_OPEN,
.max_connection =0, // 不允許任何站連接
},
};

ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();
esp_netif_t*ap_netif = esp_netif_create_default_wifi_ap();
wifi_init_config_tcfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,
&event_handler,
NULL,
&instance_any_id));
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
IP_EVENT_STA_GOT_IP,
&event_handler,
NULL,
&instance_got_ip));
ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_APSTA) );
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &ap_config));
ESP_ERROR_CHECK( esp_wifi_start());
// ESP_ERROR_CHECK( esp_wifi_set_channel(CONFIG_ESPNOW_CHANNEL, WIFI_SECOND_CHAN_NONE));

#ifCONFIG_ESPNOW_ENABLE_LONG_RANGE
ESP_ERROR_CHECK( esp_wifi_set_protocol(ESPNOW_WIFI_IF, WIFI_PROTOCOL_11B|WIFI_PROTOCOL_11G|WIFI_PROTOCOL_11N|WIFI_PROTOCOL_LR) );
#endif

}

  • ESP_NOW的初始化如下

staticesp_err_texample_espnow_init(void)
{
example_espnow_send_param_t*send_param;

s_example_espnow_queue = xQueueCreate(ESPNOW_QUEUE_SIZE,sizeof(example_espnow_event_t));
if(s_example_espnow_queue ==NULL) {
ESP_LOGE(TAG,"Create mutex fail");
returnESP_FAIL;
}

/* Initialize ESPNOW and register sending and receiving callback function. */
ESP_ERROR_CHECK( esp_now_init() );
ESP_ERROR_CHECK( esp_now_register_send_cb(example_espnow_send_cb) );
ESP_ERROR_CHECK( esp_now_register_recv_cb(example_espnow_recv_cb) );

/* Set primary master key. */
ESP_ERROR_CHECK( esp_now_set_pmk((uint8_t*)CONFIG_ESPNOW_PMK) );

/* Add broadcast peer information to peer list. */
esp_now_peer_info_t*peer =malloc(sizeof(esp_now_peer_info_t));
if(peer ==NULL) {
ESP_LOGE(TAG,"Malloc peer information fail");
vSemaphoreDelete(s_example_espnow_queue);
esp_now_deinit();
returnESP_FAIL;
}
memset(peer,0,sizeof(esp_now_peer_info_t));
peer->channel = ESP_AP_CHANNEL;
peer->ifidx = ESP_IF_WIFI_AP;
peer->encrypt =false;
memcpy(peer->peer_addr, s_example_broadcast_mac, ESP_NOW_ETH_ALEN);
ESP_ERROR_CHECK( esp_now_add_peer(peer) );
free(peer);

/* Initialize sending parameters. */
send_param =malloc(sizeof(example_espnow_send_param_t));
if(send_param ==NULL) {
ESP_LOGE(TAG,"Malloc send parameter fail");
vSemaphoreDelete(s_example_espnow_queue);
esp_now_deinit();
returnESP_FAIL;
}
memset(send_param,0,sizeof(example_espnow_send_param_t));
send_param->unicast =false;
send_param->broadcast =true;
send_param->state =0;
send_param->magic = esp_random();
send_param->count = CONFIG_ESPNOW_SEND_COUNT;
send_param->delay = CONFIG_ESPNOW_SEND_DELAY;
send_param->len = CONFIG_ESPNOW_SEND_LEN;
send_param->buffer =malloc(CONFIG_ESPNOW_SEND_LEN);
if(send_param->buffer ==NULL) {
ESP_LOGE(TAG,"Malloc send buffer fail");
free(send_param);
vSemaphoreDelete(s_example_espnow_queue);
esp_now_deinit();
returnESP_FAIL;
}
memcpy(send_param->dest_mac, s_example_broadcast_mac, ESP_NOW_ETH_ALEN);
example_espnow_data_prepare(send_param);

xTaskCreate(example_espnow_task,"example_espnow_task",2048, send_param,4,NULL);

returnESP_OK;
}

程序跑起來了,確實(shí)也是符合我的預(yù)期,A設(shè)備連接上了路由器,然后同時(shí)也和BCD進(jìn)行了通訊,感覺一切都很完美,如果不出意外的話就好出意外了;

3、問題出現(xiàn)了

在當(dāng)我為改造例程的成功而高興的時(shí)候,問題出現(xiàn)了。我換了一個(gè)路由器,發(fā)現(xiàn)通訊失敗了。esp_send出現(xiàn)了如下錯(cuò)誤:

E (12554) ESPNOW: Peer channel is not equal to the home channel, send fail!

這下懵逼了,為啥換個(gè)路由器就不行,難道這協(xié)議還和路由器有關(guān)系,樂鑫的官方文檔也沒提到呀~

樂鑫文檔:https://docs.espressif.com/projects/esp-idf/zh_CN/v4.4.6/esp32c3/api-reference/network/esp_now.html?highlight=esp_now_init#

4、問題分析

從錯(cuò)誤的日志上來看這個(gè)錯(cuò)誤指的是Peer channel和home channel,不一致導(dǎo)致的。

這里Peer指的應(yīng)該是要發(fā)送的對端通道,home應(yīng)該指的是本身;

但是這兩個(gè)地方我在配置的時(shí)候都是指定了#defineESP_AP_CHANNEL 6 // 固定使用信道6這個(gè)通道為啥還會(huì)出現(xiàn)這個(gè)錯(cuò)誤呢?

后續(xù)我繼續(xù)運(yùn)行多幾次,發(fā)現(xiàn)只有在A設(shè)備連接上網(wǎng)絡(luò)之后才會(huì)出現(xiàn)這個(gè)錯(cuò)誤。

難道是連接路由器之后A設(shè)備的信道發(fā)生了變化?經(jīng)過查閱資料得知,確實(shí)是這樣的,STA設(shè)備在連接路由器之后,設(shè)備的Wi-Fi信道是由路由器決定的,所以當(dāng)路由器分配的信道和#defineESP_AP_CHANNEL 6不一致的時(shí)候就會(huì)出現(xiàn)問題了。

于是我在esp_now_send之前打印了設(shè)備當(dāng)前的信道信息,獲取到信息如下

I (12554) sta_ap_espnow: STA連接信息: SSID=xLogMonitor, 信道=8, RSSI=-61
I (12554) sta_ap_espnow: 當(dāng)前工作信道: 8
E (12554) ESPNOW: Peer channel is not equal to the home channel, send fail!
E (12564) sta_ap_espnow: ESP-NOW數(shù)據(jù)發(fā)送失敗: 0x3066

理論和實(shí)驗(yàn)結(jié)果一致,當(dāng)設(shè)備連接之后信道變?yōu)榱?。

于是想要解決當(dāng)前這個(gè)問題也很簡單了,只需要把所有的ESP_NOW的設(shè)備改成和所要連接的路由器同個(gè)信道8即可。

結(jié)果證實(shí)了,當(dāng)信道改為8之后所有設(shè)備通訊就正常了;

5、總結(jié)

雖然我們知道了問題,也解決了問題。但是樂鑫文檔在描述這一塊時(shí)也沒著重,導(dǎo)致當(dāng)時(shí)看文檔也沒特別留意。e2267b86-9045-11f0-8ce9-92fbcf53809c.png

ESP32-C3的STA+AP模式,在STA連接完路由器之后,AP模式指定的信道并不能作為ESP_NOW通訊;

如果設(shè)備需要連接路由器,需要提前知道連接的路由器信道再給其他設(shè)備指定一個(gè)統(tǒng)一的信道才能進(jìn)行ESP_NOW進(jìn)行通訊。這個(gè)在后續(xù)的產(chǎn)品落地確實(shí)是一個(gè)問題,需要看看如何優(yōu)化

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 通訊
    +關(guān)注

    關(guān)注

    9

    文章

    952

    瀏覽量

    36646
  • ESP
    ESP
    +關(guān)注

    關(guān)注

    0

    文章

    198

    瀏覽量

    36745
  • ESP32
    +關(guān)注

    關(guān)注

    27

    文章

    1226

    瀏覽量

    22438
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    ESP32S2喚醒后無法收到另外一個(gè)機(jī)子發(fā)送的ESP-NOW的數(shù)據(jù),為什么?

    軟件版本IDF-4.4, 硬件ESP32S2 程序先初始化ESP-NOW, 啟動(dòng)定時(shí)light-sleep, 喚醒后無法收到另外一個(gè)機(jī)子發(fā)送的ESP-NOW的數(shù)據(jù), 確定有喚醒,因?yàn)樵趩拘押蟠蛴≥敵隽?/div>
    發(fā)表于 06-21 08:01

    使用ESP32-C3的藍(lán)牙進(jìn)行傳感器數(shù)據(jù)上傳,ESP-NOW協(xié)議的功耗能滿足需求嗎?

    1.使用ESP32-C3的藍(lán)牙進(jìn)行傳感器數(shù)據(jù)上傳,期望使用紐扣電池供電,ESP-NOW協(xié)議的功耗能滿足需求嗎 2.使用ESP-now協(xié)議的設(shè)備能否和手機(jī)藍(lán)牙或其他未使用ESP-NOW協(xié)
    發(fā)表于 07-01 07:22

    ESP32CAM解決指南,已反映商家

    中國香河英茂科工沒有一個(gè)鴨蛋是白吃的,沒有一分錢融資是百花的,都轉(zhuǎn)化為科技成果----ESP32CAM解決指南,已反映商家 https://user.qzone.qq.com/
    發(fā)表于 02-03 22:23

    ESP-NOW喚醒無法接收數(shù)據(jù)是怎么回事?

    軟件版本IDF-4.4, 硬件ESP32S2程序先初始化ESP-NOW,啟動(dòng)定時(shí)light-sleep, 喚醒后無法收到另外一個(gè)機(jī)子發(fā)送的ESP-NOW的數(shù)據(jù),確定有喚醒,因?yàn)樵趩拘押蟠蛴≥敵隽?/div>
    發(fā)表于 02-20 07:37

    如何使用ESP-Now協(xié)議連接ESP32ESP8266來控制LED?

    我構(gòu)建了一個(gè)簡單的項(xiàng)目,展示了如何使用 ESP-Now 協(xié)議連接 ESP32ESP8266 來控制 LED。
    發(fā)表于 05-22 08:34

    ESP-NOW技術(shù)的介紹和使用方式及示例代碼資料免費(fèi)下載

    本文介紹了樂鑫自主研發(fā)的ESP-NOW技術(shù),說明了使用方式并提供了示例代碼包括了:1.ESP-NOW技術(shù)簡介,2.ESP-NOW使用方式,3.示例代碼
    發(fā)表于 03-15 08:00 ?59次下載
    <b class='flag-5'>ESP-NOW</b>技術(shù)的介紹和使用方式及示例代碼資料免費(fèi)下載

    一款基于ESP32的對講機(jī)傳輸音頻介紹

    這是一款基于ESP32的對講機(jī)。它使用UDP廣播或ESP-NOW傳輸音頻。
    的頭像 發(fā)表于 04-29 09:04 ?3w次閱讀
    一款基于<b class='flag-5'>ESP32</b>的對講機(jī)傳輸音頻介紹

    Arduino-IDE配置ESP32-CAM開發(fā)環(huán)境過的那些

    Arduino-IDE配置ESP32-CAM開發(fā)環(huán)境過的那些
    發(fā)表于 11-30 18:36 ?24次下載
    Arduino-IDE配置<b class='flag-5'>ESP32</b>-CAM開發(fā)環(huán)境<b class='flag-5'>踩</b>過的那些<b class='flag-5'>坑</b>

    ESP-32開發(fā)歷程(三)ESP-IDF 定時(shí)器使用

    ESP-32開發(fā)歷程(三)ESP-IDF 定時(shí)器使用前言一、開發(fā)基礎(chǔ)二、定時(shí)器使用1.官方描述2.讀入數(shù)據(jù)總結(jié)ESP-32開發(fā)
    發(fā)表于 12-08 12:06 ?13次下載
    <b class='flag-5'>ESP</b>-32開發(fā)<b class='flag-5'>踩</b><b class='flag-5'>坑</b>歷程(三)<b class='flag-5'>ESP</b>-IDF 定時(shí)器使用

    ESP8266相互通訊ESP-NOW

    辦法,可以用一個(gè)ESP8266模塊作為一個(gè)總的控制,就像一個(gè)管家,來和其他ESP8266通訊,來實(shí)現(xiàn)我們想要的功能。先說一下ESP-NOW,它是Espressif開發(fā)的一種協(xié)議,它使多
    發(fā)表于 12-29 19:33 ?10次下載
    <b class='flag-5'>ESP</b>8266相互<b class='flag-5'>通訊</b>(<b class='flag-5'>ESP-NOW</b>)

    ESP-NOW無線通信之ESP32學(xué)習(xí)之旅-Arduino版

    、WiFi、LoRa、NB-IoT等,本教程將重點(diǎn)介紹樂鑫科技開發(fā)的另一種無線通訊協(xié)議:ESP-NOW,通過 本教程的學(xué)習(xí),你將了解到如何將 ESP-NOW 技術(shù)應(yīng)用到我們的 DIY 項(xiàng)目中。
    發(fā)表于 05-30 09:55 ?0次下載
    <b class='flag-5'>ESP-NOW</b>無線通信之<b class='flag-5'>ESP32</b>學(xué)習(xí)之旅-Arduino版

    樂鑫低功耗方案 | ESP-NOW

    在日益發(fā)展的物聯(lián)網(wǎng)世界中,無線通信已成為互聯(lián)各種設(shè)備和系統(tǒng)的關(guān)鍵技術(shù)。在智能家居、工業(yè)自動(dòng)化、醫(yī)療衛(wèi)生、城市公共設(shè)施等領(lǐng)域,無線通信是解決這些問題的關(guān)鍵。在此方面,樂鑫推出了“ESP-NOW
    的頭像 發(fā)表于 10-21 08:03 ?3960次閱讀
    樂鑫低功耗方案 | <b class='flag-5'>ESP-NOW</b>

    ESP32/ESP8266開發(fā)板單向一對多ESP-NOW無線通信

    通過ESP-NOW無線通信協(xié)議實(shí)現(xiàn)ESP32開發(fā)板向多個(gè)ESP32/ESP 8266開發(fā)板發(fā)送數(shù)據(jù)。
    的頭像 發(fā)表于 03-13 09:23 ?319次閱讀
    <b class='flag-5'>ESP32</b>/<b class='flag-5'>ESP</b>8266開發(fā)板單向一對多<b class='flag-5'>ESP-NOW</b>無線通信

    ESP32開發(fā)板單向點(diǎn)對點(diǎn)ESP-NOW無線通信

    本例程通過兩個(gè)ESP32開發(fā)板實(shí)現(xiàn)單向點(diǎn)對點(diǎn)ESP-NOW無線通信,一個(gè)ESP32開發(fā)板作為Sender發(fā)送方,另一個(gè)開發(fā)板作為Receiver接收方接收發(fā)送方的數(shù)據(jù)。
    的頭像 發(fā)表于 03-19 09:21 ?336次閱讀
    <b class='flag-5'>ESP32</b>開發(fā)板單向點(diǎn)對點(diǎn)<b class='flag-5'>ESP-NOW</b>無線通信

    ESP32/ESP8266開發(fā)板單向多對一ESP-NOW無線通信

    本實(shí)驗(yàn)通過ESP-NOW無線通信協(xié)議實(shí)現(xiàn)多個(gè)ESP32/ESP 8266開發(fā)板向ESP32開發(fā)板發(fā)送數(shù)據(jù)。例如可以應(yīng)用于從多個(gè)遠(yuǎn)程傳感器上收集數(shù)據(jù)。
    的頭像 發(fā)表于 03-30 10:14 ?214次閱讀
    <b class='flag-5'>ESP32</b>/<b class='flag-5'>ESP</b>8266開發(fā)板單向多對一<b class='flag-5'>ESP-NOW</b>無線通信
    靖西县| 奎屯市| 通许县| 正镶白旗| 南木林县| 株洲县| 稷山县| 榆林市| 化隆| 洛阳市| 宁乡县| 钟祥市| 云林县| 沽源县| 喜德县| 缙云县| 绍兴县| 肇东市| 繁昌县| 比如县| 米脂县| 鄂温| 固原市| 修文县| 友谊县| 通渭县| 南充市| 靖江市| 治多县| 民县| 平顶山市| 明水县| 淄博市| 元谋县| 盈江县| 禹城市| 翁牛特旗| 桦川县| 久治县| 嘉鱼县| 定远县|