最近需要验证开发一下meshv1.1功能,因此想采用bluez5.68作为配网者,nrf5340作为node入网,但是入网遇到了问题,手机入网我自己选择no oob是没问题的,但是bluez和nrf5340配网遇到了问题,最后发现是配网者采用了input oob的方式,想问问要如何解决这个问题,如何选择oob的方式?
bluez log如下:
[meshctl]# discover-unprovisioned on
SetDiscoveryFilter success
Discovery started
Adapter property changed
[CHG] Controller 8C:88:4B:65:AB:B2 Discovering: yes
Mesh Provisioning Service (00001827-0000-1000-8000-00805f9b34fb)
Device UUID: 050bf688c7594194baf4097738a66e6b
OOB: 0000
[NEW] Device DC:E8:12:90:E6😃8 Mesh Light
[meshctl]# provision 050bf688c7594194baf4097738a66e6b
Trying to connect Device DC:E8:12:90:E6😃8 Mesh Light
Adapter property changed
[CHG] Controller 8C:88:4B:65:AB:B2 Discovering: no
Connection successful
Service added /org/bluez/hci0/dev_DC_E8_12_90_E6_D8/service0001
Service added /org/bluez/hci0/dev_DC_E8_12_90_E6_D8/service0010
Char added /org/bluez/hci0/dev_DC_E8_12_90_E6_D8/service0010/char0011:
Char added /org/bluez/hci0/dev_DC_E8_12_90_E6_D8/service0010/char0013:
Services resolved yes
Found matching char: path /org/bluez/hci0/dev_DC_E8_12_90_E6_D8/service0010/char0011, uuid 00002adb-0000-1000-8000-00805f9b34fb
Found matching char: path /org/bluez/hci0/dev_DC_E8_12_90_E6_D8/service0010/char0013, uuid 00002adc-0000-1000-8000-00805f9b34fb
Start notification on /org/bluez/hci0/dev_DC_E8_12_90_E6_D8/service0010/char0013
Characteristic property changed /org/bluez/hci0/dev_DC_E8_12_90_E6_D8/service0010/char0013
AcquireNotify success: fd 7 MTU 33
Notify for Mesh Provisioning Out Data started
Open-Node: 0x5643ecedaf50
Open-Prov: 0x5643ecee4110
Open-Prov: proxy 0x5643eced2260
Initiated provisioning
Characteristic property changed /org/bluez/hci0/dev_DC_E8_12_90_E6_D8/service0010/char0011
AcquireWrite success: fd 8 MTU 33
GATT-TX: 03 00 10
GATT-RX: 03 01 04 00 01 00 00 01 00 19 01 00 01
Got provisioning data (12 bytes)
01 04 00 01 00 00 01 00 19 01 00 01
GATT-TX: 03 02 00 00 03 00 01
GATT-TX: 03 03 29 8b 08 94 ea 99 c5 e7 2c b2 ef bd 84 71
GATT-TX: e6 f2 26 c7 9c d6 15 8b 52 dc 66 cf dc e0 34 b1
GATT-TX: a5 47 46 f5 4f e0 cb c6 14 06 8e e8 fb 7f 20 8b
GATT-TX: 7b 65 60 43 77 37 2c 7c 08 40 35 94 b4 92 6f 9e
GATT-TX: 01 5c
GATT-RX: 43 03 cc 3f a6 78 f2 30 0e 93 0a 2e 26 51 d8 82
GATT-RX: a9 8e 76 63 e0 a8 11 7d df 8f 3c 47 b2 92
GATT-RX: 83 15 17 db 9f 9c 14 6d 57 76 d7 79 9d 3f 29 54
GATT-RX: d1 1a 62 66 96 2b 54 2b da a3 98 c4 33 c6
GATT-RX: c3 db 78 b4 bb 2f 89 d0
Got provisioning data (65 bytes)
03 cc 3f a6 78 f2 30 0e 93 0a 2e 26 51 d8 82 a9
8e 76 63 e0 a8 11 7d df 8f 3c 47 b2 92 15 17 db
9f 9c 14 6d 57 76 d7 79 9d 3f 29 54 d1 1a 62 66
96 2b 54 2b da a3 98 c4 33 c6 db 78 b4 bb 2f 89
d0
Agent String: Push 8 on device
抓包信息如下

这个在入网前的配置是可以设置oob方式 ,你看看provisioner端 代码

    Wireless-Tech 已解决 配网前在meshctl命令端使用 security 0命令选择no oob mothod即可

    HHH555J 除了这个改动还改了nordic的一些配网代码,强制取消其他oob认证模式,不知道有没有大佬知道还可以在哪里设置,这个函数中注释的就是我修改的,都改成0,这样就没有其他认证模式给配网者选了?

    `static void prov_invite(const uint8_t *data)
    {
    printk("prov_invite\n");
    PROV_BUF(buf, PDU_LEN_CAPABILITIES);

    LOG_DBG("Attention Duration: %u seconds", data[0]);
    
    if (data[0]) {
    	bt_mesh_attention(NULL, data[0]);
    }
    
    memcpy(bt_mesh_prov_link.conf_inputs.invite, data, PDU_LEN_INVITE);
    
    bt_mesh_prov_buf_init(&buf, PROV_CAPABILITIES);
    
    /* Number of Elements supported */
    net_buf_simple_add_u8(&buf, bt_mesh_elem_count());
    
    uint16_t algorithm_bm = 0;
    uint8_t oob_type = bt_mesh_prov->static_val ?
    		BT_MESH_STATIC_OOB_AVAILABLE : 0;
    // uint8_t oob_type = 0;
    bool oob_availability = bt_mesh_prov->output_size > 0 ||
    		bt_mesh_prov->input_size > 0 || bt_mesh_prov->static_val;
    // bool oob_availability = 0;
    if (IS_ENABLED(CONFIG_BT_MESH_ECDH_P256_HMAC_SHA256_AES_CCM)) {
    	WRITE_BIT(algorithm_bm, BT_MESH_PROV_AUTH_HMAC_SHA256_AES_CCM, 1);
    }
    
    if (IS_ENABLED(CONFIG_BT_MESH_ECDH_P256_CMAC_AES128_AES_CCM)) {
    	WRITE_BIT(algorithm_bm, BT_MESH_PROV_AUTH_CMAC_AES128_AES_CCM, 1);
    }
    
    if (oob_availability && IS_ENABLED(CONFIG_BT_MESH_OOB_AUTH_REQUIRED)) {
    	oob_type |= BT_MESH_OOB_AUTH_REQUIRED;
    	WRITE_BIT(algorithm_bm, BT_MESH_PROV_AUTH_CMAC_AES128_AES_CCM, 0);
    }
    
    /* Supported algorithms */
    net_buf_simple_add_be16(&buf, algorithm_bm);
    
    /* Public Key Type */
    net_buf_simple_add_u8(&buf,
    		      bt_mesh_prov->public_key_be == NULL ? PUB_KEY_NO_OOB : PUB_KEY_OOB);
    // net_buf_simple_add_u8(&buf,
    		    //   PUB_KEY_NO_OOB);
    /* Static OOB Type */
    net_buf_simple_add_u8(&buf, oob_type);
    // net_buf_simple_add_u8(&buf, 0);
    
    /* Output OOB Size */
    net_buf_simple_add_u8(&buf, bt_mesh_prov->output_size);
    // net_buf_simple_add_u8(&buf, 0);
    /* Output OOB Action */
    net_buf_simple_add_be16(&buf, bt_mesh_prov->output_actions);
    // net_buf_simple_add_be16(&buf, 0);
    /* Input OOB Size */
    net_buf_simple_add_u8(&buf, bt_mesh_prov->input_size);
    // net_buf_simple_add_u8(&buf, 0);
    /* Input OOB Action */
    net_buf_simple_add_be16(&buf, bt_mesh_prov->input_actions);
    // net_buf_simple_add_be16(&buf, 0);
    memcpy(bt_mesh_prov_link.conf_inputs.capabilities, &buf.data[1], PDU_LEN_CAPABILITIES);
    // bt_mesh_prov_link.oob_method = AUTH_METHOD_NO_OOB;
    if (bt_mesh_prov_send(&buf, NULL)) {
    	LOG_ERR("Failed to send capabilities");
    	return;
    }
    
    bt_mesh_prov_link.expect = PROV_START;

    }`

      HHH555J 其实这个跟配对是一样的原理的,双方需要知道对方的能力是啥,不能对方不支持,那也没用。

        撰写回复...