int32_t CASendLEData(const void *data, uint32_t dataLen)
{
    OIC_LOG(DEBUG, TAG, "IN");
    char header[CA_HEADER_LENGTH] = {0};

    CAResult_t result = CAGenerateHeader(header, dataLen);

    if (CA_STATUS_OK != result)
    {
        return -1;
    }

    if (!CAIsBleConnected())
    {
        OIC_LOG(DEBUG, TAG, "le not conn");
        return -1;
    }

    CAUpdateCharacteristicsInGattServer(header, CA_HEADER_LENGTH);
    int32_t dataLimit = dataLen / CA_SUPPORTED_BLE_MTU_SIZE;
    int32_t iter = 0;
    for (iter = 0; iter < dataLimit; iter++)
    {
        CAUpdateCharacteristicsInGattServer((data + (iter * CA_SUPPORTED_BLE_MTU_SIZE)),
                                                CA_SUPPORTED_BLE_MTU_SIZE);
        CABleDoEvents();
    }

    CAUpdateCharacteristicsInGattServer((data + (dataLimit * CA_SUPPORTED_BLE_MTU_SIZE)),
                                            dataLen % CA_SUPPORTED_BLE_MTU_SIZE);
    CABleDoEvents();
    OIC_LOG(DEBUG, TAG, "writebytes done");
    OIC_LOG(DEBUG, TAG, "OUT");
    // Arduino BLEWrite doesnot return value. So, Return the received DataLength
    return dataLen;
}
uint32_t CASendLEMulticastData(void *data, uint32_t dataLen)
{
    OCLog(DEBUG, CALEADAPTER_TAG, "IN");

    //Input validation
    VERIFY_NON_NULL(data, NULL, "Data is null");

    if (0 >= dataLen)
    {
        OCLog(ERROR, CALEADAPTER_TAG, "Invalid Parameter");
        return 0;
    }

    CAResult_t result = CA_STATUS_FAILED;
#ifdef __TIZEN__
    pthread_mutex_lock(&gBleIsServerMutex);
    if (gIsServer)
    {
        result = CAUpdateCharacteristicsInGattServer(data, dataLen);
        if (CA_STATUS_OK != result)
        {
            OCLogv(ERROR, CALEADAPTER_TAG,
                    "[CASendLEMulticastData] updating data in server is failed");
            pthread_mutex_unlock(&gBleIsServerMutex);
            return 0;
        }
    }
    else
    {
        result = CAUpdateCharacteristicsToAllGattServers(data, dataLen);
        if (CA_STATUS_OK != result)
        {
            OCLogv(ERROR, CALEADAPTER_TAG,
                    "[SendLEMulticastDataToAll] multicasting data to servers failed" );
            pthread_mutex_unlock(&gBleIsServerMutex);
            return 0;
        }
    }
    pthread_mutex_unlock(&gBleIsServerMutex);
#else
    char *tempPath = "temp_path";
    updateCharacteristicsInGattServer(tempPath, (char *) data, dataLen);
#endif //#ifdef __TIZEN__
    OCLog(DEBUG, CALEADAPTER_TAG, "OUT");
    return dataLen;
}
uint32_t CASendLEUnicastData(const CARemoteEndpoint_t *endpoint, void *data, uint32_t dataLen)
{
    OCLog(DEBUG, CALEADAPTER_TAG, "IN");

    //Input validation
    VERIFY_NON_NULL(endpoint, NULL, "Remote endpoint is null");
    VERIFY_NON_NULL(data, NULL, "Data is null");

    CAResult_t result = CA_STATUS_FAILED;

#ifdef __TIZEN__
    pthread_mutex_lock(&gBleIsServerMutex);
    if (gIsServer)
    {
        result = CAUpdateCharacteristicsInGattServer(data, dataLen);
        if (CA_STATUS_OK != result)
        {
            OCLogv(ERROR, CALEADAPTER_TAG,
                    "[SendLEUnicastData] sending unicast data to [%s] failed\n", endpoint->addressInfo.BT.btMacAddress);
            pthread_mutex_unlock(&gBleIsServerMutex);
            return 0;
        }
    }
    else
    {

        result = CAUpdateCharacteristicsToGattServer(endpoint->addressInfo.BT.btMacAddress, data,
                dataLen, UNICAST, 0);
        if (CA_STATUS_OK != result)
        {
            OCLogv(ERROR, CALEADAPTER_TAG,
                    "[SendLEUnicastData] sending unicast data to [%s] failed\n", endpoint->addressInfo.BT.btMacAddress);
            pthread_mutex_unlock(&gBleIsServerMutex);
            return 0;
        }
    }
    pthread_mutex_unlock(&gBleIsServerMutex);
#else
    char *tempPath = "temp_path";
    updateCharacteristicsInGattServer(tempPath, (char *) data, dataLen);
#endif //#ifdef __TIZEN__
    OCLog(DEBUG, CALEADAPTER_TAG, "OUT");

    return dataLen;
}