From feb38e2ccdac2d60709f09a8457a7a01a0ba97bf Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Tue, 21 Jan 2025 00:52:01 -0500 Subject: [PATCH 1/2] fix(ble): enforce maximum length for dynamic device name --- app/Kconfig | 5 +++++ app/src/ble.c | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 5fc03822a02..c1d88a584f7 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -238,6 +238,11 @@ config BT_PERIPHERAL_PREF_LATENCY config BT_PERIPHERAL_PREF_TIMEOUT default 400 +# The device name should be 16 characters or less so it fits within the +# advertising data. +config BT_DEVICE_NAME_MAX + default 16 + endif # ZMK_BLE endmenu # Output Types diff --git a/app/src/ble.c b/app/src/ble.c index 02d8901b982..7176bd0a67c 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -66,7 +66,9 @@ static uint8_t active_profile; #define DEVICE_NAME CONFIG_BT_DEVICE_NAME #define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1) -BUILD_ASSERT(DEVICE_NAME_LEN <= 16, "ERROR: BLE device name is too long. Max length: 16"); +BUILD_ASSERT( + DEVICE_NAME_LEN <= CONFIG_BT_DEVICE_NAME_MAX, + "ERROR: BLE device name is too long. Max length: " STRINGIFY(CONFIG_BT_DEVICE_NAME_MAX)); static struct bt_data zmk_ble_ad[] = { BT_DATA_BYTES(BT_DATA_GAP_APPEARANCE, 0xC1, 0x03), From a64d2c2a5df6b7d7fd2572d18e1ffa551ed1dff6 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Tue, 21 Jan 2025 01:33:19 -0500 Subject: [PATCH 2/2] feat(ble): add support for generating device name based on MAC address This is useful for distinguishing multiple identical keyboards. --- app/Kconfig | 4 ++++ app/src/ble.c | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/app/Kconfig b/app/Kconfig index c1d88a584f7..5dfc25bf085 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -243,6 +243,10 @@ config BT_PERIPHERAL_PREF_TIMEOUT config BT_DEVICE_NAME_MAX default 16 +config ZMK_BLE_KEYBOARD_NAME_MAC + bool "Include MAC address in BLE device name" + depends on ZMK_SPLIT_ROLE_CENTRAL + endif # ZMK_BLE endmenu # Output Types diff --git a/app/src/ble.c b/app/src/ble.c index 7176bd0a67c..5c2c87eb661 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -702,6 +702,24 @@ static int zmk_ble_complete_startup(void) { #endif // IS_ENABLED(CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START) +#if IS_ENABLED(CONFIG_ZMK_BLE_KEYBOARD_NAME_MAC) + bt_addr_le_t addrs[CONFIG_BT_ID_MAX]; + size_t id_count; + bt_id_get(addrs, &id_count); + if (id_count < 1) { + LOG_ERR("Failed to get Bluetooth device address"); + } else { + // The generated name can be a maximum of 29 bytes (plus NULL) since + // CONFIG_BT_DEVICE_NAME is 16 bytes at most. + char name[30] = {}; + uint8_t *a = addrs[0].a.val; + snprintf(name, sizeof(name), "%s %02X%02X%02X%02X%02X%02X", CONFIG_BT_DEVICE_NAME, a[5], + a[4], a[3], a[2], a[1], a[0]); + name[CONFIG_BT_DEVICE_NAME_MAX] = '\0'; + zmk_ble_set_device_name(name); + } +#endif + bt_conn_cb_register(&conn_callbacks); bt_conn_auth_cb_register(&zmk_ble_auth_cb_display); bt_conn_auth_info_cb_register(&zmk_ble_auth_info_cb_display);