From: Wootak Jung Date: Thu, 16 Feb 2023 06:41:49 +0000 (+0900) Subject: Add custom name setting API in advertising data X-Git-Tag: accepted/tizen/unified/20230303.162753~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=87deebb3fed735dd18344e5cab8495680463f1b4;p=platform%2Fcore%2Fapi%2Fbluetooth.git Add custom name setting API in advertising data Change-Id: Ibf8e5ed464ba0ad24998860e8858f2e5b4dbd8ad Signed-off-by: Wootak Jung --- diff --git a/include/bluetooth_internal.h b/include/bluetooth_internal.h index 0ece887..bb93076 100644 --- a/include/bluetooth_internal.h +++ b/include/bluetooth_internal.h @@ -5589,6 +5589,36 @@ int bt_mesh_model_get_publication(bt_mesh_model_h model, */ int bt_adapter_get_hci_address(char **address); +/** + * @ingroup CAPI_NETWORK_BLUETOOTH_ADAPTER_LE_MODULE + * @brief Sets the custom name should be included in advertise or scan response data. + * The maximum advertised or responded data size is 31 bytes. + * if you want to include the system wide device name, + * please use @a bt_adapter_le_set_advertising_device_name. + * @since_tizen 7.5 + * @privlevel platform + * @privilege %http://tizen.org/privilege/bluetooth.admin + * + * @param[in] advertiser The handle of advertiser + * @param[in] pkt_type The packet type + * @param[in] name The custom name should be included + * @param[in] name_len The length of @a name + * + * @return 0 on success, otherwise a negative error value. + * @retval #BT_ERROR_NONE Successful + * @retval #BT_ERROR_NOT_INITIALIZED Not initialized + * @retval #BT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #BT_ERROR_QUOTA_EXCEEDED Quota exceeded + * @retval #BT_ERROR_OPERATION_FAILED Operation failed + * @retval #BT_ERROR_NOT_SUPPORTED Not supported + * + * @pre The Bluetooth service must be initialized with bt_initialize(). + * + * @see bt_adapter_le_start_advertising_new() + */ +int bt_adapter_le_add_advertising_custom_name(bt_advertiser_h advertiser, + bt_adapter_le_packet_type_e pkt_type, const char *name, unsigned int name_len); + /** * @} */ diff --git a/src/bluetooth-adapter.c b/src/bluetooth-adapter.c index 4e1c9e8..4f8d376 100644 --- a/src/bluetooth-adapter.c +++ b/src/bluetooth-adapter.c @@ -2520,6 +2520,52 @@ int bt_adapter_le_set_advertising_device_name(bt_advertiser_h advertiser, return ret; } +#define ADV_DATA_LEN_MAX 31 +int bt_adapter_le_add_advertising_custom_name(bt_advertiser_h advertiser, + bt_adapter_le_packet_type_e pkt_type, const char *name, unsigned int name_len) +{ + bt_advertiser_s *__adv = (bt_advertiser_s *)advertiser; + char **p; + unsigned int *len; + + BT_CHECK_LE_SUPPORT(); + BT_CHECK_INIT_STATUS(); + BT_CHECK_INPUT_PARAMETER(advertiser); + + if (pkt_type == BT_ADAPTER_LE_PACKET_ADVERTISING) { + p = &__adv->adv_data; + len = &__adv->adv_data_len; + } else if (pkt_type == BT_ADAPTER_LE_PACKET_SCAN_RESPONSE) { + p = &__adv->scan_rsp_data; + len = &__adv->scan_rsp_data_len; + } else + return BT_ERROR_INVALID_PARAMETER; + + /* At least 1 byte space is required for custom name */ + if (*len + 2 + 1 > ADV_DATA_LEN_MAX) { + BT_ERR("Not enough space"); + return BT_ERROR_QUOTA_EXCEEDED; + } + + if (*len + 2 + name_len > ADV_DATA_LEN_MAX) { + *p = realloc(*p, sizeof(char) * ADV_DATA_LEN_MAX); + (*p)[*len] = ADV_DATA_LEN_MAX - *len - 1; + (*p)[*len + 1] = BT_ADAPTER_LE_ADVERTISING_DATA_LOCAL_NAME; + memcpy(*p + *len + 2, name, ADV_DATA_LEN_MAX - *len - 2); + BT_DBG("name_len is %d, but only %d bytes were set", name_len, ADV_DATA_LEN_MAX - *len - 2); + *len = ADV_DATA_LEN_MAX; + } else { + *p = realloc(*p, sizeof(char) * (*len + name_len + 2)); + (*p)[*len] = name_len + 1; + (*p)[*len + 1] = BT_ADAPTER_LE_ADVERTISING_DATA_LOCAL_NAME; + memcpy(*p + *len + 2, name, name_len); + BT_DBG("%d bytes custom name were set", name_len); + *len += name_len + 2; + } + + return BT_ERROR_NONE; +} + int bt_adapter_le_set_advertising_tx_power_level(bt_advertiser_h advertiser, bt_adapter_le_packet_type_e pkt_type, bool include_tx_power) { @@ -2686,8 +2732,12 @@ int bt_adapter_le_start_advertising_new(bt_advertiser_h advertiser, BT_CHECK_INIT_STATUS(); BT_CHECK_INPUT_PARAMETER(advertiser); - if (__adv->adv_data_len > 0 && - __adv->adv_data) { /* LCOV_EXCL_START */ + if (__adv->adv_data_len > 0 && __adv->adv_data) { /* LCOV_EXCL_START */ + char buf[100]; + for (int i = 0; i < __adv->adv_data_len; i++) + sprintf(buf + i * 2, "%02x", __adv->adv_data[i]); + BT_DBG("adv_data: %s(len: %d)", buf, __adv->adv_data_len); + memcpy(adv.data, __adv->adv_data, __adv->adv_data_len); error_code = bluetooth_set_advertising_data(__adv->handle, &adv, __adv->adv_data_len); @@ -2699,8 +2749,12 @@ int bt_adapter_le_start_advertising_new(bt_advertiser_h advertiser, } } - if (__adv->scan_rsp_data_len > 0 && - __adv->scan_rsp_data) { /* LCOV_EXCL_START */ + if (__adv->scan_rsp_data_len > 0 && __adv->scan_rsp_data) { /* LCOV_EXCL_START */ + char buf[100]; + for (int i = 0; i < __adv->scan_rsp_data_len; i++) + sprintf(buf + i * 2, "%02x", __adv->scan_rsp_data[i]); + BT_DBG("scan_rsp_data: %s(len: %d)", buf, __adv->scan_rsp_data_len); + memcpy(resp.data, __adv->scan_rsp_data, __adv->scan_rsp_data_len); error_code = bluetooth_set_scan_response_data(__adv->handle, &resp, __adv->scan_rsp_data_len); diff --git a/tests/test/bt_unit_test.c b/tests/test/bt_unit_test.c index a2ef377..a18fa8c 100644 --- a/tests/test/bt_unit_test.c +++ b/tests/test/bt_unit_test.c @@ -3776,7 +3776,7 @@ int test_set_params(int test_id, char *param) break; case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_ADD_ADVERTISING_DATA: param_count = 1; - TC_PRT("Select advertising data \n (0 : Service uuid, 1: Service solicitation 2 : Appearance & Tx power, 3 : All, 4 : ANCS, 6: Multiple service data, 7: Transport discovery data, 8: L2CAP CoC PSM data"); + TC_PRT("Select advertising data \n (0 : Service uuid, 1: Service solicitation 2 : Appearance & Tx power, 3 : All, 4 : ANCS, 6: Multiple service data, 7: Transport discovery data, 8: L2CAP CoC PSM data, 9: Custom name"); TC_PRT("\t (Default scan response : Service Data &Local name & Manufacturer data)"); break; case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_SET_ADVERTISING_MODE: @@ -5280,6 +5280,29 @@ int test_input_callback(void *data) TC_PRT("set device name [0x%04x]", ret); return 0; + case 9: /* Custom name */ + ret = bt_adapter_le_add_advertising_service_uuid(advertiser, + BT_ADAPTER_LE_PACKET_ADVERTISING, time_svc_uuid_16); + if (ret != BT_ERROR_NONE) + TC_PRT("add service_uuid [0x%04x]", ret); + + ret = bt_adapter_le_add_advertising_service_uuid(advertiser, + BT_ADAPTER_LE_PACKET_ADVERTISING, battery_svc_uuid_16); + if (ret != BT_ERROR_NONE) + TC_PRT("add service_uuid [0x%04x]", ret); + + ret = bt_adapter_le_add_advertising_service_data(advertiser, + BT_ADAPTER_LE_PACKET_SCAN_RESPONSE, time_svc_uuid_16, + service_data, sizeof(service_data)); + if (ret != BT_ERROR_NONE) + TC_PRT("add service_data [0x%04x]", ret); + + ret = bt_adapter_le_add_advertising_custom_name(advertiser, + BT_ADAPTER_LE_PACKET_SCAN_RESPONSE, + "Customname123456789", strlen("Customname123456789")); + if (ret != BT_ERROR_NONE) + TC_PRT("set custom name [0x%04x]", ret); + return 0; default: TC_PRT("No adv data"); break;