Bluetooth: Peripheral HIDS keyboard
The Peripheral HIDS keyboard sample demonstrates how to use the GATT Human Interface Device (HID) Service to implement a keyboard input device that you can connect to your computer.
The sample also shows how to perform LE Secure Connections Out-of-Band pairing using NFC.
Note
Apart from HID samples, the nRF Connect SDK provides a complete reference application design of Human Interface Device (HID). Depending on the configuration, the application can work as a desktop mouse, gaming mouse, keyboard, or connection dongle. It supports connection over Bluetooth® LE, USB, or both. For details, see the nRF Desktop documentation.
Requirements
The sample supports the following development kits:
Hardware platforms |
PCA |
Board name |
Board target |
---|---|---|---|
PCA10156 |
|
||
nRF54L15 DK |
PCA10156 |
|
|
PCA10175 |
|
||
PCA10095 |
|
||
PCA10040 |
|
||
PCA10056 |
|
When built for a board target with the */ns
variant, the sample is configured to compile and run as a non-secure application with Cortex-M Security Extensions enabled.
Therefore, it automatically includes Trusted Firmware-M that prepares the required peripherals and secure services to be available for the application.
Note
If you use nRF5340 DK, the additional configuration of the network core will be taken from the child_image
directory.
For more details, see Image-specific variables.
If the NFC_OOB_PAIRING feature is enabled, the sample requires a smartphone or a tablet with Android v8.0.0 or newer.
Overview
The sample uses the buttons on a development kit to simulate keys on a keyboard. One button simulates the letter keys by generating letter keystrokes for a predefined string. A second button simulates the Shift button and shows how to modify the letter keystrokes. An LED displays the Caps Lock state, which can be modified by another connected keyboard.
This sample exposes the HID GATT Service. It uses a report map for a generic keyboard.
LE Secure Out-of-Band pairing with NFC is enabled by default in this sample. You can disable this feature by clearing the NFC_OOB_PAIRING flag in the application configuration. The following paragraphs describe the application behavior when NFC pairing is enabled.
When the application starts, it initializes and starts the NFCT peripheral that is used for pairing. The application does not start advertising immediately, but only when the NFC tag is read by an NFC polling device, for example a smartphone or a tablet with NFC support.
To trigger advertising without NFC, press Button 4. The NDEF message that the tag sends to the NFC device contains data required to initiate pairing. To start the NFC data transfer, the NFC device must touch the NFC antenna that is connected to the nRF52 device.
To trigger advertising without NFC, press Button 3. The NDEF message that the tag sends to the NFC device contains data required to initiate pairing. To start the NFC data transfer, the NFC device must touch the NFC antenna that is connected to the nRF52 device.
After reading the tag, the device can pair with the nRF52 device which is advertising. After connecting, the sample application behaves in the same way as the original HID Keyboard sample. Reading the NFC tag again when the application is in a connected state causes disconnection. When the connection is lost, advertising does not restart automatically.
User interface
- Button 1:
Sends one character of the predefined input (“hello\n”) to the computer.
When pairing, press this button to confirm the passkey value that is printed on the COM listener to pair with the other device.
- Button 2:
Simulates the Shift key.
When pairing, press this button to reject the passkey value which is printed on the COM listener to prevent pairing with the other device.
- LED 1:
Blinks with a period of two seconds with the duty cycle set to 50% when the main loop is running and the device is advertising.
- LED 2:
Lit when at least one device is connected.
- LED 3:
Indicates if Caps Lock is enabled.
If the NFC_OOB_PAIRING feature is enabled:
- Button 4:
Starts advertising.
- LED 4:
Indicates if an NFC field is present.
- Button 0:
Sends one character of the predefined input (“hello\n”) to the computer.
When pairing, press this button to confirm the passkey value that is printed on the COM listener to pair with the other device.
- Button 1:
Simulates the Shift key.
When pairing, press this button to reject the passkey value which is printed on the COM listener to prevent pairing with the other device.
- LED 0:
Blinks with a period of two seconds with the duty cycle set to 50% when the main loop is running and the device is advertising.
- LED 1:
Lit when at least one device is connected.
- LED 2:
Indicates if Caps Lock is enabled.
If the NFC_OOB_PAIRING feature is enabled:
- Button 3:
Starts advertising.
- LED 3:
Indicates if an NFC field is present.
Configuration
See Configuring and building for information about how to permanently or temporarily change the configuration.
Setup
The HID service specification does not require encryption (CONFIG_BT_HIDS_DEFAULT_PERM_RW_ENCRYPT
), but some systems disconnect from the HID devices that do not support security.
Building and running
This sample can be found under samples/bluetooth/peripheral_hids_keyboard
in the nRF Connect SDK folder structure.
When built as firmware image for a board target with the */ns
variant, the sample has Cortex-M Security Extensions (CMSE) enabled and separates the firmware between Non-Secure Processing Environment (NSPE) and Secure Processing Environment (SPE).
Because of this, it automatically includes the Trusted Firmware-M (TF-M).
To read more about CMSE, see Processing environments.
To build the sample, follow the instructions in Building an application for your preferred building environment. See also Programming an application for programming steps and Testing and optimization for general information about testing and debugging in the nRF Connect SDK.
Note
When building repository applications in the SDK repositories, building with sysbuild is enabled by default.
If you work with out-of-tree freestanding applications, you need to manually pass the --sysbuild
parameter to every build command or configure west to always use it.
Note
Programming the nRF54H20 SoC can sometimes fail due to conflicts in the resource configuration. This can happen if, for example, an application programmed to the nRF54H20 SoC configured the UICRs for one or more cores in a way that is incompatible with the configuration required by the application you are trying to program on the SoC.
To fix this error and erase the UICR for the application core, run the following command:
nrfutil device recover --core Application
If your sample also uses the radio core, you must also erase the UICRs for the radio core. To erase the UICR for the radio core, run the following command:
nrfutil device recover --core Network
For more information on the command, run:
nrfutil device recover --help
You can then run west flash
to program your application.
Testing
After programming the sample to your development kit, you can test it either by connecting the kit as keyboard device to a Microsoft Windows computer or by connecting to it with nRF Connect for Desktop.
Testing with a Microsoft Windows computer
To test with a Microsoft Windows computer that has a Bluetooth radio, complete the following steps:
Power on your development kit.
Press Button 4 on the kit if the device is not advertising. A blinking LED 1 indicates that the device is advertising.
Connect to the kit with a terminal emulator (for example, nRF Connect Serial Terminal). See Testing and optimization for the required settings and steps.
On your Windows computer, search for Bluetooth devices and connect to the device named “NCS HIDS keyboard”.
Observe that the connection state is indicated by LED 2.
Open a text editor (for example, Notepad).
Repeatedly press Button 1 on the kit. Every button press sends one character of the test message “hello” (the test message includes a carriage return) to the computer, and this will be displayed in the text editor.
Press Button 2 and hold it while pressing Button 1. Observe that the next letter of the “hello” message appears as capital letter. This is because Button 2 simulates the Shift key.
Turn on Caps Lock on the computer. Observe that LED 3 turns on. This confirms that the output report characteristic has been written successfully on the HID device.
Turn Caps Lock off on the computer. Observe that LED 3 turns off.
Disconnect the computer from the device by removing the device from the computer’s devices list.
Power on your development kit.
Press Button 3 on the kit if the device is not advertising. A blinking LED 0 indicates that the device is advertising.
Connect to the kit with a terminal emulator (for example, nRF Connect Serial Terminal). See Testing and optimization for the required settings and steps.
On your Windows computer, search for Bluetooth devices and connect to the device named “NCS HIDS keyboard”.
Observe that the connection state is indicated by LED 1.
Open a text editor (for example, Notepad).
Repeatedly press Button 0 on the kit. Every button press sends one character of the test message “hello” (the test message includes a carriage return) to the computer, and this will be displayed in the text editor.
Press Button 1 and hold it while pressing Button 0. Observe that the next letter of the “hello” message appears as capital letter. This is because Button 1 simulates the Shift key.
Turn on Caps Lock on the computer. Observe that LED 2 turns on. This confirms that the output report characteristic has been written successfully on the HID device.
Turn Caps Lock off on the computer. Observe that LED 2 turns off.
Disconnect the computer from the device by removing the device from the computer’s devices list.
Testing with nRF Connect for Desktop
To test with nRF Connect for Desktop, complete the following steps:
Power on your development kit.
Press Button 4 on the kit if the device is not advertising. A blinking LED 1 indicates that the device is advertising.
Connect to the kit with a terminal emulator (for example, nRF Connect Serial Terminal). See Testing and optimization for the required settings and steps.
Start nRF Connect for Desktop.
Open the Bluetooth Low Energy app.
Connect to the device from the app. The device is advertising as “NCS HIDS keyboard”.
Pair the devices:
Click the Settings button for the device in the app.
Select Pair.
Optionally, select Perform Bonding.
Optionally, check Enable MITM protection to pair with MITM protection and use a button on the device to confirm or reject the passkey value.
Wait until the bond is established before you continue.
Observe that the connection state is indicated by LED 2.
Observe that the services of the connected device are shown.
Enable notifications for all HID characteristics.
Press Button 1 on the kit. Observe that two notifications are received on one of the HID Report characteristics, denoting press and release for one character of the test message.
The first notification has the value
00000B0000000000
, the second has the value0000000000000000
. The received values correspond to press and release of character “h”. The format used for keyboard reports is the following byte array:[modifier, reserved, Key1, Key2, Key3, Key4, Key5, Key6]
.Similarly, further press and release events will result in press and release notifications of subsequent characters of the test string. Therefore, pressing Button 1 again will result in notification of press and release reports for character “e”.
Press Button 2 and hold it while pressing Button 1. Pressing Button 2 changes the modifier bit to 02, which simulates pressing the Shift key on a keyboard.
Observe that two notifications are received on one of the HID Report characteristics, denoting press and release for one character of the test message. The first one has the value
02000F0000000000
, the second has the value0200000000000000
. These values correspond to press and release of character “l” with the Shift key pressed.In the Bluetooth Low Energy app, select the HID Report (which has UUID
0x2A4D
and the propertiesRead
,WriteWithoutResponse
, andWrite
). Enter02
in the text box and click the tick mark button. This sets the modifier bit of the Output Report to 02, which simulates turning Caps Lock ON.Observe that LED 3 is lit.
Select the same HID Report again. Enter
00
in the text box and click Write. This sets the modifier bit to 00, which simulates turning Caps Lock OFF.Observe that LED 3 turns off.
Disconnect the device in the Bluetooth Low Energy app. Observe that no new notifications are received.
If the advertising did not start automatically, press Button 4 to continue advertising.
As bond information is preserved by the Bluetooth Low Energy app, you can immediately reconnect to the device by clicking the Connect button again.
Power on your development kit.
Press Button 3 on the kit if the device is not advertising. A blinking LED 0 indicates that the device is advertising.
Connect to the kit with a terminal emulator (for example, nRF Connect Serial Terminal). See Testing and optimization for the required settings and steps.
Start nRF Connect for Desktop.
Open the Bluetooth Low Energy app.
Connect to the device from the app. The device is advertising as “NCS HIDS keyboard”.
Pair the devices:
Click the Settings button for the device in the app.
Select Pair.
Optionally, select Perform Bonding.
Optionally, check Enable MITM protection to pair with MITM protection and use a button on the device to confirm or reject the passkey value.
Wait until the bond is established before you continue.
Observe that the connection state is indicated by LED 1.
Observe that the services of the connected device are shown.
Enable notifications for all HID characteristics.
Press Button 0 on the kit. Observe that two notifications are received on one of the HID Report characteristics, denoting press and release for one character of the test message.
The first notification has the value
00000B0000000000
, the second has the value0000000000000000
. The received values correspond to press and release of character “h”. The format used for keyboard reports is the following byte array:[modifier, reserved, Key1, Key2, Key3, Key4, Key5, Key6]
.Similarly, further press and release events will result in press and release notifications of subsequent characters of the test string. Therefore, pressing Button 0 again will result in notification of press and release reports for character “e”.
Press Button 1 and hold it while pressing Button 0. Pressing Button 1 changes the modifier bit to 02, which simulates pressing the Shift key on a keyboard.
Observe that two notifications are received on one of the HID Report characteristics, denoting press and release for one character of the test message. The first one has the value
02000F0000000000
, the second has the value0200000000000000
. These values correspond to press and release of character “l” with the Shift key pressed.In the Bluetooth Low Energy app, select the HID Report (which has UUID
0x2A4D
and the propertiesRead
,WriteWithoutResponse
, andWrite
). Enter02
in the text box and click the tick mark button. This sets the modifier bit of the Output Report to 02, which simulates turning Caps Lock ON.Observe that LED 2 is lit.
Select the same HID Report again. Enter
00
in the text box and click Write. This sets the modifier bit to 00, which simulates turning Caps Lock OFF.Observe that LED 2 turns off.
Disconnect the device in the Bluetooth Low Energy app. Observe that no new notifications are received.
If the advertising did not start automatically, press Button 3 to continue advertising.
As bond information is preserved by the Bluetooth Low Energy app, you can immediately reconnect to the device by clicking the Connect button again.
Testing with Android using NFC for pairing
To test with an Android smartphone/tablet, complete the following steps:
Touch the NFC antenna with the smartphone or tablet and observe that LED 4 is lit.
Observe that the device is advertising, as indicated by blinking LED 1.
Confirm pairing with ‘Nordic_HIDS_keyboard’ in a pop-up window on the smartphone/tablet.
Observe that the connection state is indicated by LED 2.
Repeatedly press Button 1 on the kit. Every button press sends one character of the test message “hello” to the smartphone (the test message includes a carriage return).
Press Button 2 and hold it while pressing Button 1. Observe that the next letter of the “hello” message appears as a capital letter. This is because Button 2 simulates the Shift key.
Touch the NFC antenna with the same central device again.
Observe that devices disconnect.
Touch the NFC antenna with the smartphone or tablet and observe that LED 3 is lit.
Observe that the device is advertising, as indicated by blinking LED 0.
Confirm pairing with ‘Nordic_HIDS_keyboard’ in a pop-up window on the smartphone/tablet.
Observe that the connection state is indicated by LED 1.
Repeatedly press Button 0 on the kit. Every button press sends one character of the test message “hello” to the smartphone (the test message includes a carriage return).
Press Button 1 and hold it while pressing Button 0. Observe that the next letter of the “hello” message appears as a capital letter. This is because Button 1 simulates the Shift key.
Touch the NFC antenna with the same central device again.
Observe that devices disconnect.
Dependencies
This sample uses the following nRF Connect SDK libraries:
Messages and records (if the NFC_OOB_PAIRING option is enabled)
Bluetooth LE OOB records (if the NFC_OOB_PAIRING option is enabled)
When the NFC_OOB_PAIRING feature is enabled, it also uses the Type 2 Tag library from sdk-nrfxlib:
The sample uses the following Zephyr libraries:
include/zephyr/types.h
include/sys/printk.h
include/sys/byteorder.h
API:
include/bluetooth/bluetooth.h
include/bluetooth/hci.h
include/bluetooth/conn.h
include/bluetooth/uuid.h
include/bluetooth/gatt.h
samples/bluetooth/gatt/bas.h
References
Bluetooth Core Specification Volume 3 Part H Chapter 2
The sample also uses the following secure firmware component: