蓝牙遥控器:ESP-BLE-MESH关闭重放攻击检测
Replay: src 0x0001 dst 0xc110 seq 0x00004f
LOG报这个错,是因为从seq的值小于或等于接收端记录的值,所以接收端(服务端)报这个错。但是我做的是多对多遥控,发射端(客户端)也是Provisioner,所以BLE-MESH网络中存在多个Provisioner,并且src的值是一样的。客户端模型还不能随机指定src的地址值。
解决办法:
1:发射端同步seq值。不太容易实现。
2:关闭接收端的seq检测,ESP-IDF没有提供关闭seq检测的接口,没办法只能自己修改:
esp-idf\components\bt\esp_ble_mesh\mesh_core\transport.c
static int trans_unseg(struct net_buf_simple *buf, struct bt_mesh_net_rx *rx,
uint64_t *seq_auth)
{
uint8_t hdr = 0U;
BT_DBG("AFK %u AID 0x%02x", AKF(buf->data), AID(buf->data));
if (buf->len < 1) {
BT_ERR("Too small unsegmented PDU");
return -EINVAL;
}
// 这里注释上就可以了
// if (bt_mesh_rpl_check(rx, NULL)) {
// BT_WARN("Replay2: src 0x%04x dst 0x%04x seq 0x%06x",
// rx->ctx.addr, rx->ctx.recv_dst, rx->seq);
// return -EINVAL;
// }
hdr = net_buf_simple_pull_u8(buf);
if (rx->ctl) {
return ctl_recv(rx, hdr, buf, seq_auth);
} else {
/* SDUs must match a local element or an LPN of this Friend. */
if (!rx->local_match && !rx->friend_match) {
return 0;
}
return sdu_recv(rx, rx->seq, hdr, 0, buf);
}
}