This is the sample program that can see the decode result of barcode data on Watson IoT.

Dependencies:   AsciiFont DisplayApp GR-PEACH_video LCD_shield_config LWIPBP3595Interface_STA_for_mbed-os USBDevice

Committer:
Osamu Nakamura
Date:
Thu Nov 10 20:23:55 2016 +0900
Revision:
1:67f8b5cfde75
Parent:
0:7d720671e6dc
Revised the initial value of /888/0/7700

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Osamu Nakamura 0:7d720671e6dc 1 /**
Osamu Nakamura 0:7d720671e6dc 2 * @file Utils.cpp
Osamu Nakamura 0:7d720671e6dc 3 * @brief mbed CoAP Endpoint misc utils collection
Osamu Nakamura 0:7d720671e6dc 4 * @author Doug Anson
Osamu Nakamura 0:7d720671e6dc 5 * @version 1.0
Osamu Nakamura 0:7d720671e6dc 6 * @see
Osamu Nakamura 0:7d720671e6dc 7 *
Osamu Nakamura 0:7d720671e6dc 8 * Copyright (c) 2014
Osamu Nakamura 0:7d720671e6dc 9 *
Osamu Nakamura 0:7d720671e6dc 10 * Licensed under the Apache License, Version 2.0 (the "License");
Osamu Nakamura 0:7d720671e6dc 11 * you may not use this file except in compliance with the License.
Osamu Nakamura 0:7d720671e6dc 12 * You may obtain a copy of the License at
Osamu Nakamura 0:7d720671e6dc 13 *
Osamu Nakamura 0:7d720671e6dc 14 * http://www.apache.org/licenses/LICENSE-2.0
Osamu Nakamura 0:7d720671e6dc 15 *
Osamu Nakamura 0:7d720671e6dc 16 * Unless required by applicable law or agreed to in writing, software
Osamu Nakamura 0:7d720671e6dc 17 * distributed under the License is distributed on an "AS IS" BASIS,
Osamu Nakamura 0:7d720671e6dc 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Osamu Nakamura 0:7d720671e6dc 19 * See the License for the specific language governing permissions and
Osamu Nakamura 0:7d720671e6dc 20 * limitations under the License.
Osamu Nakamura 0:7d720671e6dc 21 */
Osamu Nakamura 0:7d720671e6dc 22
Osamu Nakamura 0:7d720671e6dc 23 // mbed Endpoint includes
Osamu Nakamura 0:7d720671e6dc 24 #include "mbed-connector-interface/ConnectorEndpoint.h"
Osamu Nakamura 0:7d720671e6dc 25 #include "mbed-connector-interface/OptionsBuilder.h"
Osamu Nakamura 0:7d720671e6dc 26 #include "mbed-connector-interface/mbedEndpointNetwork.h"
Osamu Nakamura 0:7d720671e6dc 27 #include "mbed-connector-interface/DeviceManager.h"
Osamu Nakamura 0:7d720671e6dc 28 #include "mbed-connector-interface/ObjectInstanceManager.h"
Osamu Nakamura 0:7d720671e6dc 29
Osamu Nakamura 0:7d720671e6dc 30 // External references (defined in main.cpp)
Osamu Nakamura 0:7d720671e6dc 31 Connector::Options *configure_endpoint(Connector::OptionsBuilder &builder);
Osamu Nakamura 0:7d720671e6dc 32 extern Logger logger;
Osamu Nakamura 0:7d720671e6dc 33
Osamu Nakamura 0:7d720671e6dc 34 // Our Endpoint
Osamu Nakamura 0:7d720671e6dc 35 Connector::Endpoint *__endpoint = NULL;
Osamu Nakamura 0:7d720671e6dc 36
Osamu Nakamura 0:7d720671e6dc 37 // Our Endpoint configured Options
Osamu Nakamura 0:7d720671e6dc 38 Connector::OptionsBuilder config;
Osamu Nakamura 0:7d720671e6dc 39 Connector::Options *options = NULL;
Osamu Nakamura 0:7d720671e6dc 40
Osamu Nakamura 0:7d720671e6dc 41 // initialize the Connector::Endpoint instance
Osamu Nakamura 0:7d720671e6dc 42 void *utils_init_endpoint(bool canActAsRouterNode) {
Osamu Nakamura 0:7d720671e6dc 43 // alloc Endpoint
Osamu Nakamura 0:7d720671e6dc 44 logger.logging("Endpoint: allocating endpoint instance...");
Osamu Nakamura 0:7d720671e6dc 45 Connector::Endpoint *ep = new Connector::Endpoint(&logger,options);
Osamu Nakamura 0:7d720671e6dc 46 if (ep != NULL) {
Osamu Nakamura 0:7d720671e6dc 47 // link to config object
Osamu Nakamura 0:7d720671e6dc 48 config.setEndpoint((void *)ep);
Osamu Nakamura 0:7d720671e6dc 49
Osamu Nakamura 0:7d720671e6dc 50 // not sure if we need this anymore...
Osamu Nakamura 0:7d720671e6dc 51 ep->asRouterNode(canActAsRouterNode);
Osamu Nakamura 0:7d720671e6dc 52
Osamu Nakamura 0:7d720671e6dc 53 // Add ObjectInstanceManager
Osamu Nakamura 0:7d720671e6dc 54 ObjectInstanceManager *oim = new ObjectInstanceManager(&logger,(void *)ep);
Osamu Nakamura 0:7d720671e6dc 55 ep->setObjectInstanceManager(oim);
Osamu Nakamura 0:7d720671e6dc 56 }
Osamu Nakamura 0:7d720671e6dc 57 return (void *)ep;
Osamu Nakamura 0:7d720671e6dc 58 }
Osamu Nakamura 0:7d720671e6dc 59
Osamu Nakamura 0:7d720671e6dc 60 // further simplifies the endpoint main() configuration by removing the final initialization details of the endpoint...
Osamu Nakamura 0:7d720671e6dc 61 void utils_configure_endpoint(void *p)
Osamu Nakamura 0:7d720671e6dc 62 {
Osamu Nakamura 0:7d720671e6dc 63 // our Endpoint
Osamu Nakamura 0:7d720671e6dc 64 Connector::Endpoint *ep = (Connector::Endpoint *)p;
Osamu Nakamura 0:7d720671e6dc 65
Osamu Nakamura 0:7d720671e6dc 66 // default configuration - see mbedConnectorInterface.h for definitions...
Osamu Nakamura 0:7d720671e6dc 67 logger.logging("Endpoint: setting defaults...");
Osamu Nakamura 0:7d720671e6dc 68 config.setEndpointNodename(NODE_NAME);
Osamu Nakamura 0:7d720671e6dc 69 config.setEndpointType(DEFAULT_ENDPOINT_TYPE);
Osamu Nakamura 0:7d720671e6dc 70 config.setLifetime(REG_LIFETIME_SEC);
Osamu Nakamura 0:7d720671e6dc 71
Osamu Nakamura 0:7d720671e6dc 72 // WiFi defaults
Osamu Nakamura 0:7d720671e6dc 73 config.setWiFiSSID((char *)WIFI_DEFAULT_SSID); // default: changeme
Osamu Nakamura 0:7d720671e6dc 74 config.setWiFiAuthType(WIFI_NONE); // default: none
Osamu Nakamura 0:7d720671e6dc 75 config.setWiFiAuthKey((char *)WIFI_DEFAULT_AUTH_KEY); // default: changeme
Osamu Nakamura 0:7d720671e6dc 76
Osamu Nakamura 0:7d720671e6dc 77 // Default CoAP Connection Type
Osamu Nakamura 0:7d720671e6dc 78 config.setCoAPConnectionType(COAP_UDP); // default CoAP Connection Type
Osamu Nakamura 0:7d720671e6dc 79
Osamu Nakamura 0:7d720671e6dc 80 // Set the default IP Address Type
Osamu Nakamura 0:7d720671e6dc 81 #if MBED_CONF_APP_NETWORK_INTERFACE == MESH_LOWPAN_ND || MBED_CONF_APP_NETWORK_INTERFACE == MESH_THREAD
Osamu Nakamura 0:7d720671e6dc 82 config.setIPAddressType(IP_ADDRESS_TYPE_IPV6); // IPv6 is the default for mesh
Osamu Nakamura 0:7d720671e6dc 83 #else
Osamu Nakamura 0:7d720671e6dc 84 config.setIPAddressType(IP_ADDRESS_TYPE_IPV4); // IPv4 is the default for all but mesh
Osamu Nakamura 0:7d720671e6dc 85 #endif
Osamu Nakamura 0:7d720671e6dc 86
Osamu Nakamura 0:7d720671e6dc 87 // Establish default CoAP observation behavior
Osamu Nakamura 0:7d720671e6dc 88 config.setImmedateObservationEnabled(true);
Osamu Nakamura 0:7d720671e6dc 89
Osamu Nakamura 0:7d720671e6dc 90 // Establish default CoAP GET-based observation control behavior
Osamu Nakamura 0:7d720671e6dc 91 config.setEnableGETObservationControl(false);
Osamu Nakamura 0:7d720671e6dc 92
Osamu Nakamura 0:7d720671e6dc 93 // Device Manager installation
Osamu Nakamura 0:7d720671e6dc 94 DeviceManager *device_manager = (DeviceManager *)ep->getDeviceManager();
Osamu Nakamura 0:7d720671e6dc 95 if (device_manager != NULL) {
Osamu Nakamura 0:7d720671e6dc 96 logger.logging("Endpoint: installing and setting up device manager and its resources...");
Osamu Nakamura 0:7d720671e6dc 97 device_manager->install((void *)ep,(void *)&config);
Osamu Nakamura 0:7d720671e6dc 98 }
Osamu Nakamura 0:7d720671e6dc 99 else {
Osamu Nakamura 0:7d720671e6dc 100 logger.logging("Endpoint: no device manager installed...");
Osamu Nakamura 0:7d720671e6dc 101 }
Osamu Nakamura 0:7d720671e6dc 102
Osamu Nakamura 0:7d720671e6dc 103 // main.cpp can override or change any of the above defaults...
Osamu Nakamura 0:7d720671e6dc 104 logger.logging("Endpoint: gathering configuration overrides...");
Osamu Nakamura 0:7d720671e6dc 105 options = configure_endpoint(config);
Osamu Nakamura 0:7d720671e6dc 106
Osamu Nakamura 0:7d720671e6dc 107 // set our options
Osamu Nakamura 0:7d720671e6dc 108 ep->setOptions(options);
Osamu Nakamura 0:7d720671e6dc 109
Osamu Nakamura 0:7d720671e6dc 110 // DONE
Osamu Nakamura 0:7d720671e6dc 111 logger.logging("Endpoint: endpoint configuration completed.");
Osamu Nakamura 0:7d720671e6dc 112 }
Osamu Nakamura 0:7d720671e6dc 113
Osamu Nakamura 0:7d720671e6dc 114 // build out the endpoint and its resources
Osamu Nakamura 0:7d720671e6dc 115 void utils_build_endpoint(void *p)
Osamu Nakamura 0:7d720671e6dc 116 {
Osamu Nakamura 0:7d720671e6dc 117 if (p != NULL) {
Osamu Nakamura 0:7d720671e6dc 118 // Build the Endpoint
Osamu Nakamura 0:7d720671e6dc 119 logger.logging("Endpoint: building endpoint and its resources...");
Osamu Nakamura 0:7d720671e6dc 120 Connector::Endpoint *ep = (Connector::Endpoint *)p;
Osamu Nakamura 0:7d720671e6dc 121 ep->buildEndpoint();
Osamu Nakamura 0:7d720671e6dc 122 }
Osamu Nakamura 0:7d720671e6dc 123 }
Osamu Nakamura 0:7d720671e6dc 124
Osamu Nakamura 0:7d720671e6dc 125 // parse out the CoAP port number from the connection URL
Osamu Nakamura 0:7d720671e6dc 126 uint16_t extract_port_from_url(char *url,uint16_t default_port)
Osamu Nakamura 0:7d720671e6dc 127 {
Osamu Nakamura 0:7d720671e6dc 128 uint16_t port = default_port;
Osamu Nakamura 0:7d720671e6dc 129
Osamu Nakamura 0:7d720671e6dc 130 if (url != NULL && strlen(url) > 0) {
Osamu Nakamura 0:7d720671e6dc 131 char buffer[MAX_CONN_URL_LENGTH+1];
Osamu Nakamura 0:7d720671e6dc 132 char uri[MAX_CONN_URL_LENGTH+1];
Osamu Nakamura 0:7d720671e6dc 133 char path[MAX_CONN_URL_LENGTH+1];
Osamu Nakamura 0:7d720671e6dc 134
Osamu Nakamura 0:7d720671e6dc 135 // initialize the buffer
Osamu Nakamura 0:7d720671e6dc 136 memset(buffer,0,MAX_CONN_URL_LENGTH+1);
Osamu Nakamura 0:7d720671e6dc 137 memset(uri,0,MAX_CONN_URL_LENGTH+1);
Osamu Nakamura 0:7d720671e6dc 138 memset(path,0,MAX_CONN_URL_LENGTH+1);
Osamu Nakamura 0:7d720671e6dc 139 int length = strlen(url);
Osamu Nakamura 0:7d720671e6dc 140
Osamu Nakamura 0:7d720671e6dc 141 // truncate if needed
Osamu Nakamura 0:7d720671e6dc 142 if (length >MAX_CONN_URL_LENGTH) length = MAX_CONN_URL_LENGTH;
Osamu Nakamura 0:7d720671e6dc 143
Osamu Nakamura 0:7d720671e6dc 144 // make a copy...
Osamu Nakamura 0:7d720671e6dc 145 memcpy(buffer,url,length);
Osamu Nakamura 0:7d720671e6dc 146
Osamu Nakamura 0:7d720671e6dc 147 // remove the forward slashes and colons
Osamu Nakamura 0:7d720671e6dc 148 for(int i=0;i<length;++i) {
Osamu Nakamura 0:7d720671e6dc 149 if (buffer[i] == ':') buffer[i] = ' ';
Osamu Nakamura 0:7d720671e6dc 150 if (buffer[i] == '/') buffer[i] = ' ';
Osamu Nakamura 0:7d720671e6dc 151 if (buffer[i] == '[') buffer[i] = ' ';
Osamu Nakamura 0:7d720671e6dc 152 if (buffer[i] == ']') buffer[i] = ' ';
Osamu Nakamura 0:7d720671e6dc 153 }
Osamu Nakamura 0:7d720671e6dc 154
Osamu Nakamura 0:7d720671e6dc 155 // parse
Osamu Nakamura 0:7d720671e6dc 156 sscanf(buffer,"%s%s%d",uri,path,(int *)&port);
Osamu Nakamura 0:7d720671e6dc 157
Osamu Nakamura 0:7d720671e6dc 158 // IPv6 kludge until we parse it properly...
Osamu Nakamura 0:7d720671e6dc 159 if (strcmp(uri,"coaps") == 0 && strcmp(path,"2607") == 0) {
Osamu Nakamura 0:7d720671e6dc 160 // IPv6 in use - so nail to Connector's IPv6 address
Osamu Nakamura 0:7d720671e6dc 161 strcpy(uri,"coap");
Osamu Nakamura 0:7d720671e6dc 162 strcpy(path,"2607:f0d0:2601:52::20");
Osamu Nakamura 0:7d720671e6dc 163 port = default_port;
Osamu Nakamura 0:7d720671e6dc 164
Osamu Nakamura 0:7d720671e6dc 165 // DEBUG
Osamu Nakamura 0:7d720671e6dc 166 logger.logging("Endpoint: Connector IPV6 uri: %s path: %s port: %d",uri,path,port);
Osamu Nakamura 0:7d720671e6dc 167 }
Osamu Nakamura 0:7d720671e6dc 168 }
Osamu Nakamura 0:7d720671e6dc 169
Osamu Nakamura 0:7d720671e6dc 170 // DEBUG
Osamu Nakamura 0:7d720671e6dc 171 logger.logging("Endpoint: Connector URL: %s CoAP port: %u",url,port);
Osamu Nakamura 0:7d720671e6dc 172
Osamu Nakamura 0:7d720671e6dc 173 // return the port
Osamu Nakamura 0:7d720671e6dc 174 return port;
Osamu Nakamura 0:7d720671e6dc 175 }