/** * Copyright (c) 2023 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 * */ #include #include #include #include #include #include #include #include LOG_MODULE_REGISTER(test_peripheral, LOG_LEVEL_DBG); #include "bs_bt_utils.h" #define UUID_1 BT_UUID_DECLARE_128(0xdb, 0x1f, 0xe2, 0x52, 0xf3, 0xc6, 0x43, 0x66, \ 0xb3, 0x92, 0x5d, 0xc6, 0xe7, 0xc9, 0x59, 0x9d) #define UUID_2 BT_UUID_DECLARE_128(0x3f, 0xa4, 0x7f, 0x44, 0x2e, 0x2a, 0x43, 0x05, \ 0xab, 0x38, 0x07, 0x8d, 0x16, 0xbf, 0x99, 0xf1) static void new_svc_ccc_cfg_changed(const struct bt_gatt_attr *attr, uint16_t value) { ARG_UNUSED(attr); bool notif_enabled = (value == BT_GATT_CCC_NOTIFY); LOG_DBG("CCC Update: notification %s", notif_enabled ? "enabled" : "disabled"); } static struct bt_gatt_attr attrs[] = { BT_GATT_PRIMARY_SERVICE(UUID_1), BT_GATT_CHARACTERISTIC(UUID_2, BT_GATT_CHRC_NOTIFY, BT_GATT_PERM_NONE, NULL, NULL, NULL), BT_GATT_CCC(new_svc_ccc_cfg_changed, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE), }; static struct bt_gatt_service svc = { .attrs = attrs, .attr_count = ARRAY_SIZE(attrs), }; void peripheral(void) { /* * test goal: check that service changed indication is sent on * reconnection when the server's GATT database has been updated since * last connection * * the peripheral will wait for connection/disconnection, when * disconnected it will register a new service, when reconnecting, the * central should receive an indication */ int err; struct bt_le_ext_adv *adv = NULL; err = bt_enable(NULL); BSIM_ASSERT(!err, "bt_enable failed (%d)\n", err); err = settings_load(); BSIM_ASSERT(!err, "settings_load failed (%d)\n", err); create_adv(&adv); start_adv(adv); wait_connected(); stop_adv(adv); wait_disconnected(); clear_g_conn(); /* add a new service to trigger the service changed indication */ err = bt_gatt_service_register(&svc); BSIM_ASSERT(!err, "bt_gatt_service_register failed (%d)\n", err); LOG_DBG("New service added"); start_adv(adv); wait_connected(); PASS("Done\n"); }