Mac Lobdell
/
mbed-cloud-example-lpc546xx
Simple Mbed Cloud Client application using features of LPC54608 / LPC54628.
README.md@3:9168a920c806, 2018-09-24 (annotated)
- Committer:
- maclobdell
- Date:
- Mon Sep 24 15:04:20 2018 +0000
- Revision:
- 3:9168a920c806
- Parent:
- 0:1f42bb53bff5
update simple cloud client repo lib
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
maclobdell | 0:1f42bb53bff5 | 1 | # Simple Mbed Cloud Client template application |
maclobdell | 0:1f42bb53bff5 | 2 | |
maclobdell | 0:1f42bb53bff5 | 3 | ## Overview |
maclobdell | 0:1f42bb53bff5 | 4 | |
maclobdell | 0:1f42bb53bff5 | 5 | This is a template application for platform vendors. It demonstrates how to create a simple Mbed Cloud Client application that can connect to Mbed Cloud, register resources and get ready to receive a firmware update. |
maclobdell | 0:1f42bb53bff5 | 6 | |
maclobdell | 0:1f42bb53bff5 | 7 | It's intended to be customized to add platform-specific features (such as sensors and actuators) and configure the connectivity and storage to work **out-of-the-box**. The Simple Mbed Cloud Client template application works in **developer mode** by default. |
maclobdell | 0:1f42bb53bff5 | 8 | |
maclobdell | 0:1f42bb53bff5 | 9 | ## Setup process |
maclobdell | 0:1f42bb53bff5 | 10 | |
maclobdell | 0:1f42bb53bff5 | 11 | This is a summary of the process for developers to get started and get a device connected to Mbed Cloud. |
maclobdell | 0:1f42bb53bff5 | 12 | |
maclobdell | 0:1f42bb53bff5 | 13 | ### Mbed Online IDE |
maclobdell | 0:1f42bb53bff5 | 14 | |
maclobdell | 0:1f42bb53bff5 | 15 | 1. Import the application into the Online IDE. |
maclobdell | 0:1f42bb53bff5 | 16 | 2. Add the API key to establish connection to Mbed Cloud. |
maclobdell | 0:1f42bb53bff5 | 17 | 3. Install the developer certificate. |
maclobdell | 0:1f42bb53bff5 | 18 | 4. Compile and program. |
maclobdell | 0:1f42bb53bff5 | 19 | |
maclobdell | 0:1f42bb53bff5 | 20 | ### Mbed CLI tools |
maclobdell | 0:1f42bb53bff5 | 21 | |
maclobdell | 0:1f42bb53bff5 | 22 | 1. Import the application in developer's desktop: |
maclobdell | 0:1f42bb53bff5 | 23 | |
maclobdell | 0:1f42bb53bff5 | 24 | ``` |
maclobdell | 0:1f42bb53bff5 | 25 | mbed import https://os.mbed.com/teams/mbed-os-examples/code/mbed-cloud-example |
maclobdell | 0:1f42bb53bff5 | 26 | cd mbed-cloud-example |
maclobdell | 0:1f42bb53bff5 | 27 | ``` |
maclobdell | 0:1f42bb53bff5 | 28 | |
maclobdell | 0:1f42bb53bff5 | 29 | 2. Download the developer certificate from Mbed Cloud. |
maclobdell | 0:1f42bb53bff5 | 30 | 3. Compile and program: |
maclobdell | 0:1f42bb53bff5 | 31 | |
maclobdell | 0:1f42bb53bff5 | 32 | ``` |
maclobdell | 0:1f42bb53bff5 | 33 | mbed compile -t <toolchain> -m <target> -f |
maclobdell | 0:1f42bb53bff5 | 34 | ``` |
maclobdell | 0:1f42bb53bff5 | 35 | |
maclobdell | 0:1f42bb53bff5 | 36 | ## Porting to a new platform |
maclobdell | 0:1f42bb53bff5 | 37 | |
maclobdell | 0:1f42bb53bff5 | 38 | ### Requirements |
maclobdell | 0:1f42bb53bff5 | 39 | |
maclobdell | 0:1f42bb53bff5 | 40 | The hardware requirements for Mbed OS platforms to support Mbed Cloud Client are [here](https://cloud.mbed.com/docs/current/cloud-requirements/index.html). |
maclobdell | 0:1f42bb53bff5 | 41 | |
maclobdell | 0:1f42bb53bff5 | 42 | In general, to start creating a secure connected product, you need a microcontroller that has the following features. |
maclobdell | 0:1f42bb53bff5 | 43 | * RAM: 128K or more |
maclobdell | 0:1f42bb53bff5 | 44 | * Flash: 512K or more |
maclobdell | 0:1f42bb53bff5 | 45 | * True Random Number Generator (TRNG) |
maclobdell | 0:1f42bb53bff5 | 46 | * Real Time Clock (RTC) |
maclobdell | 0:1f42bb53bff5 | 47 | |
maclobdell | 0:1f42bb53bff5 | 48 | Additionally, to use Mbed Cloud Client, the microcontroller needs to support the following in Mbed OS (latest version preferred) or in a compatible driver library: |
maclobdell | 0:1f42bb53bff5 | 49 | * A storage device (SDcard, SPI Flash, Data Flash) |
maclobdell | 0:1f42bb53bff5 | 50 | * IP connectivity (Ethernet, WiFi, Cellular, 6LoWPAN, Thread) |
maclobdell | 0:1f42bb53bff5 | 51 | |
maclobdell | 0:1f42bb53bff5 | 52 | For the Firmware update over the air (FOTA), you need the following: |
maclobdell | 0:1f42bb53bff5 | 53 | * [FlashIAP](https://github.com/ARMmbed/mbed-os/blob/master/drivers/FlashIAP.h) - Flash In-Application Programming (IAP) |
maclobdell | 0:1f42bb53bff5 | 54 | * [Mbed Bootloader](https://github.com/ARMmbed/mbed-bootloader) or a bootloader compatible with Mbed Cloud Client. |
maclobdell | 0:1f42bb53bff5 | 55 | |
maclobdell | 0:1f42bb53bff5 | 56 | ### References |
maclobdell | 0:1f42bb53bff5 | 57 | |
maclobdell | 0:1f42bb53bff5 | 58 | * Check which Mbed OS platforms are supported in the [Mbed Cloud quick-start guide](https://cloud.test.mbed.com/quick-start). |
maclobdell | 0:1f42bb53bff5 | 59 | * Check which storage options are available [here](https://os.mbed.com/docs/v5.8/reference/storage.html). |
maclobdell | 0:1f42bb53bff5 | 60 | * Check which network options are available [here](https://os.mbed.com/docs/v5.8/reference/network-socket.html). |
maclobdell | 0:1f42bb53bff5 | 61 | |
maclobdell | 0:1f42bb53bff5 | 62 | |
maclobdell | 0:1f42bb53bff5 | 63 | ### Porting steps |
maclobdell | 0:1f42bb53bff5 | 64 | |
maclobdell | 0:1f42bb53bff5 | 65 | Supporting a new derivative platform requires the following steps: |
maclobdell | 0:1f42bb53bff5 | 66 | |
maclobdell | 0:1f42bb53bff5 | 67 | * Fork the template and create an example application for your platform in https://os.mbed.com. |
maclobdell | 0:1f42bb53bff5 | 68 | * (Optional) Change the connectivity interface. Ethernet is the default - see `main.cpp`. |
maclobdell | 0:1f42bb53bff5 | 69 | * (Optional) Change the filesystem and/or the block device for storage. FAT filesystem over SD card is the default. See `main.cpp`. |
maclobdell | 0:1f42bb53bff5 | 70 | * (Optional) Make minor changes in `mbed_app.json` to support multiple platforms with same connectivity and storage. |
maclobdell | 0:1f42bb53bff5 | 71 | |
maclobdell | 0:1f42bb53bff5 | 72 | <span class="notes">**Note:** Make sure that the application works out-of-the-box and no changes are required in the `main.cpp` file. The goal is to deliver a great UX to our developers.</span> |
maclobdell | 0:1f42bb53bff5 | 73 | |
maclobdell | 0:1f42bb53bff5 | 74 | ### Porting example |
maclobdell | 0:1f42bb53bff5 | 75 | |
maclobdell | 0:1f42bb53bff5 | 76 | In this example, an app with an SD card and on-chip Ethernet is taken to a custom board that has an MCU + Wi-Fi module. |
maclobdell | 0:1f42bb53bff5 | 77 | |
maclobdell | 0:1f42bb53bff5 | 78 | #### Changing the storage option |
maclobdell | 0:1f42bb53bff5 | 79 | |
maclobdell | 0:1f42bb53bff5 | 80 | ##### For an SD card |
maclobdell | 0:1f42bb53bff5 | 81 | |
maclobdell | 0:1f42bb53bff5 | 82 | 1. Add the SD card driver (`sd-driver.lib`) if it is not already added. |
maclobdell | 0:1f42bb53bff5 | 83 | |
maclobdell | 0:1f42bb53bff5 | 84 | On the command line: |
maclobdell | 0:1f42bb53bff5 | 85 | |
maclobdell | 0:1f42bb53bff5 | 86 | ``` |
maclobdell | 0:1f42bb53bff5 | 87 | mbed add https://github.com/armmbed/sd-driver |
maclobdell | 0:1f42bb53bff5 | 88 | ``` |
maclobdell | 0:1f42bb53bff5 | 89 | |
maclobdell | 0:1f42bb53bff5 | 90 | 2. In the online compiler, click **Import**, then click here to import from URL. |
maclobdell | 0:1f42bb53bff5 | 91 | 3. Then enter https://github.com/armmbed/sd-driver for the **Source URL** and **Import As:** Library. |
maclobdell | 0:1f42bb53bff5 | 92 | 4. Include the header files for the SD driver and FAT file system: |
maclobdell | 0:1f42bb53bff5 | 93 | |
maclobdell | 0:1f42bb53bff5 | 94 | ```cpp |
maclobdell | 0:1f42bb53bff5 | 95 | #include "SDBlockDevice.h" |
maclobdell | 0:1f42bb53bff5 | 96 | #include "FATFileSystem.h" |
maclobdell | 0:1f42bb53bff5 | 97 | ``` |
maclobdell | 0:1f42bb53bff5 | 98 | |
maclobdell | 0:1f42bb53bff5 | 99 | 5. Declare the global objects for the SD card and file system. |
maclobdell | 0:1f42bb53bff5 | 100 | |
maclobdell | 0:1f42bb53bff5 | 101 | ```cpp |
maclobdell | 0:1f42bb53bff5 | 102 | SDBlockDevice bd(SPI_MOSI, SPI_MISO, SPI_CLK, SPI_CS); |
maclobdell | 0:1f42bb53bff5 | 103 | FATFileSystem fs("sd", &sd); |
maclobdell | 0:1f42bb53bff5 | 104 | ``` |
maclobdell | 0:1f42bb53bff5 | 105 | |
maclobdell | 0:1f42bb53bff5 | 106 | <span class="notes">**Note:** The `SPI_*` macros represent the pin names. The names can be defined in a variety of places including the sd-driver, your project’s configuration file (`mbed_app.json`) or the `pinnames.h` file for the target that defines the default pin names. You can use other pin names depending on the platform and the connections.</span> |
maclobdell | 0:1f42bb53bff5 | 107 | |
maclobdell | 0:1f42bb53bff5 | 108 | For example, if the SPI signals for the SD card interface are connected on an Arduino compatible shield, you may define them like this: |
maclobdell | 0:1f42bb53bff5 | 109 | |
maclobdell | 0:1f42bb53bff5 | 110 | ```cpp |
maclobdell | 0:1f42bb53bff5 | 111 | SDBlockDevice sd(D11, D12, D13, D10); |
maclobdell | 0:1f42bb53bff5 | 112 | ``` |
maclobdell | 0:1f42bb53bff5 | 113 | |
maclobdell | 0:1f42bb53bff5 | 114 | ##### For SPI Flash (devices that support SFDP) |
maclobdell | 0:1f42bb53bff5 | 115 | |
maclobdell | 0:1f42bb53bff5 | 116 | <Please note that this section of the document is under construction. More information is needed.> |
maclobdell | 0:1f42bb53bff5 | 117 | |
maclobdell | 0:1f42bb53bff5 | 118 | 1. Add the SPI Flash driver (`spif-driver`) if it is not already added. |
maclobdell | 0:1f42bb53bff5 | 119 | |
maclobdell | 0:1f42bb53bff5 | 120 | ``` |
maclobdell | 0:1f42bb53bff5 | 121 | mbed add https://github.com/ARMmbed/spif-driver |
maclobdell | 0:1f42bb53bff5 | 122 | ``` |
maclobdell | 0:1f42bb53bff5 | 123 | |
maclobdell | 0:1f42bb53bff5 | 124 | 2. Include the header files for the SPI Flash driver and LitteFS file system. For SPI Flash, we recommend LittleFS file system which supports wear leveling. |
maclobdell | 0:1f42bb53bff5 | 125 | |
maclobdell | 0:1f42bb53bff5 | 126 | ```cpp |
maclobdell | 0:1f42bb53bff5 | 127 | #include "SPIFBlockDevice.h" |
maclobdell | 0:1f42bb53bff5 | 128 | #include "LittleFileSystem.h" |
maclobdell | 0:1f42bb53bff5 | 129 | ``` |
maclobdell | 0:1f42bb53bff5 | 130 | |
maclobdell | 0:1f42bb53bff5 | 131 | 3. Declare the global objects for the SD card and file system: |
maclobdell | 0:1f42bb53bff5 | 132 | |
maclobdell | 0:1f42bb53bff5 | 133 | ```cpp |
maclobdell | 0:1f42bb53bff5 | 134 | SPIFBlockDevice spif(SPI_MOSI, SPI_MISO, SPI_CLK, SPI_CS); |
maclobdell | 0:1f42bb53bff5 | 135 | LittleFileSystem fs("fs", &spif); |
maclobdell | 0:1f42bb53bff5 | 136 | ``` |
maclobdell | 0:1f42bb53bff5 | 137 | |
maclobdell | 0:1f42bb53bff5 | 138 | 4. Update the construction of the `SimpleMbedCloudClient` object to pass in the file system and block device: |
maclobdell | 0:1f42bb53bff5 | 139 | |
maclobdell | 0:1f42bb53bff5 | 140 | ```cpp |
maclobdell | 0:1f42bb53bff5 | 141 | SimpleMbedCloudClient client(&net, &spif, &fs); |
maclobdell | 0:1f42bb53bff5 | 142 | ``` |
maclobdell | 0:1f42bb53bff5 | 143 | |
maclobdell | 0:1f42bb53bff5 | 144 | #### Changing the network interface |
maclobdell | 0:1f42bb53bff5 | 145 | |
maclobdell | 0:1f42bb53bff5 | 146 | ##### For Ethernet |
maclobdell | 0:1f42bb53bff5 | 147 | |
maclobdell | 0:1f42bb53bff5 | 148 | The Ethernet interface is included within Mbed OS, so you do not need to add a library. |
maclobdell | 0:1f42bb53bff5 | 149 | |
maclobdell | 0:1f42bb53bff5 | 150 | 1. Include the header file for the interface. |
maclobdell | 0:1f42bb53bff5 | 151 | |
maclobdell | 0:1f42bb53bff5 | 152 | ``` |
maclobdell | 0:1f42bb53bff5 | 153 | #include "EthernetInterface.h" |
maclobdell | 0:1f42bb53bff5 | 154 | ``` |
maclobdell | 0:1f42bb53bff5 | 155 | |
maclobdell | 0:1f42bb53bff5 | 156 | 2. Declare the network interface object. |
maclobdell | 0:1f42bb53bff5 | 157 | |
maclobdell | 0:1f42bb53bff5 | 158 | ``` |
maclobdell | 0:1f42bb53bff5 | 159 | EthernetInterface net; |
maclobdell | 0:1f42bb53bff5 | 160 | ``` |
maclobdell | 0:1f42bb53bff5 | 161 | |
maclobdell | 0:1f42bb53bff5 | 162 | 3. Connect the interface. |
maclobdell | 0:1f42bb53bff5 | 163 | |
maclobdell | 0:1f42bb53bff5 | 164 | ``` |
maclobdell | 0:1f42bb53bff5 | 165 | status = net.connect(); |
maclobdell | 0:1f42bb53bff5 | 166 | ``` |
maclobdell | 0:1f42bb53bff5 | 167 | |
maclobdell | 0:1f42bb53bff5 | 168 | 4. When the Mbed Cloud Client is started, pass the network interface. |
maclobdell | 0:1f42bb53bff5 | 169 | |
maclobdell | 0:1f42bb53bff5 | 170 | ``` |
maclobdell | 0:1f42bb53bff5 | 171 | SimpleMbedCloudClient client(&net, &sd, &fs); |
maclobdell | 0:1f42bb53bff5 | 172 | ``` |
maclobdell | 0:1f42bb53bff5 | 173 | |
maclobdell | 0:1f42bb53bff5 | 174 | ##### For WiFi |
maclobdell | 0:1f42bb53bff5 | 175 | |
maclobdell | 0:1f42bb53bff5 | 176 | This example references the ESP8266 WiFi module, but the instructions are applicable to other modules. |
maclobdell | 0:1f42bb53bff5 | 177 | |
maclobdell | 0:1f42bb53bff5 | 178 | 1. Add the ESP8266 WiFi interface driver (esp8266-driver) if it is not already added. |
maclobdell | 0:1f42bb53bff5 | 179 | |
maclobdell | 0:1f42bb53bff5 | 180 | ``` |
maclobdell | 0:1f42bb53bff5 | 181 | Mbed add https://github.com/ARMmbed/esp8266-driver |
maclobdell | 0:1f42bb53bff5 | 182 | ``` |
maclobdell | 0:1f42bb53bff5 | 183 | |
maclobdell | 0:1f42bb53bff5 | 184 | <span class="notes">**Note:** You may have to update the firmware inside the ESP8266 module.</span> |
maclobdell | 0:1f42bb53bff5 | 185 | |
maclobdell | 0:1f42bb53bff5 | 186 | 2. Include the header file for the interface. |
maclobdell | 0:1f42bb53bff5 | 187 | |
maclobdell | 0:1f42bb53bff5 | 188 | ```cpp |
maclobdell | 0:1f42bb53bff5 | 189 | #include "ESP8266Interface.h" |
maclobdell | 0:1f42bb53bff5 | 190 | ``` |
maclobdell | 0:1f42bb53bff5 | 191 | |
maclobdell | 0:1f42bb53bff5 | 192 | 3. Add the driver configuration information in `mbed_app.json` (located at the top level of the Mbed Cloud Connect example project). |
maclobdell | 0:1f42bb53bff5 | 193 | |
maclobdell | 0:1f42bb53bff5 | 194 | ```json |
maclobdell | 0:1f42bb53bff5 | 195 | "config": { |
maclobdell | 0:1f42bb53bff5 | 196 | "wifi-ssid": { |
maclobdell | 0:1f42bb53bff5 | 197 | "help": "WiFi SSID", |
maclobdell | 0:1f42bb53bff5 | 198 | "value": "\"SSID\"" |
maclobdell | 0:1f42bb53bff5 | 199 | }, |
maclobdell | 0:1f42bb53bff5 | 200 | "wifi-password": { |
maclobdell | 0:1f42bb53bff5 | 201 | "help": "WiFi Password", |
maclobdell | 0:1f42bb53bff5 | 202 | "value": "\"PASSWORD\"" |
maclobdell | 0:1f42bb53bff5 | 203 | } |
maclobdell | 0:1f42bb53bff5 | 204 | } |
maclobdell | 0:1f42bb53bff5 | 205 | ``` |
maclobdell | 0:1f42bb53bff5 | 206 | |
maclobdell | 0:1f42bb53bff5 | 207 | 4. Declare the network interface object. |
maclobdell | 0:1f42bb53bff5 | 208 | |
maclobdell | 0:1f42bb53bff5 | 209 | ```cpp |
maclobdell | 0:1f42bb53bff5 | 210 | ESP8266Interface net(D1, D0); |
maclobdell | 0:1f42bb53bff5 | 211 | ``` |
maclobdell | 0:1f42bb53bff5 | 212 | |
maclobdell | 0:1f42bb53bff5 | 213 | 5. Connect the interface. |
maclobdell | 0:1f42bb53bff5 | 214 | |
maclobdell | 0:1f42bb53bff5 | 215 | ```cpp |
maclobdell | 0:1f42bb53bff5 | 216 | nsapi_error_t status = net.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2); |
maclobdell | 0:1f42bb53bff5 | 217 | ``` |
maclobdell | 0:1f42bb53bff5 | 218 | |
maclobdell | 0:1f42bb53bff5 | 219 | 6. When the Mbed Cloud Client is started, pass the network interface. |
maclobdell | 0:1f42bb53bff5 | 220 | |
maclobdell | 0:1f42bb53bff5 | 221 | ```cpp |
maclobdell | 0:1f42bb53bff5 | 222 | SimpleMbedCloudClient client(&net, &sd, &fs); |
maclobdell | 0:1f42bb53bff5 | 223 | ``` |
maclobdell | 0:1f42bb53bff5 | 224 | |
maclobdell | 0:1f42bb53bff5 | 225 | #### Changing the target MCU |
maclobdell | 0:1f42bb53bff5 | 226 | |
maclobdell | 0:1f42bb53bff5 | 227 | To change the target board to another board that is supported by Mbed OS, simply change the target name. |
maclobdell | 0:1f42bb53bff5 | 228 | |
maclobdell | 0:1f42bb53bff5 | 229 | ##### Using the command line |
maclobdell | 0:1f42bb53bff5 | 230 | |
maclobdell | 0:1f42bb53bff5 | 231 | Use the -m option. |
maclobdell | 0:1f42bb53bff5 | 232 | |
maclobdell | 0:1f42bb53bff5 | 233 | ``` |
maclobdell | 0:1f42bb53bff5 | 234 | mbed compile -m Hexiwear -t GCC_ARM |
maclobdell | 0:1f42bb53bff5 | 235 | ``` |
maclobdell | 0:1f42bb53bff5 | 236 | |
maclobdell | 0:1f42bb53bff5 | 237 | ##### Using the online compiler |
maclobdell | 0:1f42bb53bff5 | 238 | |
maclobdell | 0:1f42bb53bff5 | 239 | Click the platform name on the top right corner, then select another platform. |
maclobdell | 0:1f42bb53bff5 | 240 | |
maclobdell | 0:1f42bb53bff5 | 241 | ##### Using an IDE |
maclobdell | 0:1f42bb53bff5 | 242 | |
maclobdell | 0:1f42bb53bff5 | 243 | First re-export (create project files) for the target with the command line. |
maclobdell | 0:1f42bb53bff5 | 244 | |
maclobdell | 0:1f42bb53bff5 | 245 | ``` |
maclobdell | 0:1f42bb53bff5 | 246 | mbed export -m Hexiwear -i uvision |
maclobdell | 0:1f42bb53bff5 | 247 | ``` |
maclobdell | 0:1f42bb53bff5 | 248 | |
maclobdell | 0:1f42bb53bff5 | 249 | #### Creating a custom target board |
maclobdell | 0:1f42bb53bff5 | 250 | |
maclobdell | 0:1f42bb53bff5 | 251 | Read the Mbed OS [Contributing](https://os.mbed.com/docs/latest/reference/porting-targets.html) documentation on how to add a new target. |
maclobdell | 0:1f42bb53bff5 | 252 | |
maclobdell | 0:1f42bb53bff5 | 253 | #### Update the application logic |
maclobdell | 0:1f42bb53bff5 | 254 | |
maclobdell | 0:1f42bb53bff5 | 255 | The template example uses a ticker object to periodically fire a software interrupt to simulate button presses. Let’s say you want to make an actual button press. |
maclobdell | 0:1f42bb53bff5 | 256 | |
maclobdell | 0:1f42bb53bff5 | 257 | By default, there is a Ticker object, which fires every five seconds and invokes a callback function. |
maclobdell | 0:1f42bb53bff5 | 258 | |
maclobdell | 0:1f42bb53bff5 | 259 | ```cpp |
maclobdell | 0:1f42bb53bff5 | 260 | Ticker timer; |
maclobdell | 0:1f42bb53bff5 | 261 | timer.attach(eventQueue.event(&fake_button_press), 5.0); |
maclobdell | 0:1f42bb53bff5 | 262 | ``` |
maclobdell | 0:1f42bb53bff5 | 263 | |
maclobdell | 0:1f42bb53bff5 | 264 | This callback function changes the `button_res` resource: |
maclobdell | 0:1f42bb53bff5 | 265 | |
maclobdell | 0:1f42bb53bff5 | 266 | ```cpp |
maclobdell | 0:1f42bb53bff5 | 267 | void fake_button_press() { |
maclobdell | 0:1f42bb53bff5 | 268 | int v = button_res->get_value_int() + 1; |
maclobdell | 0:1f42bb53bff5 | 269 | |
maclobdell | 0:1f42bb53bff5 | 270 | button_res->set_value(v); |
maclobdell | 0:1f42bb53bff5 | 271 | |
maclobdell | 0:1f42bb53bff5 | 272 | printf("Simulated button clicked %d times\n", v); |
maclobdell | 0:1f42bb53bff5 | 273 | } |
maclobdell | 0:1f42bb53bff5 | 274 | ``` |
maclobdell | 0:1f42bb53bff5 | 275 | |
maclobdell | 0:1f42bb53bff5 | 276 | If you want to change this to an actual button, here is how to do it: |
maclobdell | 0:1f42bb53bff5 | 277 | |
maclobdell | 0:1f42bb53bff5 | 278 | 1. Remove: |
maclobdell | 0:1f42bb53bff5 | 279 | |
maclobdell | 0:1f42bb53bff5 | 280 | ```cpp |
maclobdell | 0:1f42bb53bff5 | 281 | Ticker timer; |
maclobdell | 0:1f42bb53bff5 | 282 | timer.attach(eventQueue.event(&fake_button_press), 5.0); |
maclobdell | 0:1f42bb53bff5 | 283 | ``` |
maclobdell | 0:1f42bb53bff5 | 284 | |
maclobdell | 0:1f42bb53bff5 | 285 | 1. Declare an `InterruptIn` object on the button, and attach the callback function to the `fall` handler: |
maclobdell | 0:1f42bb53bff5 | 286 | |
maclobdell | 0:1f42bb53bff5 | 287 | ```cpp |
maclobdell | 0:1f42bb53bff5 | 288 | InterruptIn btn(BUTTON1); |
maclobdell | 0:1f42bb53bff5 | 289 | btn.fall(eventQueue.event(&fake_button_press), 5.0); |
maclobdell | 0:1f42bb53bff5 | 290 | ``` |
maclobdell | 0:1f42bb53bff5 | 291 | |
maclobdell | 0:1f42bb53bff5 | 292 | 1. Rename `fake_button_press` to `real_button_press`. |
maclobdell | 0:1f42bb53bff5 | 293 | |
maclobdell | 0:1f42bb53bff5 | 294 | |
maclobdell | 0:1f42bb53bff5 | 295 | #### Updating the LwM2M objects |
maclobdell | 0:1f42bb53bff5 | 296 | |
maclobdell | 0:1f42bb53bff5 | 297 | See guide at [TODO] |
maclobdell | 0:1f42bb53bff5 | 298 | |
maclobdell | 0:1f42bb53bff5 | 299 | ## Enabling firmware updates |
maclobdell | 0:1f42bb53bff5 | 300 | |
maclobdell | 0:1f42bb53bff5 | 301 | To enable firmware updates, a compatible bootloader needs to be added in the `tools/` folder. The process to merge the application with the bootloader currently only works when building with Mbed CLI. In the future, this combine process will be done automatically by Mbed tools. |
maclobdell | 0:1f42bb53bff5 | 302 | |
maclobdell | 0:1f42bb53bff5 | 303 | 1. Compile [mbed-bootloader](https://github.com/armmbed/mbed-bootloader) for the platform and storage configuration used in this application. Place the binary in the tools folder. |
maclobdell | 0:1f42bb53bff5 | 304 | |
maclobdell | 0:1f42bb53bff5 | 305 | 1. Add a section to `mbed_app.json` under `target_overrides` with the bootloader configuration. For example: |
maclobdell | 0:1f42bb53bff5 | 306 | |
maclobdell | 0:1f42bb53bff5 | 307 | ```json |
maclobdell | 0:1f42bb53bff5 | 308 | "K64F": { |
maclobdell | 0:1f42bb53bff5 | 309 | "target.mbed_app_start" : "0x0000a400", |
maclobdell | 0:1f42bb53bff5 | 310 | "update-client.bootloader-details" : "0x00007188", |
maclobdell | 0:1f42bb53bff5 | 311 | "sotp-section-1-address" : "(32*1024)", |
maclobdell | 0:1f42bb53bff5 | 312 | "sotp-section-1-size" : "( 4*1024)", |
maclobdell | 0:1f42bb53bff5 | 313 | "sotp-section-2-address" : "(36*1024)", |
maclobdell | 0:1f42bb53bff5 | 314 | "sotp-section-2-size" : "( 4*1024)", |
maclobdell | 0:1f42bb53bff5 | 315 | "update-client.application-details": "(40*1024)" |
maclobdell | 0:1f42bb53bff5 | 316 | } |
maclobdell | 0:1f42bb53bff5 | 317 | ``` |
maclobdell | 0:1f42bb53bff5 | 318 | |
maclobdell | 0:1f42bb53bff5 | 319 | Next, instruct your users to do the following: |
maclobdell | 0:1f42bb53bff5 | 320 | |
maclobdell | 0:1f42bb53bff5 | 321 | 1. Install the [manifest tool](https://github.com/armmbed/manifest-tool). |
maclobdell | 0:1f42bb53bff5 | 322 | 1. Generate an update certificate: |
maclobdell | 0:1f42bb53bff5 | 323 | |
maclobdell | 0:1f42bb53bff5 | 324 | ``` |
maclobdell | 0:1f42bb53bff5 | 325 | $ manifest-tool init -a YOUR_MBED_CLOUD_API_KEY -d yourdomain.com -m device-model-id -q --force |
maclobdell | 0:1f42bb53bff5 | 326 | ``` |
maclobdell | 0:1f42bb53bff5 | 327 | |
maclobdell | 0:1f42bb53bff5 | 328 | <span class="notes">**Note:** Make sure to replace `YOUR_MBED_CLOUD_API_KEY` with an Mbed Cloud API key. |
maclobdell | 0:1f42bb53bff5 | 329 | |
maclobdell | 0:1f42bb53bff5 | 330 | 1. Build the application and combine it with the bootloader: |
maclobdell | 0:1f42bb53bff5 | 331 | |
maclobdell | 0:1f42bb53bff5 | 332 | ``` |
maclobdell | 0:1f42bb53bff5 | 333 | $ mbed compile -m YOUR_TARGET -t GCC_ARM |
maclobdell | 0:1f42bb53bff5 | 334 | $ tools/combine_bootloader_with_app.py -m YOUR_TARGET -a BUILD/YOUR_TARGET/GCC_ARM/simple-mbed-cloud-client-example_application.bin -o combined.bin |
maclobdell | 0:1f42bb53bff5 | 335 | ``` |
maclobdell | 0:1f42bb53bff5 | 336 | |
maclobdell | 0:1f42bb53bff5 | 337 | 1. Flash `combined.bin` to the development board. |
maclobdell | 0:1f42bb53bff5 | 338 | 1. Write down the endpoint ID of the board. You need it to start the update. |
maclobdell | 0:1f42bb53bff5 | 339 | |
maclobdell | 0:1f42bb53bff5 | 340 | Now, a firmware update can be scheduled as explained in the [Mbed Cloud documentation](https://cloud.mbed.com/docs/current/updating-firmware/index.html). You can do it with the manifest tool itself or via the Mbed Cloud portal. Here we explain how to do it with the manifest tool. |
maclobdell | 0:1f42bb53bff5 | 341 | |
maclobdell | 0:1f42bb53bff5 | 342 | 1. Change the application, for example by changing some strings in `main.cpp`. |
maclobdell | 0:1f42bb53bff5 | 343 | 1. Compile the application: |
maclobdell | 0:1f42bb53bff5 | 344 | |
maclobdell | 0:1f42bb53bff5 | 345 | ``` |
maclobdell | 0:1f42bb53bff5 | 346 | $ mbed compile -m YOUR_TARGET -t GCC_ARM |
maclobdell | 0:1f42bb53bff5 | 347 | ``` |
maclobdell | 0:1f42bb53bff5 | 348 | |
maclobdell | 0:1f42bb53bff5 | 349 | 1. The manifest tool can both sign the update - using the private key generated earlier - and upload it to Mbed Cloud in a single command. Run: |
maclobdell | 0:1f42bb53bff5 | 350 | |
maclobdell | 0:1f42bb53bff5 | 351 | ``` |
maclobdell | 0:1f42bb53bff5 | 352 | $ manifest-tool update device -p BUILD/YOUR_BOARD_NAME/GCC_ARM/simple-mbed-cloud-client-example_application.bin -D YOUR_ENDPOINT_NAME |
maclobdell | 0:1f42bb53bff5 | 353 | ``` |
maclobdell | 0:1f42bb53bff5 | 354 | |
maclobdell | 0:1f42bb53bff5 | 355 | Replace `YOUR_BOARD_NAME` with the name of your development board, and replace `YOUR_ENDPOINT_NAME` with the endpoint name in Mbed Cloud. |
maclobdell | 0:1f42bb53bff5 | 356 | |
maclobdell | 0:1f42bb53bff5 | 357 | 1. Inspect the logs on the device to see the update progress. It looks similar to: |
maclobdell | 0:1f42bb53bff5 | 358 | |
maclobdell | 0:1f42bb53bff5 | 359 | ``` |
maclobdell | 0:1f42bb53bff5 | 360 | Firmware download requested |
maclobdell | 0:1f42bb53bff5 | 361 | Authorization granted |
maclobdell | 0:1f42bb53bff5 | 362 | Downloading: [+++- ] 6 % |
maclobdell | 0:1f42bb53bff5 | 363 | ``` |
maclobdell | 0:1f42bb53bff5 | 364 | |
maclobdell | 0:1f42bb53bff5 | 365 | 1. When the download completes, the firmware is verified. If everything is OK, the firmware update is applied. |
maclobdell | 0:1f42bb53bff5 | 366 | |
maclobdell | 0:1f42bb53bff5 | 367 | ## Known issues |
maclobdell | 0:1f42bb53bff5 | 368 | |
maclobdell | 0:1f42bb53bff5 | 369 | Please check the issues reported on github. |
maclobdell | 0:1f42bb53bff5 | 370 |