| Adding OIC Sensor Support to the bleprph\_oic Application |
| --------------------------------------------------------- |
| |
| This tutorial shows you how to modify and add OIC sensor support to the |
| **bleprph\_oic** application. This tutorial assumes that have you |
| completed the :doc:`Enabling OIC Sensor Data Monitoring in the sensors\_test |
| Application Tutorial <sensor_nrf52_bno055_oic>` |
| |
| Like the other off-board sensor tutorials, this tutorial uses an |
| nRF52-DK board connected to an off-board BNO055 sensor device. |
| |
| This tutorial shows you how to: |
| |
| - Modify the bleprph\_oic application to add OIC sensor support. |
| - Create and build the target for the new application. |
| - Use the Mynewt Smart Device Controller iOS or Android app to view the |
| sensor data from the device. |
| |
| .. contents:: |
| :local: |
| :depth: 2 |
| |
| Prerequisites |
| ~~~~~~~~~~~~~ |
| |
| - Read the :doc:`Overview of OIC Support in the Sensor |
| Framework <sensor_oic_overview>` |
| - Complete the tasks described in the :doc:`Enabling OIC Sensor Data |
| Monitoring in the sensors_test Application <sensor_nrf52_bno055_oic>` |
| tutorial. |
| |
| Overview on How to Add OIC Sensor Support to a BLE Application |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The sensor framework makes it very easy to add OIC sensor support to an |
| existing BLE application. The sensor framework exports the |
| ``sensor_oic_init()`` function that an application calls to create the |
| OIC resources for the sensors and to set up the handlers to process CoAP |
| requests for the resources. |
| |
| An application uses the ``oc`` server API in the ``net/oic`` package to |
| implement OIC server functionality. An application defines an OIC |
| application initialization handler that sets up the OIC resources it |
| supports. The ``oc_main_init()`` function, that an application calls |
| during initialization in ``main()``, calls the OIC application handler. |
| |
| To add OIC sensor support, we modify the bleprph\_oic application to |
| call the ``sensor_oic_init()`` function in the OIC application |
| initialization handler. |
| |
| Step 1: Copying the bleprph\_oic source |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| 1. Copy the @apache-mynewt-core/apps/bleprph\_oic to a new package. We |
| name the new package **apps/bleprph\_oic\_sensor**. From your project |
| base directory, run the ``newt pkg copy`` command: |
| |
| .. code-block:: console |
| |
| |
| $ newt pkg copy @apache-mynewt-core/apps/bleprph_oic @apache-mynewt-core/apps/bleprph_oic_sensor |
| Copying package @apache-mynewt-core/apps/bleprph_oic to @apache-mynewt-core/apps/bleprph_oic_sensor |
| |
| 2. The newt tools creates the ``bleprph_oic_sensor`` package in the |
| ``~/dev/myproj/repos/apache-mynewt-core/apps/bleprph_oic_sensor`` |
| directory. Go to the directory to update the package ``pkg.yml`` and |
| source files. |
| |
| .. code-block:: console |
| |
| |
| $ cd repos/apache-mynewt-core/apps/bleprph_oic_sensor |
| |
| Step 2: Adding Package Dependencies |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Add the ``hw/sensor/`` and the ``hw/sensor/creator`` packages as |
| dependencies in the ``pkg.yml`` file to include the sensor framework and |
| off-board sensor support. |
| |
| **Note:** The ``hw/sensor`` package automatically includes the |
| ``net/oic`` package when the ``SENSOR_OIC`` setting is enabled, so you |
| do not need to include the ``net/oic`` package as a dependency in this |
| package. |
| |
| .. code-block:: console |
| :emphasize-lines: 13, 14 |
| |
| pkg.deps: |
| - kernel/os |
| - net/nimble/controller |
| - net/nimble/host |
| - net/nimble/host/services/gap |
| - net/nimble/host/services/gatt |
| - net/nimble/host/store/ram |
| - net/nimble/transport/ram |
| |
| |
| |
| ... |
| - hw/sensor |
| - hw/sensor/creator |
| |
| |
| Step 3: Setting Syscfg Values to Enable OIC Support |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| |
| Add the following setting values to ``syscfg.vals`` in the |
| ``syscfg.yml`` file: |
| |
| - ``SENSOR_OIC: 1``: This setting enables OIC sensor support in the |
| ``hw/sensors`` package. |
| - ``OC_SERVER: 1`` : This setting enables OIC server support in the |
| ``net/oic`` package. |
| - ``FLOAT_USER: 1``: This setting enables floating pointing support in |
| the encoding/tinycbor package. |
| - ``ADVERTISE_128BIT_UUID: 1`` and ``ADVERTISE_16BIT_UUID: 0``: These |
| settings enable BLE 128 bit UUID and disables 16 bit UUID |
| advertisement. The IoTivity library that is used to build the OIC |
| Apps on the iOS and Android devices only sees 128 bit UUID |
| advertisements. |
| |
| .. code-block:: console |
| :emphasize-lines: 4, 5, 6, 7, 8 |
| |
| syscfg.vals: |
| ... |
| |
| SENSOR_OIC: 1 |
| OC_SERVER: 1 |
| FLOAT_USER: 1 |
| ADVERTISE_128BIT_UUID: 1 |
| ADVERTISE_16BIT_UUID: 0 |
| |
| Step 4: Modifying main.c |
| ~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The bleprph\_oic application defines the ``omgr_app_init()`` function |
| for the OIC application initialization handler. The function creates an |
| OIC light resource. We modify the function to call the |
| ``sensor_oic_init()`` function to create the OIC sensor resources |
| instead of creating the OIC light resource. |
| |
| We make the following modifications to main.c: |
| |
| - Add the sensor package header file. |
| - Modify the ``omgr_app_init()`` function to call the |
| ``sensor_oic_init()`` function, and delete the code to create the OIC |
| light resource. |
| - Delete the OIC application request handler functions that process the |
| CoAP requests for the light resource. |
| |
| Adding the Sensor Package Header File: |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| |
| Add the sensor package header file ``sensor/sensor.h`` below |
| ``#include "bleprph.h"`` file: |
| |
| .. code-block:: console |
| :emphasize-lines: 4 |
| |
| #include "bleprph.h" |
| |
| #include <sensor/sensor.h> |
| |
| Modifying the omgr\_app\_init() Function |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| Make the following modifications to the ``omgr_app_init()`` function: |
| |
| 1. Delete the code segment that creates the OIC device and resource. |
| The lines to delete are highlighted below: |
| |
| .. code-block:: console |
| :emphasize-lines: 4, 6, 7, 8, 10, 11, 12, 13, 15, 16, 17, 18, 19 |
| |
| static void |
| omgr_app_init(void) |
| { |
| oc\_resource_t *res; |
| |
| oc_init_platform("MyNewt", NULL, NULL); |
| oc_add_device("/oic/d", "oic.d.light", "MynewtLed", "1.0", "1.0", NULL, |
| NULL); |
| |
| res = oc_new_resource("/light/1", 1, 0); |
| oc_resource_bind_resource_type(res, "oic.r.light"); |
| oc_resource_bind_resource_interface(res, OC_IF_RW); |
| oc_resource_set_default_interface(res, OC_IF_RW); |
| |
| oc_resource_set_discoverable(res); |
| oc_resource_set_periodic_observable(res, 1); |
| oc_resource_set_request_handler(res, OC_GET, app_get_light); |
| oc_resource_set_request_handler(res, OC_PUT, app_set_light); |
| oc_add_resource(res); |
| |
| } |
| |
| 2. Add the following``oc_add_device()`` function call |
| to create an OIC resource for the sensor device: |
| |
| .. code-block:: c |
| :emphasize-lines: 7 |
| |
| static void |
| omgr_app_init(void) |
| { |
| |
| oc_init_platform("MyNewt", NULL, NULL); |
| |
| oc_add_device("/oic/d", "oic.d.sensy", "sensy", "1.0", "1.0", NULL, NULL); |
| |
| } |
| |
| 3. Add the call to the ``sensor_oic_init()`` function to initialize the |
| sensor framework OIC server support: |
| |
| .. code-block:: c |
| :emphasize-lines: 9 |
| |
| static void |
| omgr_app_init(void) |
| { |
| |
| oc_init_platform("MyNewt", NULL, NULL); |
| |
| oc_add_device("/oic/d", "oic.d.sensy", "sensy", "1.0", "1.0", NULL, NULL); |
| |
| sensor_oic_init(); |
| |
| } |
| |
| Deleting the app\_get\_light() and app\_set\_light() Functions |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| |
| Since we modify the application to no longer create an OIC light |
| resource, the ``app_get_light()`` and the ``app_set_light()`` handler |
| functions that process read and write requests are not used. We need to |
| delete the functions to avoid compilation errors. Search for the two |
| functions and delete them. |
| |
| Step 5: Creating and Building the Application Image |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| |
| In this step of the tutorial we create and build an application image |
| for the bleprph\_oic\_sensor application to verify that the application |
| serves sensor data over OIC correctly. |
| |
| We use the same syscfg settings from the :doc:`Enabling OIC Sensor Data |
| Monitoring in the sensors\_test Application Tutorial |
| <sensor_nrf52_bno055_oic>` |
| |
| 1. From your project base directory, run the ``newt create target`` |
| command to create a new target named ``nrf52_bleprph_oic_bno055``: |
| |
| .. code-block:: console |
| |
| |
| $ newt target create nrf52_bleprph_oic_bno055 |
| Target targets/nrf52_bleprph_oic_bno055 successfully created |
| |
| 2. Run the ``newt target set`` command to set the app, bsp, and |
| build\_profile variables for the target. |
| |
| .. code-block:: console |
| |
| |
| $ newt target set nrf52_bleprph_oic_bno055 app=@apache-mynewt-core/apps/bleprph_oic_sensor bsp=@apache-mynewt-core/hw/bsp/nrf52dk build_profile=debug |
| Target targets/nrf52_bleprph_oic_bno055 successfully set target.app to @apache-mynewt-core/apps/bleprph_oic_sensor |
| Target targets/nrf52_bleprph_oic_bno055 successfully set target.bsp to @apache-mynewt-core/hw/bsp/nrf52dk |
| Target targets/nrf52_bleprph_oic_bno055 successfully set target.build_profile to debug |
| $ |
| |
| 3. Run the ``newt target set`` command to set ``I2C_0=1``, |
| ``BNO055_OFB=1``, ``BLE_MAX_CONNECTIONS=4``, ``MSYS_1_BLOCK_COUNT=52``, |
| ``MSYS_1_BLOCK_SIZE=100``, and ``OC_APP_RESOURCES=11``. |
| |
| .. code-block:: console |
| |
| |
| $ newt target set nrf52_bleprph_oic_bno055 syscfg=BNO055_OFB=1:I2C_0=1:BLE_MAX_CONNECTIONS=4:MSYS_1_BLOCK_COUNT=52:MSYS_1_BLOCK_SIZE=100:OC_APP_RESOURCES=11 |
| Target targets/nrf52_bleprph_oic_bno055 successfully set target.syscfg to BNO055_OFB=1:I2C_0=1:BLE_MAX_CONNECTIONS=4:MSYS_1_BLOCK_COUNT=52:MSYS_1_BLOCK_SIZE=100:OC_APP_RESOURCES=11 |
| $ |
| |
| 4. Run the ``newt build nrf52_bleprph_oic_bno055`` and |
| ``newt create-image nrf52_bleprph_oic_bno055 1.0.0`` commands to build |
| and create the application image. |
| |
| Step 6: Connecting the Sensor and Loading the Images to the Board |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| |
| Perform the following steps to reboot the board with the new images: |
| |
| 1. Connect the BNO055 sensor to the nRF52-DK board. See the :doc:`Enabling an |
| Off-Board Sensor in an Existing Application |
| Tutorial <sensor_offboard_config>` for |
| instructions. |
| |
| **Note**: You do not need the serial connection from your computer |
| directly to the nRF52-DK board because we are not using the shell to |
| view the sensor data. |
| |
| 2. Run the ``newt load nrf52_boot`` command to load the bootloader. You |
| should already have this target built from the :doc:`Enabling an Off-Board |
| Sensor in an Existing Application |
| Tutorial <sensor_nrf52_bno055>` |
| 3. Run the ``newt load nrf52_bno055_oic_test`` command to load the |
| application image. |
| 4. Power the device OFF and ON to reboot. |
| |
| Step 7: Viewing Sensor Data from the Mynewt Smart Device Controller |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| |
| Start the Mynewt Smart Device Controller app on your iOS or Android |
| device to view the sensor data. You should already have the app |
| installed from the :doc:`Enabling OIC Sensor Data Monitoring in the |
| sensors_test Application Tutorial <sensor_nrf52_bno055_oic>` |
| |
| The Mynewt Smart Device Controller scans for the devices when it starts |
| up and displays the sensors it can view. The following is an example |
| from the Android App: |
| |
| .. image:: ../pics/smart_controller_main.png |
| :align: center |
| |
| 1. Select ``Accelerometer`` to see the sensor data samples: |
| |
| .. image:: ../pics/smart_controller_accelerometer.png |
| :align: center |
| |
| 2. Move your BNO055 sensor device around to see the values for the |
| coordinates change. |