예제 #1
0
void CAStartLEGattServerThread(void *data)
{
    OIC_LOG(DEBUG, TAG, "IN");
    ca_mutex_lock(g_leServerStateMutex);
    if (true == g_isLEGattServerStarted)
    {
        OIC_LOG(ERROR, TAG, "Gatt Server is already running");
        ca_mutex_unlock(g_leServerStateMutex);
        CATerminateLEGattServer();
        return;
    }

    CAResult_t ret  =  CAInitLEGattServer();
    if (CA_STATUS_OK != ret)
    {
        OIC_LOG_V(ERROR, TAG, "CAInitLEGattService failed[%d]", ret);
        ca_mutex_unlock(g_leServerStateMutex);
        CATerminateLEGattServer();
        return;
    }

    char *serviceUUID = CA_GATT_SERVICE_UUID;

    ret  = CAAddNewLEServiceInGattServer(serviceUUID);
    if (CA_STATUS_OK != ret)
    {
        OIC_LOG_V(ERROR, TAG, "CAAddNewLEServiceInGattServer failed[%d]", ret);
        ca_mutex_unlock(g_leServerStateMutex);
        CATerminateLEGattServer();
        return;
    }

    static const char charReadUUID[] = CA_GATT_RESPONSE_CHRC_UUID;
    char charReadValue[] = {33, 44, 55, 66}; // These are initial random values

    // For Read Characteristics.
    ret = CAAddNewCharacteristicsToGattServer(g_gattSvcPath, charReadUUID, charReadValue,
                                              CA_LE_INITIAL_BUF_SIZE, true);
    if (CA_STATUS_OK != ret)
    {
        OIC_LOG_V(ERROR, TAG, "CAAddNewCharacteristicsToGattServer failed[%d]", ret);
        ca_mutex_unlock(g_leServerStateMutex);
        CATerminateLEGattServer();
        return;
    }

    static const char charWriteUUID[] = CA_GATT_REQUEST_CHRC_UUID;
    char charWriteValue[] = {33, 44, 55, 66}; // These are initial random values


    ret = CAAddNewCharacteristicsToGattServer(g_gattSvcPath, charWriteUUID, charWriteValue,
            CA_LE_INITIAL_BUF_SIZE, false); // For Write Characteristics.
    if (CA_STATUS_OK != ret )
    {
        OIC_LOG_V(ERROR, TAG, "CAAddNewCharacteristicsToGattServer failed[%d]", ret);
        ca_mutex_unlock(g_leServerStateMutex);
        CATerminateLEGattServer();
        return;
    }

    ret = CARegisterLEServicewithGattServer(g_gattSvcPath);
    if (CA_STATUS_OK != ret )
    {
        OIC_LOG_V(ERROR, TAG, "CARegisterLEServicewithGattServer failed[%d]", ret);
        ca_mutex_unlock(g_leServerStateMutex);
        CATerminateLEGattServer();
        return;
    }

    ret = CALEStartAdvertise(serviceUUID);
    if (CA_STATUS_OK != ret)
    {
        OIC_LOG_V(ERROR, TAG, "CALEStartAdvertise failed[%d]", ret);
        ca_mutex_unlock(g_leServerStateMutex);
        CATerminateLEGattServer();
        return;
    }

    g_isLEGattServerStarted = true;

    ca_mutex_unlock(g_leServerStateMutex);

    OIC_LOG(DEBUG, TAG, "LE Server initialization complete.");

    GMainContext *thread_context = NULL;

    thread_context = g_main_context_new();

    g_eventLoop = g_main_loop_new(thread_context, FALSE);

    g_main_context_push_thread_default(thread_context);

    g_main_loop_run(g_eventLoop);

    OIC_LOG(DEBUG, TAG, "OUT");
}
예제 #2
0
CAResult_t CAStartLEGattServer()
{
    OIC_LOG(DEBUG, TAG, "IN");

    oc_mutex_lock(g_leServerStateMutex);
    if (true == g_isLEGattServerStarted)
    {
        OIC_LOG(ERROR, TAG, "Gatt Server is already running");
        oc_mutex_unlock(g_leServerStateMutex);
        return CA_STATUS_OK;
    }

    CAResult_t ret = CAInitLEGattServer();
    if (CA_STATUS_OK != ret)
    {
        OIC_LOG_V(ERROR, TAG, "CAInitLEGattServer failed[%d]", ret);
        oc_mutex_unlock(g_leServerStateMutex);
        CATerminateLEGattServer();
        return CA_STATUS_FAILED;
    }

    ret  = CAAddNewLEServiceInGattServer(CA_GATT_SERVICE_UUID);
    if (CA_STATUS_OK != ret)
    {
        OIC_LOG_V(ERROR, TAG, "CAAddNewLEServiceInGattServer failed[%d]", ret);
        oc_mutex_unlock(g_leServerStateMutex);
        CATerminateLEGattServer();
        return CA_STATUS_FAILED;
    }

    static const char charReadUUID[] = CA_GATT_RESPONSE_CHRC_UUID;
    char charReadValue[] = {33, 44, 55, 66}; // These are initial random values

    // For Read Characteristics.
    ret = CAAddNewCharacteristicsToGattServer(g_gattSvcPath, charReadUUID, charReadValue,
                                              CA_LE_INITIAL_BUF_SIZE, true);
    if (CA_STATUS_OK != ret)
    {
        OIC_LOG_V(ERROR, TAG, "CAAddNewCharacteristicsToGattServer failed[%d]", ret);
        oc_mutex_unlock(g_leServerStateMutex);
        CATerminateLEGattServer();
        return CA_STATUS_FAILED;
    }

    static const char charWriteUUID[] = CA_GATT_REQUEST_CHRC_UUID;
    char charWriteValue[] = {33, 44, 55, 66}; // These are initial random values


    ret = CAAddNewCharacteristicsToGattServer(g_gattSvcPath, charWriteUUID, charWriteValue,
            CA_LE_INITIAL_BUF_SIZE, false); // For Write Characteristics.
    if (CA_STATUS_OK != ret )
    {
        OIC_LOG_V(ERROR, TAG, "CAAddNewCharacteristicsToGattServer failed[%d]", ret);
        oc_mutex_unlock(g_leServerStateMutex);
        CATerminateLEGattServer();
        return CA_STATUS_FAILED;
    }

    ret = CARegisterLEServicewithGattServer(g_gattSvcPath);
    if (CA_STATUS_OK != ret )
    {
        OIC_LOG_V(ERROR, TAG, "CARegisterLEServicewithGattServer failed[%d]", ret);
        oc_mutex_unlock(g_leServerStateMutex);
        CATerminateLEGattServer();
        return CA_STATUS_FAILED;
    }

    /*
     * TV Easysetup does not use IoTivity BLE advertisement.
     */

    // 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;
    // }

    g_isLEGattServerStarted = true;

    oc_mutex_unlock(g_leServerStateMutex);

    OIC_LOG(DEBUG, TAG, "OUT");
    return CA_STATUS_OK;
}