WXK
2024-12-16 78e84fcf264afd731cd66c807d9fcb690fe12126
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Configure device address
------------------------
 
A BLE device needs an address to do just about anything. For information
on the various types of Bluetooth addresses, see the `NimBLE Host
Identity Reference :doc:`<../ble_hs/ble_hs_id/ble_hs_id>`.
 
There are several methods for assigning an address to a NimBLE device.
The available options are documented below:
 
Method 1: Configure nRF hardware with a public address
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
When Mynewt is running on a Nordic nRF platform, the NimBLE controller
will attempt to read a public address out of the board's FICR or UICR
registers. The controller uses the following logic while trying to read
an address from hardware:
 
1. If the *DEVICEADDRTYPE* FICR register is written, read the address
   programmed in the *DEVICEADDR[0]* and *DEVICEADDR[1]* FICR registers.
2. Else if the upper 16 bits of the *CUSTOMER[1]* UICR register are 0,
   read the address programmed in the *CUSTOMER[0]* and *CUSTOMER[1]*
   UCI registers.
3. Else, no address available.
 
Method 2: Hardcode a public address in the Mynewt target
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
The NimBLE controller package exports a
:doc:`syscfg <../../../os/modules/sysinitconfig/sysinitconfig>` setting
called ``BLE_PUBLIC_DEV_ADDR``. This setting can be overridden at the
application or target level to configure a public Bluetooth address. For
example, a target can assign the public address *11:22:33:44:55:66* as
follows:
 
::
 
    syscfg.vals:
        BLE_PUBLIC_DEV_ADDR: '(uint8_t[6]){0x66, 0x55, 0x44, 0x33, 0x22, 0x11}'
 
This setting takes the form of a C expression. Specifically, the value
is a designated initializer expressing a six-byte array. Also note that
the bytes are reversed, as an array is inherently little-endian, while
addresses are generally expressed in big-endian.
 
Note: this method takes precedence over method 1. Whatever is written to
the ``BLE_PUBLIC_DEV_ADDR`` setting is the address that gets used.
 
Method 3: Configure a random address at runtime
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
Random addresses get configured through the NimBLE host. The following
two functions are used in random address configuration:
 
-  :doc:`ble_hs_id_gen_rnd <../ble_hs/ble_hs_id/functions/ble_hs_id_gen_rnd>`:
   Generates a new random address.
-  :doc:`ble_hs_id_set_rnd <../ble_hs/ble_hs_id/functions/ble_hs_id_set_rnd>`:
   Sets the device's random address.
 
For an example of how this is done, see the :doc:`<../../../os/tutorials/ibeacon>`.
 
*Note:* A NimBLE device can be configured with multiple addresses; at
most one of each address type.