This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Merge lbs and bps examples

Hello, I tried to merged two examples from SDK

1) I run ble_app_bps example from SDK 15.0 HW - PCA10056, nRF52840

2) I included to the main.c

#include "ble_lbs.h"

3) I defined in sdk_condif.h

#define NRF_LOG_ENABLED 1
#define NRF_LOG_BACKEND_RTT_ENABLED 1
#define BLE_LBS_ENABLED 1
#define NRF_SDH_BLE_VS_UUID_COUNT 1
#define NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE 1760
#define NRF_SDH_BLE_SERVICE_CHANGE
D 1

4) I added service's UUID to the advertising packet

static ble_uuid_t m_sr_uuids[] =
{
    {LBS_UUID_BASE, BLE_UUID_TYPE_VENDOR_BEGIN}
};

static void advertising_init(void)
{
    ret_code_t             err_code;
    ble_advertising_init_t init;

    memset(&init, 0, sizeof(init));

    init.advdata.name_type               = BLE_ADVDATA_FULL_NAME;
    init.advdata.include_appearance      = true;
    init.advdata.flags                   = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
    init.advdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
    init.advdata.uuids_complete.p_uuids  = m_adv_uuids;

    /* I added this lines-> */ init.srdata.uuids_complete.uuid_cnt = sizeof(m_sr_uuids) / sizeof(m_sr_uuids[0]);
    /* I added this lines-> */ init.srdata.uuids_complete.p_uuids  = m_sr_uuids;

    init.config.ble_adv_fast_enabled  = true;
    init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
    init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;

    init.evt_handler = on_adv_evt;

    err_code = ble_advertising_init(&m_advertising, &init);
    APP_ERROR_CHECK(err_code);

    ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
}

5) I added service initialization to the services_init function

static void services_init(void)
{
    uint32_t           err_code;
    ble_bps_init_t     bps_init;
    ble_bas_init_t     bas_init;
    ble_dis_init_t     dis_init;
    /* I added this lines-> */ ble_lbs_init_t     lbs_init;
    ble_dis_sys_id_t   sys_id;
    nrf_ble_qwr_init_t qwr_init = {0};

    // Initialize Queued Write Module
    qwr_init.error_handler = nrf_qwr_error_handler;

    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
    APP_ERROR_CHECK(err_code);

    // Initialize LBS.
    /* I added this lines-> */ memset(&lbs_init, 0, sizeof(lbs_init));

    /* I added this lines-> */ lbs_init.led_write_handler = led_write_handler;

    /* I added this lines-> */ err_code = ble_lbs_init(&m_lbs, &lbs_init);
    /* I added this lines-> */ APP_ERROR_CHECK(err_code);

    // Initialize Blood Pressure Service.
    memset(&bps_init, 0, sizeof(bps_init));

    bps_init.evt_handler = on_bps_evt;
    bps_init.feature     = BLE_BPS_FEATURE_BODY_MOVEMENT_BIT |
                           BLE_BPS_FEATURE_MEASUREMENT_POSITION_BIT;

    // Here the sec level for the Blood Pressure Service can be changed/increased.
    BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&bps_init.bps_meas_attr_md.cccd_write_perm);
    BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(&bps_init.bps_meas_attr_md.read_perm);
    BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(&bps_init.bps_meas_attr_md.write_perm);

    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&bps_init.bps_feature_attr_md.read_perm);
    BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(&bps_init.bps_feature_attr_md.write_perm);

    err_code = ble_bps_init(&m_bps, &bps_init);
    APP_ERROR_CHECK(err_code);

    // Initialize Battery Service.
    memset(&bas_init, 0, sizeof(bas_init));

    // Here the sec level for the Battery Service can be changed/increased.
    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&bas_init.battery_level_char_attr_md.cccd_write_perm);
    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&bas_init.battery_level_char_attr_md.read_perm);
    BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(&bas_init.battery_level_char_attr_md.write_perm);

    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&bas_init.battery_level_report_read_perm);

    bas_init.evt_handler          = NULL;
    bas_init.support_notification = true;
    bas_init.p_report_ref         = NULL;
    bas_init.initial_batt_level   = 100;

    err_code = ble_bas_init(&m_bas, &bas_init);
    APP_ERROR_CHECK(err_code);

    // Initialize Device Information Service.
    memset(&dis_init, 0, sizeof(dis_init));

    ble_srv_ascii_to_utf8(&dis_init.manufact_name_str, MANUFACTURER_NAME);
    ble_srv_ascii_to_utf8(&dis_init.model_num_str, MODEL_NUM);

    sys_id.manufacturer_id            = MANUFACTURER_ID;
    sys_id.organizationally_unique_id = ORG_UNIQUE_ID;
    dis_init.p_sys_id                 = &sys_id;

    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&dis_init.dis_attr_md.read_perm);
    BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(&dis_init.dis_attr_md.write_perm);

    err_code = ble_dis_init(&dis_init);
    APP_ERROR_CHECK(err_code);
}

As a result:

1) I can not understand, why nRF Connect shows Unknown Service, why doesn't recognize this service like LED Button Service. When I run LED Button Service example, the application can recognize it 

2) Why I can not see service and characteristics at the Attribute Table.

 

Parents
  • Hi Danik, 

    1. It's because you used the LBS_UUID_BASE, instead of the LBS_UUID_SERVICE. The LBS_UUID_BASE is only the base. The service UUID is the combination of LBS_UUID_SERVICE and LBS_UUID_BASE . Please follow exactly what we have in the lbs example. 

    2. Most likely it's because of the GATT table cache (the phone didn't do service discovery again, it assume the GATT table wasn't change). You can clear it by turn off and on Bluetooth on the phone. 

Reply
  • Hi Danik, 

    1. It's because you used the LBS_UUID_BASE, instead of the LBS_UUID_SERVICE. The LBS_UUID_BASE is only the base. The service UUID is the combination of LBS_UUID_SERVICE and LBS_UUID_BASE . Please follow exactly what we have in the lbs example. 

    2. Most likely it's because of the GATT table cache (the phone didn't do service discovery again, it assume the GATT table wasn't change). You can clear it by turn off and on Bluetooth on the phone. 

Children
No Data
Related