blob: 204c8fc9c00d33319fd02475296bbe206e0e95d7 [file] [log] [blame]
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.