Bluetooth: Peripheral Alexa Gadgets

The Peripheral Alexa Gadgets sample demonstrates how a Bluetooth LE device can connect to an Amazon Echo device using the Alexa Gadgets Bluetooth Service and Profile.

Documentation for the Gadgets Service and Profile can be found at Alexa Gadgets Bluetooth LE.

Before a Gadget can be connected to an Amazon Echo device, you must register it with Amazon. See Alexa Gadgets Setup for information on how to do this.


When connected, the sample performs the handshake procedure and informs the peer of its supported capabilities. Directives sent by the connected peer are printed as log messages when CONFIG_LOG is set. Additionally, when the “wake word” State Update directive is received, LED 3 on the development kit is turned on.

Gadget capabilities

During the handshake procedure, the Gadget peripheral reports which capabilities it supports. Capabilities determine which interface directives the Gadgets will receive, as listed in Alexa Gadgets Interfaces.

The following table shows the mapping between capability configuration and supported interfaces:

Capability option



Alerts interface


Alexa.Gadget.MusicData interface


Alexa.Gadget.SpeechData interface


Alexa.Gadget.StateListener interface


Alexa Gadgets Notifications interface

Gadget Custom Directives and Events

Custom directives sent from the peer to the Gadget are propagated via the BT_GADGETS_EVT_CUSTOM event. Custom directives do not require defining any additional data format.

This sample includes a rudimentary custom event type that lets you send a JSON-formatted string with your chosen custom event name and namespace, using the function bt_gadgets_profile_custom_event_json_send.

By default, the sample is configured to respond to the “Color cycler” custom skill. For instructions on how to create this custom skill, see Alexa Gadgets Github color cycler. Note that the skill code and configuration procedure is the same, even though the sample from this link uses a Raspberry Pi as a Gadget.

For more complex custom event types, you must define a custom event structure as described in Alexa Gadgets Custom Event. The custom event protobuf must be encoded using pb_encode() and the encoded buffer must be transmitted using bt_gadgets_profile_custom_event_send.


The sample supports the following development kits:

Hardware platforms


Board name

Build target

nRF52840 DK




nRF52 DK




nRF52 DK (emulating nRF52810)




The sample also has the following requirements:

External dependencies

This sample has some specific external dependencies.


This sample depends on an external protobuf compiler tool - Nanopb.

This tool must be downloaded manually.

Download Nanopb version 0.4.2 for your platform from the Nanopb Downloads site and extract the downloaded file to either this sample directory, the nRF Connect SDK installation directory, the tools folder in the nRF Connect SDK installation directory, or any other location where CMake can find it via a standard system PATH. Note that this sample directory is searched automatically for the presence of Nanopb. For example, if you are using Windows, download and extract to this sample directory.

Once the Nanopb tool has been downloaded, the build process is the same as for other samples. The tool is invoked automatically by CMake.

Gadget registration

When registering the Gadget, you will receive two identifier strings:

  1. Device Amazon ID

  2. Device secret

You must update the CONFIG_BT_ALEXA_GADGETS_AMAZON_ID and CONFIG_BT_ALEXA_GADGETS_DEVICE_SECRET configuration options in prj.conf with the values that you received during the registration.

User interface

LED 1:

On when connected.

LED 2:

On when the handshake with a peer is completed.

LED 3:

On when the wake word directive (Alexa.Gadget.StateListener) is received.

LED 4:

Toggles when the Color Cycler skill is used.

Button 4:

Erases all bond information when a button is held during a power cycle or reset.

Building and running

This sample can be found under samples/bluetooth/alexa_gadget in the nRF Connect SDK folder structure.

See Building and programming a sample application for information about how to build and program the application.


After programming the sample to your development kit, test it by performing the following steps:

  1. Optionally, set up log monitoring:

  1. Connect the kit to the computer using a USB cable. The kit is assigned a COM port (Windows) or ttyACM device (Linux), which is visible in the Device Manager.

  2. Connect to the kit with a terminal emulator (for example, PuTTY). See How to connect with PuTTY for the required settings.

  1. Reset the kit.

  2. Follow these instructions to pair your Echo device with the sample: Alexa Gadgets Pairing.

  3. Observe that LED 1 turns on to indicate that a connection has been established.

  4. Observe that LED 2 turns on to indicate that the Alexa Gadgets handshake has been completed.

  5. Say the “Alexa” wake word to your Echo device and observe that LED 3 turns on.

  6. If you are monitoring the log output from the COM port, observe log activity during Alexa queries.


This sample uses the following nRF Connect SDK libraries:

In addition, it uses the following Zephyr libraries:

  • include/zephyr/types.h

  • boards/arm/nrf*/board.h

  • Kernel Services:

    • include/kernel.h

  • Bluetooth:

    • include/bluetooth/bluetooth.h

    • include/bluetooth/gatt.h

    • include/bluetooth/hci.h

    • include/bluetooth/uuid.h