蓝牙遥控器:ESP-BLE-MESH关闭重放攻击检测

文章讨论了在BLE-MESH网络中遇到的重播错误,其中seq值的比较导致服务端报错。由于存在多个Provisioner,src地址相同,导致问题。提出的解决方案包括发射端同步seq值和关闭接收端的seq检测。后者通过修改ESP-IDF源代码实现,注释掉特定的重播检查部分。
摘要由CSDN通过智能技术生成
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);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值