蓝牙遥控器: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);
    }
}