Read or change nRF51 mac address on Zephyr

Our project uses a Raspberry Pi compute module 3 connected via UART to 2 nRF51822. I'll go through what is working and than describe the issues I'm having

What's going on without issues:

  • The 2 nRF51822 are running project Zephyr HCI_UART sample with a very small change to blink an LED.
  • The Raspberry Pi is running the latest Jessie (from Mar/2017) with Kernel 4.4
  • I compiled both blueZ 5.43 and 5.44 (they have different tools) without issues.
  • Attach the modules btattach -B /dev/ttyAMA0 -S 115200 -P h4 and I can see communication on btmon
  • Check hciconfig and I can data being transmitted/received to/from the module
  • btmgmt --index 0 and call static-addr FF:22:33:44:55:FF I get Static address successfully set and then power on. All good.
  • I call le-obb and it shows the address as the LE Device Address: FF:22:33:44:55:FF
  • I call find -l and I can see it finding BT devices around.
  • Checking systemctl status bluetooth and bluetoothd -v it's all up and running and it's running the one from bluez 5.44

The issue:

The BD address is always 00:00:00:00:00 and this seems to have implications on tools like bluetoothctland others.

I'm basically trying every tool every command line I can find on Google (e.g. this link) to set the address and there's always errors.

  • Invoking hciconfig always returns the address as BD Address: 00:00:00:00:00:00
  • Invoking bdaddr I get Manufacturer: internal use (65535). Device address: 00:00:00:00:00:00 (XEROX CORPORATION)
  • Trying to change the address via bdaddr bdaddr -i hci0 FF:22:33:44:55:FF I get, Unsupported manufacturer
  • trying to use hciattach to connect instead of btattach and passing a bdaddr param, it connects but the address is still 00
  • bluetoothctl show or bluetoothctl list returns empty.
  • bluetoothctl show gives No default controller available and show 0 or show hci0 gives Controller 0 not available

As per "Raju" on the comments section of the nRF5x support within the Zephyr Project RTOS blog post it seems that it seems that there's some issue on mapping the address on Zephyr, but I'm not sure if that is my issue or something unrelated.

I've tried to find on the source code of Zephyr anything related to the bd address, how to set it, or how to change it, and I couldn't find anything. If needed I can recompile it with extras flags, or include some params, extra protocol. But I'm really running out of options here.

Any help will be deeply appreciated.

  • Hi Nordic support, community,

    Successfully I have deployed Zephyr / hci_uart on the nRF52 DK for testing out the BLE Controller.

    When doing my first test with a simple Qt C++ application implementing a Hart Rate Server peripheral applic (running on Linux Ubuntu 18), the execution stops as no valid hci device can be found. At least the applic can not start advertising.

    I noticed that the QT BLE controller object tries to identify the hci controller based on a random BD address (in my case CB:49:DD:88:61:62). But the local address detected for the hci device is the ZERO address 00:00:00:00:00:00. 

    BTW everytime I reset (power) the nRF board this "BD random address" remains the same which I find strange.  

    When I execute the command: bluetoothctl I get this:

    However when I run the hcitool dev command I see this:

    So this mismatch between hcitool and bluetoothctl I find already strange.

    The next step is trying to set a  public or static address. 

    First I tried to do this with the btmgmt command.

    Before doing this I asked the info:

    So once more confirmation that the BD address is the ZERO address.

    Trying to set static and public address:

    However the bluetoothctl still shows as address CB:49:DD:88:61:62

    And hcitool dev shows the ZERO address.

    Hummm.... further research lead to using the hcitool cmd for setting the BD_ADDRESS and using Zephyr HCI specific codes.

    hcitool cmd 0x3f 0x006 0x1 0x2 0x0 0x0 0x21 0xAD 

    Result is now:

    So finally some result... and also the C++ peripheral HR server applic works correctly once it could address the right hci device based on this address.The applic starts to advertise and it can be accessed (connected) for reading out the HR via the nRFConnect smartphone app. 

    But when setting this address it is volatile, so after power cycling the ZERO address is back and bluetoothctl shows a random address that is always the same.... 

    Can this be explained?

    Thanks in advance,


  • Please address your questions to the Zephyr support team. They can be reached for technical questions, through the mailing lists or IRC channels for prompt assistance.

Reply Children