diff --git a/src/NimBLEClient.cpp b/src/NimBLEClient.cpp index 0ec9c83c7..0b04dea22 100644 --- a/src/NimBLEClient.cpp +++ b/src/NimBLEClient.cpp @@ -1210,7 +1210,16 @@ int NimBLEClient::handleGapEvent(struct ble_gap_event* event, void* arg) { break; } - if (event->passkey.params.action == BLE_SM_IOACT_NUMCMP) { + if (event->passkey.params.action == BLE_SM_IOACT_DISP) { + struct ble_sm_io pkey = {0, 0}; + pkey.action = event->passkey.params.action; + pkey.passkey = NimBLEDevice::getSecurityPasskey(); + if (pkey.passkey == 123456) { + pkey.passkey = pClient->m_pClientCallbacks->onPassKeyDisplay(peerInfo); + } + rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey); + NIMBLE_LOGD(LOG_TAG, "BLE_SM_IOACT_DISP; ble_sm_inject_io result: %d", rc); + } else if (event->passkey.params.action == BLE_SM_IOACT_NUMCMP) { NIMBLE_LOGD(LOG_TAG, "Passkey on device's display: %" PRIu32, event->passkey.params.numcmp); pClient->m_pClientCallbacks->onConfirmPasskey(peerInfo, event->passkey.params.numcmp); } else if (event->passkey.params.action == BLE_SM_IOACT_OOB) { @@ -1314,6 +1323,11 @@ void NimBLEClientCallbacks::onPassKeyEntry(NimBLEConnInfo& connInfo) { NimBLEDevice::injectPassKey(connInfo, 123456); } // onPassKeyEntry +uint32_t NimBLEClientCallbacks::onPassKeyDisplay(NimBLEConnInfo& connInfo) { + NIMBLE_LOGD(CB_TAG, "onPassKeyDisplay: default"); + return NimBLEDevice::getSecurityPasskey(); +} // onPassKeyDisplay + void NimBLEClientCallbacks::onAuthenticationComplete(NimBLEConnInfo& connInfo) { NIMBLE_LOGD(CB_TAG, "onAuthenticationComplete: default"); } // onAuthenticationComplete diff --git a/src/NimBLEClient.h b/src/NimBLEClient.h index 2dac6563b..56cf7ae2c 100644 --- a/src/NimBLEClient.h +++ b/src/NimBLEClient.h @@ -187,6 +187,13 @@ class NimBLEClientCallbacks { */ virtual void onPassKeyEntry(NimBLEConnInfo& connInfo); + /** + * @brief Called when using passkey entry pairing and the passkey should be displayed. + * @param [in] connInfo A reference to a NimBLEConnInfo instance containing the peer info. + * @return The passkey to display to the user. The peer device must enter this passkey to complete the pairing. + */ + virtual uint32_t onPassKeyDisplay(NimBLEConnInfo& connInfo); + /** * @brief Called when the pairing procedure is complete. * @param [in] connInfo A reference to a NimBLEConnInfo instance containing the peer info.\n diff --git a/src/NimBLEServer.cpp b/src/NimBLEServer.cpp index d3d826ad6..60f07d348 100644 --- a/src/NimBLEServer.cpp +++ b/src/NimBLEServer.cpp @@ -684,6 +684,15 @@ int NimBLEServer::handleGapEvent(ble_gap_event* event, void* arg) { // } // rc = ble_sm_inject_io(event->passkey.conn_handle, &pkey); // NIMBLE_LOGD(LOG_TAG, "BLE_SM_IOACT_OOB; ble_sm_inject_io result: %d", rc); + } else if (event->passkey.params.action == BLE_SM_IOACT_INPUT) { + NIMBLE_LOGD(LOG_TAG, "Enter the passkey"); + + rc = ble_gap_conn_find(event->passkey.conn_handle, &peerInfo.m_desc); + if (rc != 0) { + return BLE_ATT_ERR_INVALID_HANDLE; + } + + pServer->m_pServerCallbacks->onPassKeyEntry(peerInfo); } else if (event->passkey.params.action == BLE_SM_IOACT_NONE) { NIMBLE_LOGD(LOG_TAG, "No passkey action required"); } @@ -1119,6 +1128,11 @@ uint32_t NimBLEServerCallbacks::onPassKeyDisplay() { return 123456; } // onPassKeyDisplay +void NimBLEServerCallbacks::onPassKeyEntry(NimBLEConnInfo& connInfo) { + NIMBLE_LOGD("NimBLEServerCallbacks", "onPassKeyEntry: default: 123456"); + NimBLEDevice::injectPassKey(connInfo, 123456); +} // onPassKeyEntry + void NimBLEServerCallbacks::onConfirmPassKey(NimBLEConnInfo& connInfo, uint32_t pin) { NIMBLE_LOGD("NimBLEServerCallbacks", "onConfirmPasskey: default: true"); NimBLEDevice::injectConfirmPasskey(connInfo, true); diff --git a/src/NimBLEServer.h b/src/NimBLEServer.h index 0177fcc6b..c29940643 100644 --- a/src/NimBLEServer.h +++ b/src/NimBLEServer.h @@ -180,6 +180,15 @@ class NimBLEServerCallbacks { */ virtual uint32_t onPassKeyDisplay(); + /** + * @brief Called when using passkey entry pairing and the peer requires the passkey to be entered. + * @param [in] connInfo A reference to a NimBLEConnInfo instance with information + * about the peer connection parameters. + * @details The application should call NimBLEDevice::injectPassKey with the passkey + * displayed on the peer device to complete the pairing process. + */ + virtual void onPassKeyEntry(NimBLEConnInfo& connInfo); + /** * @brief Called when using numeric comparision for pairing. * @param [in] connInfo A reference to a NimBLEConnInfo instance with information