BG96_K6xF_pelion-example-frdm_Temp

Dependencies:   FXAS21002 FXOS8700Q

Overview

This document is based on https://os.mbed.com/teams/NXP/code/pelion-example-frdm/ and the code forked Daniel_Lee's(https://os.mbed.com/users/Daniel_Lee/code/BG96_K6xF_pelion-example-frdm/)BG96_K6xF_pelion-example-frdm repository and added some features. Need a WIZnet IoT Shield BG96 board and development board.

This example is known to work great on the following platforms:

/media/uploads/stkim92/pel01.png

Requirement

  1. FRDM-K64F or FRDM-K66F
  2. WIZnet IoT Shield BG96 board
  3. USIM card

Example functionality

This example showcases the following device functionality:

Read onboard FXOS8700Q accelerometer, magnetometer and temperature(on shield). And report the values as Pelion LWM2M resources (see image below). (FRDM-K66F only) Read onboard FXAS21002 gyroscope and report the values as Pelion LWM2M resources. On user button click, increment Pelion LWM2M button resource. Allow the user to change the state of the board LED from Pelion LWM2M led_state resource and PUT request.

1. Import into Compiler

/media/uploads/stkim92/pel1.png

2. Apply Update Certificate

/media/uploads/stkim92/pel03.png

3. Compile and Program

/media/uploads/stkim92/pel04.png

4. If successfully connect to cellular networks(SKTelecom) then you can get below message

Device's Result

include the mbed library with this snippet

You can hold the user button during boot to format the storage and change the device identity.

M2Mnet(BG96) Power ON



Sensors configuration:

FXOS8700Q accelerometer = 0xC7

FXOS8700Q magnetometer  = 0xC7



Connecting to the network using the default network interface...

Connected to the network successfully. IP address: 2001:2D8:65

Initializing Pelion Device Management Client...

Initialized Pelion Device Management Client. Registering...

Press the user button to increment the LwM2M resource value...

Celsius temp : 26.10 C                                                             

FXOS8700Q mag:    0.217 x,   0.420 y,   0.288 z [gauss]     

Pelion Cloud Result (1)

/media/uploads/stkim92/pel4.png

Pelion Cloud Result (2)

/media/uploads/stkim92/pel5.png

Committer:
screamer
Date:
Mon Mar 25 14:58:08 2019 +0000
Revision:
0:a9d53048f0b6
Child:
1:42d51cf7cebe
Initial revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:a9d53048f0b6 1 // ----------------------------------------------------------------------------
screamer 0:a9d53048f0b6 2 // Copyright 2016-2018 ARM Ltd.
screamer 0:a9d53048f0b6 3 //
screamer 0:a9d53048f0b6 4 // SPDX-License-Identifier: Apache-2.0
screamer 0:a9d53048f0b6 5 //
screamer 0:a9d53048f0b6 6 // Licensed under the Apache License, Version 2.0 (the "License");
screamer 0:a9d53048f0b6 7 // you may not use this file except in compliance with the License.
screamer 0:a9d53048f0b6 8 // You may obtain a copy of the License at
screamer 0:a9d53048f0b6 9 //
screamer 0:a9d53048f0b6 10 // http://www.apache.org/licenses/LICENSE-2.0
screamer 0:a9d53048f0b6 11 //
screamer 0:a9d53048f0b6 12 // Unless required by applicable law or agreed to in writing, software
screamer 0:a9d53048f0b6 13 // distributed under the License is distributed on an "AS IS" BASIS,
screamer 0:a9d53048f0b6 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
screamer 0:a9d53048f0b6 15 // See the License for the specific language governing permissions and
screamer 0:a9d53048f0b6 16 // limitations under the License.
screamer 0:a9d53048f0b6 17 // ----------------------------------------------------------------------------
screamer 0:a9d53048f0b6 18 #ifndef MBED_TEST_MODE
screamer 0:a9d53048f0b6 19
screamer 0:a9d53048f0b6 20 #include "mbed.h"
screamer 0:a9d53048f0b6 21 #include "simple-mbed-cloud-client.h"
screamer 0:a9d53048f0b6 22 #include "FATFileSystem.h"
screamer 0:a9d53048f0b6 23 #include "LittleFileSystem.h"
screamer 0:a9d53048f0b6 24
screamer 0:a9d53048f0b6 25 // Default network interface object. Don't forget to change the WiFi SSID/password in mbed_app.json if you're using WiFi.
screamer 0:a9d53048f0b6 26 NetworkInterface *net = NetworkInterface::get_default_instance();
screamer 0:a9d53048f0b6 27
screamer 0:a9d53048f0b6 28 // Default block device available on the target board
screamer 0:a9d53048f0b6 29 BlockDevice *bd = BlockDevice::get_default_instance();
screamer 0:a9d53048f0b6 30
screamer 0:a9d53048f0b6 31 #if COMPONENT_SD || COMPONENT_NUSD
screamer 0:a9d53048f0b6 32 // Use FATFileSystem for SD card type blockdevices
screamer 0:a9d53048f0b6 33 FATFileSystem fs("fs", bd);
screamer 0:a9d53048f0b6 34 #else
screamer 0:a9d53048f0b6 35 // Use LittleFileSystem for non-SD block devices to enable wear leveling and other functions
screamer 0:a9d53048f0b6 36 LittleFileSystem fs("fs", bd);
screamer 0:a9d53048f0b6 37 #endif
screamer 0:a9d53048f0b6 38
screamer 0:a9d53048f0b6 39 #if USE_BUTTON == 1
screamer 0:a9d53048f0b6 40 InterruptIn button(BUTTON1);
screamer 0:a9d53048f0b6 41 #endif /* USE_BUTTON */
screamer 0:a9d53048f0b6 42
screamer 0:a9d53048f0b6 43 // Default LED to use for PUT/POST example
screamer 0:a9d53048f0b6 44 DigitalOut led(LED1);
screamer 0:a9d53048f0b6 45
screamer 0:a9d53048f0b6 46 // Declaring pointers for access to Pelion Device Management Client resources outside of main()
screamer 0:a9d53048f0b6 47 MbedCloudClientResource *button_res;
screamer 0:a9d53048f0b6 48 MbedCloudClientResource *led_res;
screamer 0:a9d53048f0b6 49 MbedCloudClientResource *post_res;
screamer 0:a9d53048f0b6 50
screamer 0:a9d53048f0b6 51 // An event queue is a very useful structure to debounce information between contexts (e.g. ISR and normal threads)
screamer 0:a9d53048f0b6 52 // This is great because things such as network operations are illegal in ISR, so updating a resource in a button's fall() function is not allowed
screamer 0:a9d53048f0b6 53 EventQueue eventQueue;
screamer 0:a9d53048f0b6 54
screamer 0:a9d53048f0b6 55 /**
screamer 0:a9d53048f0b6 56 * PUT handler - sets the value of the built-in LED
screamer 0:a9d53048f0b6 57 * @param resource The resource that triggered the callback
screamer 0:a9d53048f0b6 58 * @param newValue Updated value for the resource
screamer 0:a9d53048f0b6 59 */
screamer 0:a9d53048f0b6 60 void put_callback(MbedCloudClientResource *resource, m2m::String newValue) {
screamer 0:a9d53048f0b6 61 printf("PUT received. New value: %s\n", newValue.c_str());
screamer 0:a9d53048f0b6 62 led = atoi(newValue.c_str());
screamer 0:a9d53048f0b6 63 }
screamer 0:a9d53048f0b6 64
screamer 0:a9d53048f0b6 65 /**
screamer 0:a9d53048f0b6 66 * POST handler - prints the content of the payload
screamer 0:a9d53048f0b6 67 * @param resource The resource that triggered the callback
screamer 0:a9d53048f0b6 68 * @param buffer If a body was passed to the POST function, this contains the data.
screamer 0:a9d53048f0b6 69 * Note that the buffer is deallocated after leaving this function, so copy it if you need it longer.
screamer 0:a9d53048f0b6 70 * @param size Size of the body
screamer 0:a9d53048f0b6 71 */
screamer 0:a9d53048f0b6 72 void post_callback(MbedCloudClientResource *resource, const uint8_t *buffer, uint16_t size) {
screamer 0:a9d53048f0b6 73 printf("POST received (length %u). Payload: ", size);
screamer 0:a9d53048f0b6 74 for (size_t ix = 0; ix < size; ix++) {
screamer 0:a9d53048f0b6 75 printf("%02x ", buffer[ix]);
screamer 0:a9d53048f0b6 76 }
screamer 0:a9d53048f0b6 77 printf("\n");
screamer 0:a9d53048f0b6 78 }
screamer 0:a9d53048f0b6 79
screamer 0:a9d53048f0b6 80 /**
screamer 0:a9d53048f0b6 81 * Button handler
screamer 0:a9d53048f0b6 82 * This function will be triggered either by a physical button press or by a ticker every 5 seconds (see below)
screamer 0:a9d53048f0b6 83 */
screamer 0:a9d53048f0b6 84 void button_press() {
screamer 0:a9d53048f0b6 85 int v = button_res->get_value_int() + 1;
screamer 0:a9d53048f0b6 86 button_res->set_value(v);
screamer 0:a9d53048f0b6 87 printf("Button clicked %d times\n", v);
screamer 0:a9d53048f0b6 88 }
screamer 0:a9d53048f0b6 89
screamer 0:a9d53048f0b6 90 /**
screamer 0:a9d53048f0b6 91 * Notification callback handler
screamer 0:a9d53048f0b6 92 * @param resource The resource that triggered the callback
screamer 0:a9d53048f0b6 93 * @param status The delivery status of the notification
screamer 0:a9d53048f0b6 94 */
screamer 0:a9d53048f0b6 95 void button_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status) {
screamer 0:a9d53048f0b6 96 printf("Button notification, status %s (%d)\n", MbedCloudClientResource::delivery_status_to_string(status), status);
screamer 0:a9d53048f0b6 97 }
screamer 0:a9d53048f0b6 98
screamer 0:a9d53048f0b6 99 /**
screamer 0:a9d53048f0b6 100 * Registration callback handler
screamer 0:a9d53048f0b6 101 * @param endpoint Information about the registered endpoint such as the name (so you can find it back in portal)
screamer 0:a9d53048f0b6 102 */
screamer 0:a9d53048f0b6 103 void registered(const ConnectorClientEndpointInfo *endpoint) {
screamer 0:a9d53048f0b6 104 printf("Registered to Pelion Device Management. Endpoint Name: %s\n", endpoint->internal_endpoint_name.c_str());
screamer 0:a9d53048f0b6 105 }
screamer 0:a9d53048f0b6 106
screamer 0:a9d53048f0b6 107 int main(void) {
screamer 0:a9d53048f0b6 108 printf("\nStarting Simple Pelion Device Management Client example\n");
screamer 0:a9d53048f0b6 109
screamer 0:a9d53048f0b6 110 #if USE_BUTTON == 1
screamer 0:a9d53048f0b6 111 // If the User button is pressed ons start, then format storage.
screamer 0:a9d53048f0b6 112 if (button.read() == MBED_CONF_APP_BUTTON_PRESSED_STATE) {
screamer 0:a9d53048f0b6 113 printf("User button is pushed on start. Formatting the storage...\n");
screamer 0:a9d53048f0b6 114 int storage_status = StorageHelper::format(&fs, bd);
screamer 0:a9d53048f0b6 115 if (storage_status != 0) {
screamer 0:a9d53048f0b6 116 printf("ERROR: Failed to reformat the storage (%d).\n", storage_status);
screamer 0:a9d53048f0b6 117 }
screamer 0:a9d53048f0b6 118 } else {
screamer 0:a9d53048f0b6 119 printf("You can hold the user button during boot to format the storage and change the device identity.\n");
screamer 0:a9d53048f0b6 120 }
screamer 0:a9d53048f0b6 121 #endif /* USE_BUTTON */
screamer 0:a9d53048f0b6 122
screamer 0:a9d53048f0b6 123 // Connect to the Internet (DHCP is expected to be on)
screamer 0:a9d53048f0b6 124 printf("Connecting to the network using the default network interface...\n");
screamer 0:a9d53048f0b6 125 net = NetworkInterface::get_default_instance();
screamer 0:a9d53048f0b6 126
screamer 0:a9d53048f0b6 127 nsapi_error_t net_status = NSAPI_ERROR_NO_CONNECTION;
screamer 0:a9d53048f0b6 128 while ((net_status = net->connect()) != NSAPI_ERROR_OK) {
screamer 0:a9d53048f0b6 129 printf("Unable to connect to network (%d). Retrying...\n", net_status);
screamer 0:a9d53048f0b6 130 }
screamer 0:a9d53048f0b6 131
screamer 0:a9d53048f0b6 132 printf("Connected to the network successfully. IP address: %s\n", net->get_ip_address());
screamer 0:a9d53048f0b6 133
screamer 0:a9d53048f0b6 134 printf("Initializing Pelion Device Management Client...\n");
screamer 0:a9d53048f0b6 135
screamer 0:a9d53048f0b6 136 // SimpleMbedCloudClient handles registering over LwM2M to Pelion Device Management
screamer 0:a9d53048f0b6 137 SimpleMbedCloudClient client(net, bd, &fs);
screamer 0:a9d53048f0b6 138 int client_status = client.init();
screamer 0:a9d53048f0b6 139 if (client_status != 0) {
screamer 0:a9d53048f0b6 140 printf("Pelion Client initialization failed (%d)\n", client_status);
screamer 0:a9d53048f0b6 141 return -1;
screamer 0:a9d53048f0b6 142 }
screamer 0:a9d53048f0b6 143
screamer 0:a9d53048f0b6 144 // Creating resources, which can be written or read from the cloud
screamer 0:a9d53048f0b6 145 button_res = client.create_resource("3200/0/5501", "button_count");
screamer 0:a9d53048f0b6 146 button_res->set_value(0);
screamer 0:a9d53048f0b6 147 button_res->methods(M2MMethod::GET);
screamer 0:a9d53048f0b6 148 button_res->observable(true);
screamer 0:a9d53048f0b6 149 button_res->attach_notification_callback(button_callback);
screamer 0:a9d53048f0b6 150
screamer 0:a9d53048f0b6 151 led_res = client.create_resource("3201/0/5853", "led_state");
screamer 0:a9d53048f0b6 152 led_res->set_value(led.read());
screamer 0:a9d53048f0b6 153 led_res->methods(M2MMethod::GET | M2MMethod::PUT);
screamer 0:a9d53048f0b6 154 led_res->attach_put_callback(put_callback);
screamer 0:a9d53048f0b6 155
screamer 0:a9d53048f0b6 156 post_res = client.create_resource("3300/0/5605", "execute_function");
screamer 0:a9d53048f0b6 157 post_res->methods(M2MMethod::POST);
screamer 0:a9d53048f0b6 158 post_res->attach_post_callback(post_callback);
screamer 0:a9d53048f0b6 159
screamer 0:a9d53048f0b6 160 printf("Initialized Pelion Device Management Client. Registering...\n");
screamer 0:a9d53048f0b6 161
screamer 0:a9d53048f0b6 162 // Callback that fires when registering is complete
screamer 0:a9d53048f0b6 163 client.on_registered(&registered);
screamer 0:a9d53048f0b6 164
screamer 0:a9d53048f0b6 165 // Register with Pelion DM
screamer 0:a9d53048f0b6 166 client.register_and_connect();
screamer 0:a9d53048f0b6 167
screamer 0:a9d53048f0b6 168 #if USE_BUTTON == 1
screamer 0:a9d53048f0b6 169 // The button fires on an interrupt context, but debounces it to the eventqueue, so it's safe to do network operations
screamer 0:a9d53048f0b6 170 button.fall(eventQueue.event(&button_press));
screamer 0:a9d53048f0b6 171 printf("Press the user button to increment the LwM2M resource value...\n");
screamer 0:a9d53048f0b6 172 #else
screamer 0:a9d53048f0b6 173 // The timer fires on an interrupt context, but debounces it to the eventqueue, so it's safe to do network operations
screamer 0:a9d53048f0b6 174 Ticker timer;
screamer 0:a9d53048f0b6 175 timer.attach(eventQueue.event(&button_press), 5.0);
screamer 0:a9d53048f0b6 176 printf("Simulating button press every 5 seconds...\n");
screamer 0:a9d53048f0b6 177 #endif /* USE_BUTTON */
screamer 0:a9d53048f0b6 178
screamer 0:a9d53048f0b6 179 // You can easily run the eventQueue in a separate thread if required
screamer 0:a9d53048f0b6 180 eventQueue.dispatch_forever();
screamer 0:a9d53048f0b6 181 }
screamer 0:a9d53048f0b6 182
screamer 0:a9d53048f0b6 183 #endif /* MBED_TEST_MODE */