Hi, There is no such method to protect services from being discovered, but this is "by design" as per Bluetooth Core spec [1]. As you said, you can just protect access on characteristic level by combining BLE_GATT_CHR_F_XXX_ENC (requires encryption, allows unauthenticated key) and BLE_GATT_CHR_F_XXX_AUTHEN (requires encryption and authenticated key) flags.
[1] Core 5.0, Vol 3, Part G, Section 8.1: "The list of services and characteristics that a device supports is not considered private or confidential information, and therefore the Service and Characteristic Discovery procedures shall always be permitted." Best, Andrzej On Tue, Jul 10, 2018 at 10:06 AM Amr Bekhit <amrbek...@gmail.com> wrote: > > I've experimented some more. If I declare a characteristic with the > BLE_GATT_CHR_F_XXX_ENC flags, then accessing that characteristic > prompts me for a pin code, and if I connect from a previously bonded > profile, then no pin is requested (as expected). So this seems to work > fine, in that I can pin code-protect certain characteristics of a > service and require a pin to access them. However, is it possible to > pin code-protect connections from the advertising stage? Because at > the moment, any device can connect to and query the services and > characteristics of the end device. > > Amr > On Tue, 10 Jul 2018 at 10:12, Amr Bekhit <amrbek...@gmail.com> wrote: > > > > Hi Andrzej, > > > > Thank you - that does indeed work. > > > > I have another question. Bonding now works (i.e. using the nRF52 > > Connect app on Android, I connect to the advertising end device and > > then bond with it to save the credentials), however I would also like > > to configure the end device so that it requires a pin when connecting > > to the advertising device. How would this be realised using Nimble? > > > > Thanks > > > > Amr > > On Tue, 10 Jul 2018 at 00:50, Andrzej Kaczmarek > > <andrzej.kaczma...@codecoup.pl> wrote: > > > > > > Hi, > > > > > > You code looks ok. However, I noticed strange thing when testing with > > > Android phone on my side: pairing fails if specified passkey has less > > > than 6 digits (i.e. <100000). This does not seem to be issue in NimBLE > > > since the same happens when trying to pair Android with BlueZ while > > > pairing between NimBLE and BlueZ works just fine. Looks like some > > > issue in Android LE SC implementation tbh... > > > > > > So please try with 6 digits passkey (i.e. >=100000) and it should work. > > > > > > Best, > > > Andrzej > > > > > > > > > On Mon, Jul 9, 2018 at 12:08 PM Amr Bekhit <amrbek...@gmail.com> wrote: > > > > > > > > Hi Andrzej, > > > > > > > > Below is my GAP event callback function and the console output when I > > > > attempt to bond with my device (I'm using the Nordic nRF Connect app > > > > on my phone to interact with the device): > > > > > > > > static int bleprph_gap_event(struct ble_gap_event *event, void *arg) { > > > > int rc = 0; > > > > > > > > switch(event->type) { > > > > case BLE_GAP_EVENT_CONNECT: > > > > console_printf("Connected\n"); > > > > break; > > > > > > > > case BLE_GAP_EVENT_DISCONNECT: > > > > console_printf("Disconnected\n"); > > > > ble_advertise(); > > > > break; > > > > > > > > case BLE_GAP_EVENT_CONN_UPDATE: > > > > console_printf("Connection updated\n"); > > > > break; > > > > > > > > case BLE_GAP_EVENT_CONN_UPDATE_REQ: > > > > console_printf("Connection update requested\n"); > > > > break; > > > > > > > > case BLE_GAP_EVENT_PASSKEY_ACTION: { > > > > console_printf("Passkey Request. Action: %d, Numcmp: %lu\n", > > > > event->passkey.params.action, > > > > event->passkey.params.numcmp); > > > > > > > > if (event->passkey.params.action == BLE_SM_IOACT_DISP) { > > > > struct ble_sm_io pk; > > > > pk.action = event->passkey.params.action; > > > > pk.passkey = 4539; > > > > rc = ble_sm_inject_io(event->passkey.conn_handle, &pk); > > > > console_printf("ble_sm_inject_io result: %d\n", rc); > > > > } > > > > break; > > > > } > > > > > > > > default: > > > > console_printf("GAP Event: %i\n", event->type); > > > > } > > > > > > > > return rc; > > > > } > > > > > > > > 001039 Passkey Request. Action: 3, Numcmp: 0 > > > > 001040 ble_sm_inject_io result: 0 > > > > 001639 GAP Event: 10 > > > > 002037 Connection updated > > > > 002037 Disconnected > > > > > > > > On the phone, I get requested for a pin number and I enter 4539. After > > > > that, the end device just disconnects from the bluetooth.