Emparelhar programaticamente com um dispositivo BLE no Android 4.4 ou superior

Alguém tem um exemplo de trabalho completo de como emparelhar programaticamente com um BLE (não Bluetooth Classic) que usa entrada de senha (ou seja, um PIN de 6 dígitos) ou Comparação numérica no Android 4.4 ou posterior? Por 'programaticamente', quero dizer, digo ao PIN o Android - o usuário não é solicitado.

Existem muitas perguntas semelhantes sobre isso no SO, mas elas são: a) sobre o Bluetooth Classic; b) antigas (antessetPin() ecreateBond() público) ou c) sem resposta.

Meu entendimento é o seguinte.

Você se conecta ao dispositivo e descobre seus serviços.Você tenta ler uma característica 'protegida'.O dispositivo retorna um erro de autenticação.O Android de alguma forma inicia o emparelhamento e você diz o PIN.Agora você pode ler a característica.

Eu criei um dispositivo usandomBed correndo nonRF51-DK e dada uma característica única.

Eu configurei os parâmetros de segurança da seguinte forma:

ble.securityManager().init(
    true, // Enable bonding (though I don't really need this)
    true, // Require MitM protection. I assume you don't get a PIN prompt without this, though I'm not 100% sure.
    SecurityManager::IO_CAPS_DISPLAY_ONLY, // This makes it us the Passkey Entry (PIN) pairing method.
    "123456"); // Static PIN

E então na característica que eu usei

requireSecurity(SecurityManager::SECURITY_MODE_ENCRYPTION_WITH_MITM);

Agora, quando eu tento ler com oPainel de Controle Nórdico Mestre, Recebo uma notificação de solicitação de emparelhamento como esta:

E posso inserir esse PIN e, em seguida, o MCP diz que estou vinculado e pode ler a característica.

No entanto, no meu aplicativo, gostaria de evitar que o usuário insira o PIN, pois já o conheço. Alguém tem um exemplo recente completo de como fazer isso?

Editar: A propósitoesta é a pergunta mais relevante que encontrei no SO, mas a resposta não parece funcionar.

questionAnswers(2)

yourAnswerToTheQuestion