Has anyone succeeded in BLE bonding with a Philips Hue lamp or a Hue smart plug with a nRF52? Directly with BLE, without a gateway.
I suppose I have all the rest figured out, but bonding fails. I know how to reset the plug: it bonds to only one device and must be reset before controlling it from another device.
The Hue GATT API is quite nice. I can use it with the nRF Connect desktop/mobile app. There are Python examples for laptop/RasPi use... All rely on laptop/iOS/Android handling the bonding, outside the example code.
I can now BLE scan for my smart plug, filtering using the manufacturer ID 0xFE0F in the advertisement package.
I can connect to it, discover the characteristics and get a handle for the correct characteristics 932c32bd-0002-47a2-835a-a8d455b859dd inside the service 932c32bd-0000-47a2-835a-a8d455b859dd
Reading/writing requires bonding, writing to the above characteristics silently fails. Writing succeeds (TX completed) to those Hue UUIDs that do not require bonding.
I have tried multiple options for bonding. Code copied from the ble_hrs_app example. This has so far looked most promising: with the "Just works" bonding
#define SEC_PARAM_BOND 1 /**< Perform bonding. */ #define SEC_PARAM_MITM 0 /**< Man In The Middle protection not required. */ #define SEC_PARAM_LESC 0 /**< LE Secure Connections enabled. */ #define SEC_PARAM_KEYPRESS 0 /**< Keypress notifications not enabled. */ #define SEC_PARAM_IO_CAPABILITIES BLE_GAP_IO_CAPS_NONE /**< No I/O capabilities. */ #define SEC_PARAM_OOB 0 /**< Out Of Band data not available. */ #define SEC_PARAM_MIN_KEY_SIZE 7 /**< Minimum encryption key size. */ #define SEC_PARAM_MAX_KEY_SIZE 16 /**< Maximum encryption key size. */ // Security parameters to be used for all security procedures. sec_param.bond = SEC_PARAM_BOND; sec_param.mitm = SEC_PARAM_MITM; sec_param.lesc = SEC_PARAM_LESC; sec_param.keypress = SEC_PARAM_KEYPRESS; sec_param.io_caps = SEC_PARAM_IO_CAPABILITIES; sec_param.oob = SEC_PARAM_OOB; sec_param.min_key_size = SEC_PARAM_MIN_KEY_SIZE; sec_param.max_key_size = SEC_PARAM_MAX_KEY_SIZE; sec_param.kdist_own.enc = 1; sec_param.kdist_own.id = 1; sec_param.kdist_peer.enc = 1; sec_param.kdist_peer.id = 1; err_code = pm_sec_params_set(&sec_param); APP_ERROR_CHECK(err_code); err_code = pm_register(pm_evt_handler); APP_ERROR_CHECK(err_code);
calling pm_conn_secure(conn_handle, true) and pm_conn_secure(conn_handle, false) sort of work. I get an event
case BLE_GAP_EVT_AUTH_STATUS: NRF_LOG_INFO("BLE_GAP_EVT_AUTH_STATUS: status=0x%x bond=0x%x lv4: %d kdist_own:0x%x kdist_peer:0x%x", p_ble_evt->evt.gap_evt.params.auth_status.auth_status, p_ble_evt->evt.gap_evt.params.auth_status.bonded, p_ble_evt->evt.gap_evt.params.auth_status.sm1_levels.lv4, *((uint8_t *)&p_ble_evt->evt.gap_evt.params.auth_status.kdist_own), *((uint8_t *)&p_ble_evt->evt.gap_evt.params.auth_status.kdist_peer)); break;
that logs
BLE_GAP_EVT_AUTH_STATUS: status=0x85 bond=0x0 lv4: 0 kdist_own:0x0 kdist_peer:0x0[0m
The status 0x85 is BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, bonding does not happen.
I googled and found out that many had tried and failed on this same bonding issue with Arduino sketches etc.
If nothing else helps, I'll maybe need to use a BLE sniffer and see how the mobile phone app handles bonding differently...
nRF Connect (desktop) does handle the bonding correctly - what might be the difference to the code above?