Skip to content

Commit 971b541

Browse files
committed
_bleio: support anonymous advertising
Add a new parameter to the `start_advertising()` function to enable anonymous advertising. This forces a call to `sd_ble_gap_privacy_set()` with `privacy_mode` set to `BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY` and `private_addr_type` set to `BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE`. With this, addresses will cycle at a predefined rate (currently once every 15 minutes). Signed-off-by: Sean Cross <[email protected]>
1 parent 1af5f6d commit 971b541

File tree

4 files changed

+33
-9
lines changed

4 files changed

+33
-9
lines changed

ports/nrf/common-hal/_bleio/Adapter.c

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,7 @@ STATIC void check_data_fit(size_t data_len, bool connectable) {
594594
}
595595
}
596596

597-
uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, float interval, uint8_t *advertising_data, uint16_t advertising_data_len, uint8_t *scan_response_data, uint16_t scan_response_data_len) {
597+
uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, float interval, uint8_t *advertising_data, uint16_t advertising_data_len, uint8_t *scan_response_data, uint16_t scan_response_data_len) {
598598
if (self->current_advertising_data != NULL && self->current_advertising_data == self->advertising_data) {
599599
return NRF_ERROR_BUSY;
600600
}
@@ -605,7 +605,7 @@ uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self,
605605
common_hal_bleio_adapter_stop_advertising(self);
606606
}
607607

608-
608+
uint32_t err_code;
609609
bool extended = advertising_data_len > BLE_GAP_ADV_SET_DATA_SIZE_MAX ||
610610
scan_response_data_len > BLE_GAP_ADV_SET_DATA_SIZE_MAX;
611611

@@ -626,7 +626,27 @@ uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self,
626626
adv_type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED;
627627
}
628628

629-
uint32_t err_code;
629+
if (anonymous) {
630+
ble_gap_privacy_params_t privacy = {
631+
.privacy_mode = BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY,
632+
.private_addr_type = BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE,
633+
.private_addr_cycle_s = 0,
634+
.p_device_irk = NULL,
635+
};
636+
err_code = sd_ble_gap_privacy_set(&privacy);
637+
} else {
638+
ble_gap_privacy_params_t privacy = {
639+
.privacy_mode = BLE_GAP_PRIVACY_MODE_OFF,
640+
.private_addr_type = BLE_GAP_ADDR_TYPE_PUBLIC,
641+
.private_addr_cycle_s = 0,
642+
.p_device_irk = NULL,
643+
};
644+
err_code = sd_ble_gap_privacy_set(&privacy);
645+
}
646+
if (err_code != NRF_SUCCESS) {
647+
return err_code;
648+
}
649+
630650
ble_gap_adv_params_t adv_params = {
631651
.interval = SEC_TO_UNITS(interval, UNIT_0_625_MS),
632652
.properties.type = adv_type,
@@ -657,7 +677,7 @@ uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self,
657677
}
658678

659679

660-
void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, mp_float_t interval, mp_buffer_info_t *advertising_data_bufinfo, mp_buffer_info_t *scan_response_data_bufinfo) {
680+
void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, mp_float_t interval, mp_buffer_info_t *advertising_data_bufinfo, mp_buffer_info_t *scan_response_data_bufinfo) {
661681
if (self->current_advertising_data != NULL && self->current_advertising_data == self->advertising_data) {
662682
mp_raise_bleio_BluetoothError(translate("Already advertising."));
663683
}
@@ -681,7 +701,7 @@ void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool
681701
memcpy(self->advertising_data, advertising_data_bufinfo->buf, advertising_data_bufinfo->len);
682702
memcpy(self->scan_response_data, scan_response_data_bufinfo->buf, scan_response_data_bufinfo->len);
683703

684-
check_nrf_error(_common_hal_bleio_adapter_start_advertising(self, connectable, interval,
704+
check_nrf_error(_common_hal_bleio_adapter_start_advertising(self, connectable, anonymous, interval,
685705
self->advertising_data,
686706
advertising_data_bufinfo->len,
687707
self->scan_response_data,

shared-bindings/_bleio/Adapter.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,17 +145,19 @@ const mp_obj_property_t bleio_adapter_name_obj = {
145145
//| :param buf data: advertising data packet bytes
146146
//| :param buf scan_response: scan response data packet bytes. ``None`` if no scan response is needed.
147147
//| :param bool connectable: If `True` then other devices are allowed to connect to this peripheral.
148+
//| :param bool anonymous: If `True` then this device's MAC address is randomized regularly.
148149
//| :param float interval: advertising interval, in seconds"""
149150
//| ...
150151
//|
151152
STATIC mp_obj_t bleio_adapter_start_advertising(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
152153
bleio_adapter_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
153154

154-
enum { ARG_data, ARG_scan_response, ARG_connectable, ARG_interval };
155+
enum { ARG_data, ARG_scan_response, ARG_connectable, ARG_anonymous, ARG_interval };
155156
static const mp_arg_t allowed_args[] = {
156157
{ MP_QSTR_data, MP_ARG_REQUIRED | MP_ARG_OBJ },
157158
{ MP_QSTR_scan_response, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
158159
{ MP_QSTR_connectable, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} },
160+
{ MP_QSTR_anonymous, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
159161
{ MP_QSTR_interval, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
160162
};
161163

@@ -182,11 +184,12 @@ STATIC mp_obj_t bleio_adapter_start_advertising(mp_uint_t n_args, const mp_obj_t
182184
}
183185

184186
bool connectable = args[ARG_connectable].u_bool;
187+
bool anonymous = args[ARG_anonymous].u_bool;
185188
if (data_bufinfo.len > 31 && connectable && scan_response_bufinfo.len > 0) {
186189
mp_raise_bleio_BluetoothError(translate("Cannot have scan responses for extended, connectable advertisements."));
187190
}
188191

189-
common_hal_bleio_adapter_start_advertising(self, connectable, interval,
192+
common_hal_bleio_adapter_start_advertising(self, connectable, anonymous, interval,
190193
&data_bufinfo, &scan_response_bufinfo);
191194

192195
return mp_const_none;

shared-bindings/_bleio/Adapter.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ extern bleio_address_obj_t *common_hal_bleio_adapter_get_address(bleio_adapter_o
4545
extern mp_obj_str_t* common_hal_bleio_adapter_get_name(bleio_adapter_obj_t *self);
4646
extern void common_hal_bleio_adapter_set_name(bleio_adapter_obj_t *self, const char* name);
4747

48-
extern uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, float interval, uint8_t *advertising_data, uint16_t advertising_data_len, uint8_t *scan_response_data, uint16_t scan_response_data_len);
48+
extern uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, float interval, uint8_t *advertising_data, uint16_t advertising_data_len, uint8_t *scan_response_data, uint16_t scan_response_data_len);
4949

50-
extern void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, mp_float_t interval, mp_buffer_info_t *advertising_data_bufinfo, mp_buffer_info_t *scan_response_data_bufinfo);
50+
extern void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, mp_float_t interval, mp_buffer_info_t *advertising_data_bufinfo, mp_buffer_info_t *scan_response_data_bufinfo);
5151
extern void common_hal_bleio_adapter_stop_advertising(bleio_adapter_obj_t *self);
5252

5353
extern mp_obj_t common_hal_bleio_adapter_start_scan(bleio_adapter_obj_t *self, uint8_t* prefixes, size_t prefix_length, bool extended, mp_int_t buffer_size, mp_float_t timeout, mp_float_t interval, mp_float_t window, mp_int_t minimum_rssi, bool active);

supervisor/shared/bluetooth.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ void supervisor_bluetooth_start_advertising(void) {
7474
// TODO: switch to Adafruit short UUID for the advertisement and add manufacturing data to distinguish ourselves from arduino.
7575
_common_hal_bleio_adapter_start_advertising(&common_hal_bleio_adapter_obj,
7676
true,
77+
false,
7778
1.0,
7879
circuitpython_advertising_data,
7980
sizeof(circuitpython_advertising_data),

0 commit comments

Comments
 (0)