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

How to correctly receive a value sent by notification, on my nRF51 DK

Hi all, i am experiencing a problem, that i exposed maybe not so clearly on other topics; i have a a smart beacon kit that is sending temperature values by notification (as done in the tutorial devzone.nordicsemi.com/.../ and it works, i see the values connecting to my android phone with MCP on it), and i want them to be received by my nrf51 DK and then be sent to the PC. My problem now is that the DK doesn't seem to receive the values! What i have done on the DK is simply discover the wanted name of the device (my beacon's name) and then connect to it (and this happens, i see it with a LED turning on); then just by connecting the two devices i should find the values on my DK in:

p_ble_evt->evt.gattc_evt.params.hvx.data;

Is this correct? Or, more specifically, there is something precise i have to write (an instruction or something) that need to be added in order to receive the values on the DK or it is enough to connect the two devices? Please do not link any tutorial or examples because i have widely read all of them trying to figure out by myself the problem ^^'

projects.rar

Parents
  • There are several ways of doing this, but I will use ble_app_uart_c as a reference.

    As I mentioned above you need to discover your service, you can use the Database Discovery Module to this. See the SDK documentation and my answer here may also be helpful. ble_app_uart_c discovers the UART service, you need to discover your service. You can see that ble_db_discovery_evt_register() is called inside ble_nus_c_init().

    In on_ble_evt() you can see that when you get the BLE_GAP_EVT_CONNECTED event service discovery is started with ble_db_discovery_start(). When a service is discovered db_disc_handler() will be called, which calls ble_nus_c_on_db_disc_evt(). This checks if the correct service was discovered and stores the attribute handles of the characteristic values and the CCCD. It then sends the BLE_NUS_C_EVT_DISCOVERY_COMPLETE event to ble_nus_c_evt_handler() in main.c. This event triggers ble_nus_c_rx_notif_enable() which writes 0x0001 to the CCCD of the characteristic that shall send notifications. Before the CCCD is set to 0x0001 the peripheral will not be able to send notifications.

    If you get a notification from the peripheral you will get the BLE_GATTC_EVT_HVX event, in this you can find your data.

Reply
  • There are several ways of doing this, but I will use ble_app_uart_c as a reference.

    As I mentioned above you need to discover your service, you can use the Database Discovery Module to this. See the SDK documentation and my answer here may also be helpful. ble_app_uart_c discovers the UART service, you need to discover your service. You can see that ble_db_discovery_evt_register() is called inside ble_nus_c_init().

    In on_ble_evt() you can see that when you get the BLE_GAP_EVT_CONNECTED event service discovery is started with ble_db_discovery_start(). When a service is discovered db_disc_handler() will be called, which calls ble_nus_c_on_db_disc_evt(). This checks if the correct service was discovered and stores the attribute handles of the characteristic values and the CCCD. It then sends the BLE_NUS_C_EVT_DISCOVERY_COMPLETE event to ble_nus_c_evt_handler() in main.c. This event triggers ble_nus_c_rx_notif_enable() which writes 0x0001 to the CCCD of the characteristic that shall send notifications. Before the CCCD is set to 0x0001 the peripheral will not be able to send notifications.

    If you get a notification from the peripheral you will get the BLE_GATTC_EVT_HVX event, in this you can find your data.

Children
Related