Code: Select all
OS SDK ver: 1.4.0(c599790) compiled @ Feb 26 2016 11:08:14
测试过程是这样的,2片8266:
1片MAC地址为5c:cf:7f:8b:d0:64
wifi_opmode设置为STATION_MODE,实际并未连接WIFI,esp_now_role设置为ESP_NOW_ROLE_CONTROLLER
注册了RecvCb和SendCb,添加的peer地址分别为(前两个为ESP_NOW_ROLE_SLAVE,后两个为ESP_NOW_ROLE_CONTROLLER)
Code: Select all
static u8 DevMacs[][6] = {
{0x5C, 0xCF, 0x7F, 0x8B, 0x2B, 0x87},
{0x5E, 0xCF, 0x7F, 0x8B, 0x2B, 0x87},
{0x5C, 0xCF, 0x7F, 0x8B, 0xD0, 0x64},
{0x5E, 0xCF, 0x7F, 0x8B, 0xD0, 0x64},
};
wifi_channel设置为1
1片MAC地址为5c:cf:7f:8b:2b:87
wifi_opmode设置为SOFTAP_MODE,esp_now_role设置为ESP_NOW_ROLE_SLAVE
注册了RecvCb和SendCb,添加的peer地址分别为(前两个为ESP_NOW_ROLE_SLAVE,后两个为ESP_NOW_ROLE_CONTROLLER)
Code: Select all
static u8 DevMacs[][6] = {
{0x5C, 0xCF, 0x7F, 0x8B, 0x2B, 0x87},
{0x5E, 0xCF, 0x7F, 0x8B, 0x2B, 0x87},
{0x5C, 0xCF, 0x7F, 0x8B, 0xD0, 0x64},
{0x5E, 0xCF, 0x7F, 0x8B, 0xD0, 0x64},
};
实验过程如下,先给slave的板子上电,然后给controller的板子上电,观察日志,发现一个发送总是失败,接收总收不到,相关日志如下:
5c:cf:7f:8b:2b:87的日志:
OS SDK ver: 1.4.0(c599790) compiled @ Feb 26 2016 11:08:14
SDK version:1.4.0(c599790)
chipid=008B2B87:5CCF7F8B2B87
system_rtc_clock_cali_proc=0x65C8, rst:6,0
user_init over[rtc u=26071]
mode : softAP(5e:cf:7f:8b:2b:87)
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
add if1
bcn 100
esp_now_register_recv_cb ret:0.
esp_now_register_send_cb ret:0.
esp_now_set_self_role ret:0.
esp_now_add_peer 0 ret:0.
esp_now_add_peer 1 ret:0.
esp_now_add_peer 2 ret:0.
esp_now_add_peer 3 ret:0.
wifi_set_channel ret:1.
esp_now_is_peer_exist ret:1.
wifi_get_channel ret:1.
esp_now_is_peer_exist ret:1.
wifi_get_channel ret:1.
esp_now_is_peer_exist ret:1.
wifi_get_channel ret:1.
esp_now_is_peer_exist ret:1.
wifi_get_channel ret:1.
esp_now_is_peer_exist ret:1.
5c:cf:7f:8b:d0:64的日志:
OS SDK ver: 1.4.0(c599790) compiled @ Feb 26 2016 11:08:14
SDK version:1.4.0(c599790)
chipid=008BD064:5CCF7F8BD064
system_rtc_clock_cali_proc=0x5D64, rst:6,0
Awake Time:99217.17973.
user_init over
mode : sta(5c:cf:7f:8b:d0:64)
add if0
esp_now_register_recv_cb ret:0.
esp_now_register_send_cb ret:0.
esp_now_set_self_role ret:0.
esp_now_add_peer 0 ret:0.
esp_now_add_peer 1 ret:0.
esp_now_add_peer 2 ret:0.
esp_now_add_peer 3 ret:0.
wifi_set_channel ret:1.
esp_now_send[@122889] ret:0.
EspNowSendCb[@384121] 2 [5CCF7F8B2B87], s=1.
EspNowSendCb[@384211] 2 [5ECF7F8B2B87], s=1.
EspNowSendCb[@384265] 2 [5CCF7F8BD064], s=1.
EspNowSendCb[@384825] 2 [5ECF7F8BD064], s=1.
esp_now_send[@623407] ret:0.
EspNowSendCb[@884820] 2 [5CCF7F8B2B87], s=1.
EspNowSendCb[@884881] 2 [5ECF7F8B2B87], s=1.
EspNowSendCb[@884936] 2 [5CCF7F8BD064], s=1.
EspNowSendCb[@885523] 2 [5ECF7F8BD064], s=1.
esp_now_send[@1123403] ret:0.
EspNowSendCb[@1385564] 2 [5CCF7F8B2B87], s=1.
EspNowSendCb[@1385626] 2 [5ECF7F8B2B87], s=1.
EspNowSendCb[@1385682] 2 [5CCF7F8BD064], s=1.
EspNowSendCb[@1386526] 2 [5ECF7F8BD064], s=1.
5c:cf:7f:8b:2b:87的源码:
Code: Select all
#include "esp_common.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/timers.h"
#include "freertos/queue.h"
#include "lwip/sockets.h"
#include "lwip/dns.h"
#include "lwip/netdb.h"
#include "espnow.h"
#include "user_config.h"
#include "gpio.h"
#include "uart.h"
static u8 DevMacs[][6] = {
{0x5C, 0xCF, 0x7F, 0x8B, 0x2B, 0x87},
{0x5E, 0xCF, 0x7F, 0x8B, 0x2B, 0x87},
{0x5C, 0xCF, 0x7F, 0x8B, 0xD0, 0x64},
{0x5E, 0xCF, 0x7F, 0x8B, 0xD0, 0x64},
};
static u8 Key[16] = {
0x12, 0x21, 0x34, 0x43, 0x53, 0x87, 0x74, 0x95, 0x12, 0x21, 0x34, 0x43, 0x53, 0x87, 0x74, 0x95
};
ICACHE_FLASH_ATTR
void EspNowRecvCb(uint8 *mac_addr, uint8 *data, uint8 len)
{
printf("EspNowRecvCb[@%u] %uB from [%02X%02X%02X%02X%02X%02X]:%02X.\n", system_get_time(), len,
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5], data?data[0]:256);
}
ICACHE_FLASH_ATTR
void EspNowSendCb(uint8 *mac_addr, uint8 status)
{
printf("EspNowSendCb[@%u] 2 [%02X%02X%02X%02X%02X%02X], s=%u.\n", system_get_time(),
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5], status);
}
ICACHE_FLASH_ATTR
void Init(void* pArg)
{
int Ret;
u8 i=0;
Ret = esp_now_init();
if (Ret==0) {
Ret = esp_now_register_recv_cb(EspNowRecvCb);
printf("esp_now_register_recv_cb ret:%d.\n", Ret);
Ret = esp_now_register_send_cb(EspNowSendCb);
printf("esp_now_register_send_cb ret:%d.\n", Ret);
Ret = esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
printf("esp_now_set_self_role ret:%d.\n", Ret);
Ret = esp_now_add_peer(DevMacs[0], ESP_NOW_ROLE_SLAVE, 14, Key, 16);
printf("esp_now_add_peer 0 ret:%d.\n", Ret);
Ret = esp_now_add_peer(DevMacs[1], ESP_NOW_ROLE_SLAVE, 14, Key, 16);
printf("esp_now_add_peer 1 ret:%d.\n", Ret);
Ret = esp_now_add_peer(DevMacs[2], ESP_NOW_ROLE_CONTROLLER, 14, Key, 16);
printf("esp_now_add_peer 2 ret:%d.\n", Ret);
Ret = esp_now_add_peer(DevMacs[3], ESP_NOW_ROLE_CONTROLLER, 14, Key, 16);
printf("esp_now_add_peer 3 ret:%d.\n", Ret);
Ret = wifi_set_channel(1);
printf("wifi_set_channel ret:%d.\n", Ret);
while (1) {
Ret = esp_now_send(NULL, "Hello EspNow!", 13);
printf("esp_now_send[@%u] ret:%d.\n", system_get_time(), Ret);
vTaskDelay(1000/portTICK_RATE_MS);
}
} else {
printf("Failed[%d] to esp_now_init.\n", Ret);
}
vTaskDelay(30000/portTICK_RATE_MS);
printf("Thread Over.\n");
}
ICACHE_FLASH_ATTR
void user_init(void)
{
TCP_WND = 2*TCP_MSS;
struct rst_info *pInfo = system_get_rst_info();
u8 Mac[6] = {0};
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_UART1_TXD_BK);
UART_SetBaudrate(UART0, BIT_RATE_115200);
UART_SetPrintPort(UART0);
wifi_get_macaddr(STATION_IF, Mac);
printf("SDK version:%s\nchipid=%08X:%02X%02X%02X%02X%02X%02X\nsystem_rtc_clock_cali_proc=0x%X, rst:%u,%u\n",
system_get_sdk_version(),
system_get_chip_id(), Mac[0], Mac[1], Mac[2], Mac[3], Mac[4], Mac[5],
system_rtc_clock_cali_proc(),
pInfo->reason, pInfo->exccause);
system_update_cpu_freq(SYS_CPU_160MHZ);
printf("Awake Time:%u.%u.\n", system_get_time(), system_get_rtc_time());
wifi_set_opmode(STATION_MODE);
xTaskCreate(Init, (signed char*)"Init", 512, NULL, 9, NULL);
printf("user_init over\n");
}
5c:cf:7f:8b:d0:64的源码:
[code
#include "esp_common.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/timers.h"
#include "freertos/queue.h"
#include "lwip/sockets.h"
#include "lwip/dns.h"
#include "lwip/netdb.h"
#include "espnow.h"
#include "user_config.h"
#include "gpio.h"
#include "uart.h"
static u8 DevMacs[][6] = {
{0x5C, 0xCF, 0x7F, 0x8B, 0x2B, 0x87},
{0x5E, 0xCF, 0x7F, 0x8B, 0x2B, 0x87},
{0x5C, 0xCF, 0x7F, 0x8B, 0xD0, 0x64},
{0x5E, 0xCF, 0x7F, 0x8B, 0xD0, 0x64},
};
static u8 Key[16] = {
0x12, 0x21, 0x34, 0x43, 0x53, 0x87, 0x74, 0x95, 0x12, 0x21, 0x34, 0x43, 0x53, 0x87, 0x74, 0x95
};
ICACHE_FLASH_ATTR
void EspNowRecvCb(uint8 *mac_addr, uint8 *data, uint8 len)
{
printf("EspNowRecvCb[@%u] %uB from [%02X%02X%02X%02X%02X%02X]:%02X.\n", system_get_time(), len,
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5], data?data[0]:256);
}
ICACHE_FLASH_ATTR
void EspNowSendCb(uint8 *mac_addr, uint8 status)
{
printf("EspNowSendCb[@%u] 2 [%02X%02X%02X%02X%02X%02X], s=%u.\n", system_get_time(),
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5], status);
}
ICACHE_FLASH_ATTR
void Init(void* pArg)
{
int Ret;
u8 i=0;
Ret = esp_now_init();
if (Ret==0) {
Ret = esp_now_register_recv_cb(EspNowRecvCb);
printf("esp_now_register_recv_cb ret:%d.\n", Ret);
Ret = esp_now_register_send_cb(EspNowSendCb);
printf("esp_now_register_send_cb ret:%d.\n", Ret);
Ret = esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
printf("esp_now_set_self_role ret:%d.\n", Ret);
Ret = esp_now_add_peer(DevMacs[0], ESP_NOW_ROLE_SLAVE, 14, Key, 16);
printf("esp_now_add_peer 0 ret:%d.\n", Ret);
Ret = esp_now_add_peer(DevMacs[1], ESP_NOW_ROLE_SLAVE, 14, Key, 16);
printf("esp_now_add_peer 1 ret:%d.\n", Ret);
Ret = esp_now_add_peer(DevMacs[2], ESP_NOW_ROLE_CONTROLLER, 14, Key, 16);
printf("esp_now_add_peer 2 ret:%d.\n", Ret);
Ret = esp_now_add_peer(DevMacs[3], ESP_NOW_ROLE_CONTROLLER, 14, Key, 16);
printf("esp_now_add_peer 3 ret:%d.\n", Ret);
Ret = wifi_set_channel(1);
printf("wifi_set_channel ret:%d.\n", Ret);
while (1) {
Ret = esp_now_is_peer_exist(DevMacs[2]);
printf("esp_now_is_peer_exist ret:%d.\n", Ret);
Ret = wifi_get_channel();
printf("wifi_get_channel ret:%d.\n", Ret);
vTaskDelay(3000/portTICK_RATE_MS);
}
} else {
printf("Failed[%d] to esp_now_init.\n", Ret);
}
printf("Thread Over.\n");
}
void ICACHE_FLASH_ATTR
user_init(void)
{
TCP_WND = 2*TCP_MSS;
struct rst_info *pInfo = system_get_rst_info();
u8 Mac[6] = {0};
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_UART1_TXD_BK);
UART_SetBaudrate(UART1, BIT_RATE_115200);
UART_SetPrintPort(UART1);
wifi_get_macaddr(STATION_IF, Mac);
printf("SDK version:%s\nchipid=%08X:%02X%02X%02X%02X%02X%02X\nsystem_rtc_clock_cali_proc=0x%X, rst:%u,%u\n",
system_get_sdk_version(),
system_get_chip_id(), Mac[0], Mac[1], Mac[2], Mac[3], Mac[4], Mac[5],
system_rtc_clock_cali_proc(),
pInfo->reason, pInfo->exccause);
system_update_cpu_freq(SYS_CPU_160MHZ);
wifi_set_opmode(SOFTAP_MODE);
xTaskCreate(Init, (signed char*)"Init", 512, NULL, 9, NULL);
printf("user_init over[rtc u=%u]\n", system_rtc_clock_cali_proc());
}
[/code]