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

HID and NUS

Hello,

I am attempting to incorporate NUS example (app_uart) into the HID keyboard example. The whole thing compiles with no warning, but when I add {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE} to m_adv_uuids, the adverstising never starts. I was able to locate where it fails through the debugger. When it enters the line APP_ERROR_CHECK(err_code) it fails.

static void advertising_init(void)
{
    uint32_t               err_code;
    uint8_t                adv_flags;
    ble_advertising_init_t init;

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

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

    init.config.ble_adv_whitelist_enabled          = true;
    init.config.ble_adv_directed_high_duty_enabled = true;
    init.config.ble_adv_directed_enabled           = false;
    init.config.ble_adv_directed_interval          = 0;
    init.config.ble_adv_directed_timeout           = 0;
    init.config.ble_adv_fast_enabled               = true;
    init.config.ble_adv_fast_interval              = APP_ADV_FAST_INTERVAL;
    init.config.ble_adv_fast_timeout               = APP_ADV_FAST_DURATION;
    init.config.ble_adv_slow_enabled               = true;
    init.config.ble_adv_slow_interval              = APP_ADV_SLOW_INTERVAL;
    init.config.ble_adv_slow_timeout               = APP_ADV_SLOW_DURATION;

    init.evt_handler   = on_adv_evt;
    init.error_handler = ble_advertising_error_handler;

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

I have tried the same with OTS and altough I wasn't able to communicate trough it I was able to advertise it. I have defined the following in sdk_config.h :

#define BLE_NUS_ENABLED 1

Any idea on what could cause an advertising failure?

Parents Reply Children
  • Hello, the error code is 0x07, which if I get right is NRF_ERROR_INVALID_PARAM. If I am not mistaken, since the NUS is a vendor defined UUID, it has a length of 128 bits, while the HID has 16 bits, right? I'm not quite sure how I am supposed to merge these two.

    I attempted to replicate the ble_app_uart example where it uses a NUS profile, and temporarily commented out the HID part to see if I could make it work alone, but with no success. When you say "Too much in the advertising packet", you're talking about the advertising uuid list, correct?

  • Sorry, I see now what you mean. I have found out here what is the advertising packet. I know how to reduce the size taken by my device name, but it's not enough. I would need to reduce the data field of the NUS, but I'm not sure where to edit that. Probably in ble_nus.h. I will continue to look.

  • Hi,

    Which function returns the error code now? and is it still NRF_ERROR_INVALID_PARAM?

  • Hello, yes it is still the same error and it is the same function as before that returns it.

    I have shortened the advertising packet as much as I think I could :

    No device name = 0 byte

    -BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE flag = 3 bytes(?)

    -HID = 4 bytes (Altough I have two reports for this profile, could it make it longer? Let's assume 8)

    -BAS = Not sure about this one, I did not find where it says it is advertised, but I would assume it takes 4 more bytes...

    -NUS = For the sake of testing, I have reduced BLE_NUS_MAX_DATA_LEN to 1. I don't know if the fact that there is both RX and TX extends the space taken by the NUS, I assume it does. For my application I don't need TX. (data(1) + manufacturer ID(2) + length(1) + type(2?) = 6 bytes?)

    In total I think that would make 17-21 bytes, no? I must be wrong because if so it should work if it's under 31 bytes...

  • OK, so you get NRF_ERROR_INVALID_PARAM returned from ble_advertising_init()? Which SDK are you using?

    Assuming SDK 15.2, this means that the error probably comes from ble_advdata_encode(). That function is responsible for encoding the advertisement packet and is quite easy to understand. Essentially there is an if statement for each field, so you can check with a debugger which fails (which is invalid).

Related