Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 // ---------------------------------------------------------------------------- 00002 // Copyright 2016-2018 ARM Ltd. 00003 // 00004 // SPDX-License-Identifier: Apache-2.0 00005 // 00006 // Licensed under the Apache License, Version 2.0 (the "License"); 00007 // you may not use this file except in compliance with the License. 00008 // You may obtain a copy of the License at 00009 // 00010 // http://www.apache.org/licenses/LICENSE-2.0 00011 // 00012 // Unless required by applicable law or agreed to in writing, software 00013 // distributed under the License is distributed on an "AS IS" BASIS, 00014 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00015 // See the License for the specific language governing permissions and 00016 // limitations under the License. 00017 // ---------------------------------------------------------------------------- 00018 #ifndef MBED_TEST_MODE 00019 00020 #include "mbed.h" 00021 #include "simple-mbed-cloud-client.h" 00022 #include "FATFileSystem.h" 00023 #include "LittleFileSystem.h" 00024 00025 // Default network interface object. Don't forget to change the WiFi SSID/password in mbed_app.json if you're using WiFi. 00026 NetworkInterface *net = NetworkInterface::get_default_instance(); 00027 00028 // Default block device available on the target board 00029 BlockDevice *bd = BlockDevice::get_default_instance(); 00030 00031 #if COMPONENT_SD || COMPONENT_NUSD 00032 // Use FATFileSystem for SD card type blockdevices 00033 FATFileSystem fs("fs"); 00034 #else 00035 // Use LittleFileSystem for non-SD block devices to enable wear leveling and other functions 00036 LittleFileSystem fs("fs"); 00037 #endif 00038 00039 // Default User button for GET example 00040 InterruptIn button(BUTTON1); 00041 // Default LED to use for PUT/POST example 00042 DigitalOut led(LED1, 0); 00043 00044 // How often to fetch sensor data (in seconds) 00045 #define SENSORS_POLL_INTERVAL 3.0 00046 00047 // Send all sensor data or just limited (useful for when running out of memory) 00048 #define SEND_ALL_SENSORS 00049 00050 // Sensors related includes and initialization 00051 // Temperature reading from microcontroller 00052 AnalogIn adc_temp(ADC_TEMP); 00053 // Voltage reference reading from microcontroller 00054 AnalogIn adc_vref(ADC_VREF); 00055 00056 // Declaring pointers for access to Pelion Device Management Client resources outside of main() 00057 MbedCloudClientResource *res_button; 00058 MbedCloudClientResource *res_led; 00059 MbedCloudClientResource *res_post; 00060 00061 // Additional resources for sensor readings 00062 #ifdef SEND_ALL_SENSORS 00063 MbedCloudClientResource *res_temperature; 00064 MbedCloudClientResource *res_voltage; 00065 #endif /* SEND_ALL_SENSORS */ 00066 00067 // An event queue is a very useful structure to debounce information between contexts (e.g. ISR and normal threads) 00068 // 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 00069 EventQueue eventQueue; 00070 00071 // When the device is registered, this variable will be used to access various useful information, like device ID etc. 00072 static const ConnectorClientEndpointInfo* endpointInfo; 00073 00074 /** 00075 * PUT handler - sets the value of the built-in LED 00076 * @param resource The resource that triggered the callback 00077 * @param newValue Updated value for the resource 00078 */ 00079 void put_callback(MbedCloudClientResource *resource, m2m::String newValue) { 00080 printf("PUT received. New value: %s\n", newValue.c_str()); 00081 led = atoi(newValue.c_str()); 00082 } 00083 00084 /** 00085 * POST handler - prints the content of the payload 00086 * @param resource The resource that triggered the callback 00087 * @param buffer If a body was passed to the POST function, this contains the data. 00088 * Note that the buffer is deallocated after leaving this function, so copy it if you need it longer. 00089 * @param size Size of the body 00090 */ 00091 void post_callback(MbedCloudClientResource *resource, const uint8_t *buffer, uint16_t size) { 00092 printf("POST received (length %u). Payload: ", size); 00093 for (size_t ix = 0; ix < size; ix++) { 00094 printf("%02x ", buffer[ix]); 00095 } 00096 printf("\n"); 00097 } 00098 00099 /** 00100 * Button handler 00101 * This function will be triggered either by a physical button press or by a ticker every 5 seconds (see below) 00102 */ 00103 void button_press() { 00104 int v = res_button->get_value_int() + 1; 00105 res_button->set_value(v); 00106 printf("Button clicked %d times\n", v); 00107 } 00108 00109 /** 00110 * Notification callback handler 00111 * @param resource The resource that triggered the callback 00112 * @param status The delivery status of the notification 00113 */ 00114 void button_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status) { 00115 printf("Button notification, status %s (%d)\n", MbedCloudClientResource::delivery_status_to_string(status), status); 00116 } 00117 00118 /** 00119 * Registration callback handler 00120 * @param endpoint Information about the registered endpoint such as the name (so you can find it back in portal) 00121 * When the device is registered, this variable will be used to access various useful information, like device ID etc. 00122 */ 00123 void registered(const ConnectorClientEndpointInfo *endpoint) { 00124 printf("Registered to Pelion Device Management. Endpoint Name: %s\n", endpoint->internal_endpoint_name.c_str()); 00125 endpointInfo = endpoint; 00126 } 00127 00128 /** 00129 * Update sensors and report their values. 00130 * This function is called periodically. 00131 */ 00132 void sensors_update() { 00133 float temp = adc_temp.read()*100; 00134 float vref = adc_vref.read(); 00135 printf("ADC temp: %6.4f C, vref: %6.4f %%\r\n", temp, vref); 00136 if (endpointInfo) { 00137 res_temperature->set_value(temp); 00138 res_voltage->set_value(vref); 00139 } 00140 } 00141 00142 00143 int main(void) { 00144 printf("\nStarting Simple Pelion Device Management Client example\n"); 00145 00146 int storage_status = fs.mount(bd); 00147 if (storage_status != 0) { 00148 printf("Storage mounting failed.\n"); 00149 } 00150 // If the User button is pressed ons start, then format storage. 00151 bool btn_pressed = (button.read() == MBED_CONF_APP_BUTTON_PRESSED_STATE); 00152 if (btn_pressed) { 00153 printf("User button is pushed on start...\n"); 00154 } 00155 00156 if (storage_status || btn_pressed) { 00157 printf("Formatting the storage...\n"); 00158 int storage_status = StorageHelper::format(&fs, bd); 00159 if (storage_status != 0) { 00160 printf("ERROR: Failed to reformat the storage (%d).\n", storage_status); 00161 } 00162 } else { 00163 printf("You can hold the user button during boot to format the storage and change the device identity.\n"); 00164 } 00165 00166 // Connect to the Internet (DHCP is expected to be on) 00167 printf("Connecting to the network using the default network interface...\n"); 00168 net = NetworkInterface::get_default_instance(); 00169 00170 nsapi_error_t net_status = NSAPI_ERROR_NO_CONNECTION; 00171 while ((net_status = net->connect()) != NSAPI_ERROR_OK) { 00172 printf("Unable to connect to network (%d). Retrying...\n", net_status); 00173 } 00174 00175 printf("Connected to the network successfully. IP address: %s\n", net->get_ip_address()); 00176 00177 printf("Initializing Pelion Device Management Client...\n"); 00178 00179 // SimpleMbedCloudClient handles registering over LwM2M to Pelion Device Management 00180 SimpleMbedCloudClient client(net, bd, &fs); 00181 int client_status = client.init(); 00182 if (client_status != 0) { 00183 printf("Pelion Client initialization failed (%d)\n", client_status); 00184 return -1; 00185 } 00186 00187 // Creating resources, which can be written or read from the cloud 00188 res_button = client.create_resource("3200/0/5501", "Button Count"); 00189 res_button->set_value(0); 00190 res_button->methods(M2MMethod::GET); 00191 res_button->observable(true); 00192 res_button->attach_notification_callback(button_callback); 00193 00194 res_led = client.create_resource("3201/0/5853", "LED State"); 00195 res_led->set_value(led.read()); 00196 res_led->methods(M2MMethod::GET | M2MMethod::PUT); 00197 res_led->attach_put_callback(put_callback); 00198 00199 res_post = client.create_resource("3300/0/5605", "Execute Function"); 00200 res_post->methods(M2MMethod::POST); 00201 res_post->attach_post_callback(post_callback); 00202 00203 // Sensor resources 00204 res_temperature = client.create_resource("3303/0/5700", "Temperature (C)"); 00205 res_temperature->set_value(0); 00206 res_temperature->methods(M2MMethod::GET); 00207 res_temperature->observable(true); 00208 00209 res_voltage = client.create_resource("3316/0/5700", "Voltage"); 00210 res_voltage->set_value(0); 00211 res_voltage->methods(M2MMethod::GET); 00212 res_voltage->observable(true); 00213 00214 printf("Initialized Pelion Device Management Client. Registering...\n"); 00215 00216 // Callback that fires when registering is complete 00217 client.on_registered(®istered); 00218 00219 // Register with Pelion DM 00220 client.register_and_connect(); 00221 00222 // The button fires on an interrupt context, but debounces it to the eventqueue, so it's safe to do network operations 00223 button.fall(eventQueue.event(&button_press)); 00224 printf("Press the user button to increment the LwM2M resource value...\n"); 00225 00226 Ticker timer; 00227 timer.attach(eventQueue.event(&sensors_update), SENSORS_POLL_INTERVAL); 00228 00229 // You can easily run the eventQueue in a separate thread if required 00230 eventQueue.dispatch_forever(); 00231 } 00232 00233 #endif /* MBED_TEST_MODE */
Generated on Mon Aug 29 2022 19:53:40 by
