From a6e097db3ef9d605e20e0d0989275d97146cf519 Mon Sep 17 00:00:00 2001 From: Amit KS Date: Fri, 24 Aug 2018 21:55:11 +0530 Subject: [PATCH] Added API to disable starting advertisement automatically And advertisement data can be set just before starting Following Two Pathces are integrated 1.Added API to disable starting advertisement automatically [Problem] There is no possibility to don't start advertisement. It is always started automatically. [Cause & Measure] Advertisement is started automatically in CAStartLEGattServer 2.Advertisement data can be set just before starting [Problem] It's not possible to set advertisement data after bluetooth is enabled but before advertising is started. [Cause & Measure] current implementation assumes setting advertisement data before turning on BT. This feature adds possibility to set function that will be called just before starting advertising Change-Id: I773bbfc7bb53306609812ec9600d86d29e35d27e Signed-off-by: Amit KS --- resource/csdk/connectivity/api/cacommon.h | 8 ++ resource/csdk/connectivity/api/cautilinterface.h | 7 ++ .../src/bt_le_adapter/tizen/caleserver.h | 12 +++ .../src/bt_le_adapter/tizen/caleserver_mcd.c | 109 +++++++++++++++++---- .../connectivity/util/inc/camanagerleinterface.h | 23 +++++ .../bt_le_manager/tizen/caleconnectionmanager.c | 12 ++- .../csdk/connectivity/util/src/cautilinterface.c | 8 ++ resource/include/CAManager.h | 21 ++++ resource/src/CAManager.cpp | 9 +- 9 files changed, 190 insertions(+), 19 deletions(-) diff --git a/resource/csdk/connectivity/api/cacommon.h b/resource/csdk/connectivity/api/cacommon.h index 618f0eb..19bbc82 100755 --- a/resource/csdk/connectivity/api/cacommon.h +++ b/resource/csdk/connectivity/api/cacommon.h @@ -697,6 +697,14 @@ typedef void (*CAErrorCallback)(const CAEndpoint_t *object, */ typedef void (*CANetworkMonitorCallback)(const CAEndpoint_t *info, CANetworkStatus_t status); +/** + * Callback function type for editing bluetooth advertisement data before starting bluetooth advertisement. + * param[in] max_data_size Maximal size of advertisement data array + * param[out] data Advertisement data array + * param[out] real_data_size Real size of advertisement data array + */ +typedef void (*CAAdvertisementDataGetterCB)(int max_data_size, char *data, int *real_data_size); + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/resource/csdk/connectivity/api/cautilinterface.h b/resource/csdk/connectivity/api/cautilinterface.h index 15727ff..84d5c37 100644 --- a/resource/csdk/connectivity/api/cautilinterface.h +++ b/resource/csdk/connectivity/api/cautilinterface.h @@ -134,8 +134,15 @@ uint16_t CAGetAssignedPortNumber(CATransportAdapter_t adapter, CATransportFlags_ //custom advertisement data setting #if defined(__TIZEN__) && defined(LE_ADAPTER) && defined(BLE_CUSTOM_ADVERTISE) + CAResult_t CASetAdvertisementData(const char* data, int length); + +void CASetAdvertisementDataGetter(CAAdvertisementDataGetterCB getter); + +void CASetAutoAdvertisement(bool autoAdvertisement); + CAResult_t CASetScanResponseData(const char* data, int length); + #endif #ifdef __APPLE__ diff --git a/resource/csdk/connectivity/src/bt_le_adapter/tizen/caleserver.h b/resource/csdk/connectivity/src/bt_le_adapter/tizen/caleserver.h index e8687fa..6e54522 100644 --- a/resource/csdk/connectivity/src/bt_le_adapter/tizen/caleserver.h +++ b/resource/csdk/connectivity/src/bt_le_adapter/tizen/caleserver.h @@ -47,6 +47,18 @@ */ CAResult_t CAsetServerAdvertisementData(const char *data, int length); +/** + * Used to set advertisement data getter callback. + * @param[in] getter Bluetooth advertisement data getter callback. + */ +void CAsetServerAdvertisementDataGetter(CAAdvertisementDataGetterCB getter); + +/** + * Used to set auto advertisement feature on and off. + * + * @param[in] auto_advertisement Boolean flag to turn auto advertisement feature on and off. + */ +void CAsetServerAutoAdvertisement(bool auto_advertisement); /** * Used to Start Server send response data diff --git a/resource/csdk/connectivity/src/bt_le_adapter/tizen/caleserver_mcd.c b/resource/csdk/connectivity/src/bt_le_adapter/tizen/caleserver_mcd.c index 46c914c..0fe64b8 100644 --- a/resource/csdk/connectivity/src/bt_le_adapter/tizen/caleserver_mcd.c +++ b/resource/csdk/connectivity/src/bt_le_adapter/tizen/caleserver_mcd.c @@ -27,6 +27,7 @@ #include "oic_string.h" #include "oic_malloc.h" #include "caleutil.h" +#include "cautilinterface.h" #ifndef TIZEN_4 #include #endif @@ -63,6 +64,17 @@ static bt_gatt_h g_gattWriteCharPath = NULL; static bt_advertiser_h g_hAdvertiser = NULL; /** + * Function called just before starting advertising + * provided data are used to setServerAdvertisementData + */ +static CAAdvertisementDataGetterCB g_leServerAdvertisementDataGetter = NULL; + +/** + * Control if advertise will start automatically + */ +static bool g_leServerAutoAdvertisement = true; + +/** * Callback register with LE adapter. This callback is called on reception of any * data from the remote device. */ @@ -134,9 +146,15 @@ static bool cutom_scanrsp_flag = false; static char *custom_scanrsp_data = NULL; static int custom_scanrsp_data_length = 0; +/** + * Maximum lenght of BLE advertisement packet data size is acctually 24 bytes, + * but for safety reason 1 additional byte is allocated. + */ +const int max_ble_advertisement_packet_data_size = 25; + + CAResult_t CAsetServerAdvertisementData(const char *data, int length) { - int res = 0; CAResult_t ret = CA_STATUS_OK; OIC_LOG(DEBUG, TAG, "IN"); @@ -148,20 +166,45 @@ CAResult_t CAsetServerAdvertisementData(const char *data, int length) } oc_mutex_lock(g_leServerStateMutex); + CAsetServerAdvertisementDataImpl(data, length); + oc_mutex_unlock(g_leServerStateMutex); + OIC_LOG(DEBUG, TAG, "OUT"); + return ret; +} + +void CAsetServerAdvertisementDataImpl(const char *data, int length) +{ cutom_adv_flag = true; custom_adv_data = data; custom_adv_data_length = length; + OIC_LOG_V(DEBUG, TAG, "Custom advertise value has set as [%s]", custom_adv_data); +} + +void CAsetServerAdvertisementDataGetter(CAAdvertisementDataGetterCB getter) +{ + OIC_LOG(DEBUG, TAG, "IN"); + + oc_mutex_lock(g_leServerStateMutex); + g_leServerAdvertisementDataGetter = getter; oc_mutex_unlock(g_leServerStateMutex); - OIC_LOG_V(DEBUG, TAG, "Custom advertise value has set as [%s]", custom_adv_data); OIC_LOG(DEBUG, TAG, "OUT"); +} - return ret; +void CAsetServerAutoAdvertisement(bool auto_advertisement) +{ + OIC_LOG(DEBUG, TAG, "IN"); + + oc_mutex_lock(g_leServerStateMutex); + g_leServerAutoAdvertisement = auto_advertisement; + oc_mutex_unlock(g_leServerStateMutex); + + OIC_LOG(DEBUG, TAG, "OUT"); } -CAResult_t CAsetServerSanResponseData(const char *data, int length) +CAResult_t CAsetServerScanResponseData(const char *data, int length) { int res = 0; CAResult_t ret = CA_STATUS_OK; @@ -222,11 +265,18 @@ void CALEGattServerConnectionStateChanged(bool connected, const char *remoteAddr CARemoveLEClientInfoFromList(&g_LEClientList, remoteAddress); oc_mutex_unlock(g_LEClientListMutex); - res = CALEStartAdvertise(); - if (CA_STATUS_OK != res) + if(g_leServerAutoAdvertisement) { - OIC_LOG_V(ERROR, TAG, "Failed to start advertising [%d]", res); - return; + res = CALEStartAdvertise(); + if (CA_STATUS_OK != res) + { + OIC_LOG_V(ERROR, TAG, "Failed to start advertising [%d]", res); + return; + } + } + else + { + OIC_LOG(WARNING, TAG, "Auto advertisement is DISABLED. Advertising is not started."); } } } @@ -308,16 +358,23 @@ CAResult_t CAStartLEGattServer() CATerminateLEGattServer(); return CA_STATUS_FAILED; } - - ret = CALEStartAdvertise(); - if (CA_STATUS_OK != ret) + + if(g_leServerAutoAdvertisement) { - OIC_LOG_V(ERROR, TAG, "CALEStartAdvertise failed[%d]", ret); - oc_mutex_unlock(g_leServerStateMutex); - CATerminateLEGattServer(); - return CA_STATUS_FAILED; + ret = CALEStartAdvertise(); + if (CA_STATUS_OK != ret) + { + OIC_LOG_V(ERROR, TAG, "CALEStartAdvertise failed[%d]", ret); + oc_mutex_unlock(g_leServerStateMutex); + CATerminateLEGattServer(); + return CA_STATUS_FAILED; + } } - + else + { + OIC_LOG(WARNING, TAG, "Auto advertisement is DISABLED. Advertising is not started."); + } + g_isLEGattServerStarted = true; oc_mutex_unlock(g_leServerStateMutex); @@ -347,13 +404,31 @@ void CALENotificationCb(bool notify, bt_gatt_server_h server, bt_gatt_h gatt_han CAResult_t CALEStartAdvertise() { OIC_LOG(DEBUG, TAG, "IN"); + char * data = NULL; + + if(g_leServerAdvertisementDataGetter) + { + int length; + data = (char*) malloc(max_ble_advertisement_packet_data_size); + g_leServerAdvertisementDataGetter(max_ble_advertisement_packet_data_size, data, &length); + if(!data || length <= 0) + { + OIC_LOG(WARNING, TAG, "Invalid data. Custom advertisement data will not be set."); + } + else + { + CAsetServerAdvertisementDataImpl(data, length); + } + } CAResult_t res = CALEStartAdvertiseImpl(CA_GATT_SERVICE_UUID); if (CA_STATUS_OK != res) { OIC_LOG_V(ERROR, TAG, "CALEStartAdvertiseImpl failed[%d]", res); } - + + //This array is freed here because it's used in CALEStartAdvertiseImpl() method (freeing earlier causes bluetooth to crash) + free(data); OIC_LOG(DEBUG, TAG, "OUT"); return res; } diff --git a/resource/csdk/connectivity/util/inc/camanagerleinterface.h b/resource/csdk/connectivity/util/inc/camanagerleinterface.h index 4a0de07..f0bf2b9 100644 --- a/resource/csdk/connectivity/util/inc/camanagerleinterface.h +++ b/resource/csdk/connectivity/util/inc/camanagerleinterface.h @@ -50,7 +50,30 @@ CAResult_t CAUnsetLEClientAutoConnectionDeviceInfo(); //custom advertisement data #if defined(__TIZEN__) && defined(LE_ADAPTER) && defined(BLE_CUSTOM_ADVERTISE) +/** + * Set custom bluetooth advertisement data. + * @param[in] data Array of bluetooth advertisement data. + * @param[in] length Length of data array. + */ CAResult_t CAManagerLEServerSetAdvertisementData(const char* data, int length); + +/** + * Set custom bluetooth advertisement data getter callback. + * @param[in] getter Custom bluetooth advertisement data getter callback. + */ +void CAManagerLEServerSetAdvertisementDataGetter(CAAdvertisementDataGetterCB getter); + +/** + * Set auto advertisement enabling flag. + * @param[in] autoAdvertisement Boolean flag to turn autoadvertisement on or off. + */ +void CAManagerLEServerSetAutoAdverisement(bool autoAdvertisement); + +/** + * Scan custom bluetooth advertisement data and write it to broadcaster. + * @param[in] data Array of bluetooth advertisement data. + * @param[in] length Lenght of data array. + */ CAResult_t CAManagerLEServerSetScanResponseData(const char* data, int length); #endif diff --git a/resource/csdk/connectivity/util/src/camanager/bt_le_manager/tizen/caleconnectionmanager.c b/resource/csdk/connectivity/util/src/camanager/bt_le_manager/tizen/caleconnectionmanager.c index df46ccc..813b68e 100644 --- a/resource/csdk/connectivity/util/src/camanager/bt_le_manager/tizen/caleconnectionmanager.c +++ b/resource/csdk/connectivity/util/src/camanager/bt_le_manager/tizen/caleconnectionmanager.c @@ -89,10 +89,20 @@ CAResult_t CAManagerLEServerSetAdvertisementData(const char *data, int length) } } +void CAManagerLEServerSetAdvertisementDataGetter(CAAdvertisementDataGetterCB getter) +{ + return CAsetServerAdvertisementDataGetter(getter); +} + +void CAManagerLEServerSetAutoAdvertisement(bool autoAdvertisement) +{ + return CAsetServerAutoAdvertisement(autoAdvertisement); +} + CAResult_t CAManagerLEServerSetScanResponseData(const char *data, int length) { - CAResult_t res = CAsetServerSanResponseData(data, length); + CAResult_t res = CAsetServerScanResponseData(data, length); if (CA_STATUS_OK != res) { diff --git a/resource/csdk/connectivity/util/src/cautilinterface.c b/resource/csdk/connectivity/util/src/cautilinterface.c index 1e84239..756a9fa 100644 --- a/resource/csdk/connectivity/util/src/cautilinterface.c +++ b/resource/csdk/connectivity/util/src/cautilinterface.c @@ -217,6 +217,14 @@ CAResult_t CASetAdvertisementData(const char* data, int length) { return CAManagerLEServerSetAdvertisementData(data, length); } +void CASetAdvertisementDataGetter(CAAdvertisementDataGetterCB getter) +{ + return CAManagerLEServerSetAdvertisementDataGetter(getter); +} +void CASetAutoAdvertisement(bool autoAdvertisement) +{ + return CAManagerLEServerSetAutoAdvertisement(autoAdvertisement); +} CAResult_t CASetScanResponseData(const char* data, int length) { return CAManagerLEServerSetScanResponseData(data, length); diff --git a/resource/include/CAManager.h b/resource/include/CAManager.h index 1ac687f..0157b9e 100644 --- a/resource/include/CAManager.h +++ b/resource/include/CAManager.h @@ -22,6 +22,7 @@ #define CA_MANAGER_H_ #include +#include "cacommon.h" namespace OC { @@ -128,6 +129,26 @@ namespace OC //Custom advertise #if defined(__TIZEN__) && defined(LE_ADAPTER) && defined(BLE_CUSTOM_ADVERTISE) OCStackResult setAdvertisementData(const char* data, int length); + + /** + * Set function that will be called before starting advertising. + * Provided data and length will be used to set advertisement data. + * @param[in] getter Custom bluetooth advertisement data getter callback. + */ + void setAdvertisementDataGetter(CAAdvertisementDataGetterCB getter); + + /** + * set if advertising should be started automatically. + * By default advertising is automatically started. + * @param[in] autoAdvertisement true for automatic start + */ + void setAutoAdvertisement(bool autoAdvertisement); + + /** + * Scan and set data for custom bluetooth advertisement. + * @param[in] data Array with custom bluetooth advertisement data. + * @param[in] lenght Lenght of data array. + */ OCStackResult setScanResponseData(const char* data, int length); #endif diff --git a/resource/src/CAManager.cpp b/resource/src/CAManager.cpp index cb9ea40..4743939 100644 --- a/resource/src/CAManager.cpp +++ b/resource/src/CAManager.cpp @@ -168,7 +168,14 @@ OCStackResult CAManager::setAdvertisementData(const char* data, int length) return convertCAResultToOCResult(ret); } - +void CAManager::setAdvertisementDataGetter(CAAdvertisementDataGetterCB getter) +{ + return CASetAdvertisementDataGetter(getter); +} +void CAManager::setAutoAdvertisement(bool autoAdvertisement) +{ + return CASetAutoAdvertisement(autoAdvertisement); +} OCStackResult CAManager::setScanResponseData(const char* data, int length) { CAResult_t ret = CASetScanResponseData(data, length); -- 2.7.4