Add custom name setting API in advertising data 05/288405/4
authorWootak Jung <wootak.jung@samsung.com>
Thu, 16 Feb 2023 06:41:49 +0000 (15:41 +0900)
committerWootak Jung <wootak.jung@samsung.com>
Thu, 2 Mar 2023 23:20:41 +0000 (08:20 +0900)
Change-Id: Ibf8e5ed464ba0ad24998860e8858f2e5b4dbd8ad
Signed-off-by: Wootak Jung <wootak.jung@samsung.com>
include/bluetooth_internal.h
src/bluetooth-adapter.c
tests/test/bt_unit_test.c

index 0ece88793ab49c1742807b193e7af661dbca1b40..bb9307659995ca2a1d4939a22569ab5ebe19bd8b 100644 (file)
@@ -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);
+
 /**
  * @}
  */
index 4e1c9e815139eb557dc4249765750d0fa4544ef3..4f8d3762d87dc737a22407e69ac00c2da0684db3 100644 (file)
@@ -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);
index a2ef377575bc11416da971aa4ce443f425645bc7..a18fa8c11440a9c2c79d83ffab5c495a046cc4c1 100644 (file)
@@ -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;