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 ConnectorEndpoint.cpp
Osamu Nakamura 0:7d720671e6dc 3 * @brief mbed CoAP Endpoint base class
Osamu Nakamura 0:7d720671e6dc 4 * @author Doug Anson/Chris Paola
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 // Lower level Network
Osamu Nakamura 0:7d720671e6dc 24 #include "mbed-connector-interface/mbedEndpointNetwork.h"
Osamu Nakamura 0:7d720671e6dc 25
Osamu Nakamura 0:7d720671e6dc 26 // ConnectorEndpoint
Osamu Nakamura 0:7d720671e6dc 27 #include "mbed-connector-interface/ConnectorEndpoint.h"
Osamu Nakamura 0:7d720671e6dc 28
Osamu Nakamura 0:7d720671e6dc 29 // Utils support
Osamu Nakamura 0:7d720671e6dc 30 #include "mbed-connector-interface/Utils.h"
Osamu Nakamura 0:7d720671e6dc 31
Osamu Nakamura 0:7d720671e6dc 32 // Device Manager support
Osamu Nakamura 0:7d720671e6dc 33 #include "mbed-connector-interface/DeviceManager.h"
Osamu Nakamura 0:7d720671e6dc 34
Osamu Nakamura 0:7d720671e6dc 35 // our endpoint instance
Osamu Nakamura 0:7d720671e6dc 36 static Connector::Endpoint *__endpoint = NULL;
Osamu Nakamura 0:7d720671e6dc 37
Osamu Nakamura 0:7d720671e6dc 38 // LWIP Network interface instance
Osamu Nakamura 0:7d720671e6dc 39 NetworkInterface *__network_interface = NULL;
Osamu Nakamura 0:7d720671e6dc 40
Osamu Nakamura 0:7d720671e6dc 41 // Connector namespace
Osamu Nakamura 0:7d720671e6dc 42 namespace Connector {
Osamu Nakamura 0:7d720671e6dc 43
Osamu Nakamura 0:7d720671e6dc 44 // STATIC: Plumb the network
Osamu Nakamura 0:7d720671e6dc 45 void Endpoint::plumbNetwork(void *device_manager,bool canActAsRouterNode) {
Osamu Nakamura 0:7d720671e6dc 46 // create our endpoint instance...
Osamu Nakamura 0:7d720671e6dc 47 if (__endpoint == NULL) {
Osamu Nakamura 0:7d720671e6dc 48 // initialize our endpoint instance
Osamu Nakamura 0:7d720671e6dc 49 printf("Connector::Endpoint::plumbNetwork: initializing endpoint instance...\r\n");
Osamu Nakamura 0:7d720671e6dc 50 __endpoint = (Connector::Endpoint *)utils_init_endpoint(canActAsRouterNode);
Osamu Nakamura 0:7d720671e6dc 51 }
Osamu Nakamura 0:7d720671e6dc 52
Osamu Nakamura 0:7d720671e6dc 53 // set the device manager
Osamu Nakamura 0:7d720671e6dc 54 if (device_manager != NULL) {
Osamu Nakamura 0:7d720671e6dc 55 // device manager has been supplied
Osamu Nakamura 0:7d720671e6dc 56 printf("Connector::Endpoint::plumbNetwork: setting a device manager...\r\n");
Osamu Nakamura 0:7d720671e6dc 57 __endpoint->setDeviceManager(device_manager);
Osamu Nakamura 0:7d720671e6dc 58 }
Osamu Nakamura 0:7d720671e6dc 59 else {
Osamu Nakamura 0:7d720671e6dc 60 // no device manager supplied
Osamu Nakamura 0:7d720671e6dc 61 printf("Connector::Endpoint::plumbNetwork: no device manager supplied (OK)\r\n");
Osamu Nakamura 0:7d720671e6dc 62 }
Osamu Nakamura 0:7d720671e6dc 63
Osamu Nakamura 0:7d720671e6dc 64 // configure the endpoint...
Osamu Nakamura 0:7d720671e6dc 65 printf("Connector::Endpoint::plumbNetwork: configuring endpoint...\r\n");
Osamu Nakamura 0:7d720671e6dc 66 utils_configure_endpoint((void *)__endpoint);
Osamu Nakamura 0:7d720671e6dc 67
Osamu Nakamura 0:7d720671e6dc 68 // plumb the endpoint's network...
Osamu Nakamura 0:7d720671e6dc 69 printf("Connector::Endpoint::plumbNetwork: plumbing network...\r\n");
Osamu Nakamura 0:7d720671e6dc 70 net_plumb_network((void *)__endpoint);
Osamu Nakamura 0:7d720671e6dc 71 }
Osamu Nakamura 0:7d720671e6dc 72
Osamu Nakamura 0:7d720671e6dc 73 // STATIC: Finalize the endpoint's configuration and begin the endpoint's main even loop (static, not tied into Logger)
Osamu Nakamura 0:7d720671e6dc 74 void Endpoint::start()
Osamu Nakamura 0:7d720671e6dc 75 {
Osamu Nakamura 0:7d720671e6dc 76 // build out the endpoint with its configuration...
Osamu Nakamura 0:7d720671e6dc 77 printf("Connector::Endpoint::start: building out endpoint...\r\n");
Osamu Nakamura 0:7d720671e6dc 78 utils_build_endpoint((void *)__endpoint);
Osamu Nakamura 0:7d720671e6dc 79
Osamu Nakamura 0:7d720671e6dc 80 // finalize the endpoint and start its main loop
Osamu Nakamura 0:7d720671e6dc 81 printf("Endpoint::start: finalize and run the endpoint main loop..\r\n");
Osamu Nakamura 0:7d720671e6dc 82 net_finalize_and_run_endpoint_main_loop((void *)__endpoint);
Osamu Nakamura 0:7d720671e6dc 83 }
Osamu Nakamura 0:7d720671e6dc 84
Osamu Nakamura 0:7d720671e6dc 85 // STATIC: Set the ConnectionStatusInterface Implementation instance
Osamu Nakamura 0:7d720671e6dc 86 void Endpoint::setConnectionStatusInterface(ConnectionStatusInterface *csi) {
Osamu Nakamura 0:7d720671e6dc 87 if (__endpoint != NULL) {
Osamu Nakamura 0:7d720671e6dc 88 __endpoint->setConnectionStatusInterfaceImpl(csi);
Osamu Nakamura 0:7d720671e6dc 89 }
Osamu Nakamura 0:7d720671e6dc 90 }
Osamu Nakamura 0:7d720671e6dc 91
Osamu Nakamura 0:7d720671e6dc 92 // Constructor
Osamu Nakamura 0:7d720671e6dc 93 Endpoint::Endpoint(const Logger *logger, const Options *options) : M2MInterfaceObserver()
Osamu Nakamura 0:7d720671e6dc 94 {
Osamu Nakamura 0:7d720671e6dc 95 this->m_logger = (Logger *)logger;
Osamu Nakamura 0:7d720671e6dc 96 this->m_options = (Options *)options;
Osamu Nakamura 0:7d720671e6dc 97 this->m_device_manager = NULL;
Osamu Nakamura 0:7d720671e6dc 98 this->m_connected = false;
Osamu Nakamura 0:7d720671e6dc 99 this->m_registered = false;
Osamu Nakamura 0:7d720671e6dc 100 this->m_csi = NULL;
Osamu Nakamura 0:7d720671e6dc 101 this->m_oim = NULL;
Osamu Nakamura 0:7d720671e6dc 102 }
Osamu Nakamura 0:7d720671e6dc 103
Osamu Nakamura 0:7d720671e6dc 104 // Copy Constructor
Osamu Nakamura 0:7d720671e6dc 105 Endpoint::Endpoint(const Endpoint &ep)
Osamu Nakamura 0:7d720671e6dc 106 {
Osamu Nakamura 0:7d720671e6dc 107 this->m_logger = ep.m_logger;
Osamu Nakamura 0:7d720671e6dc 108 this->m_options = ep.m_options;
Osamu Nakamura 0:7d720671e6dc 109 this->m_endpoint_interface = ep.m_endpoint_interface;
Osamu Nakamura 0:7d720671e6dc 110 this->m_endpoint_security = ep.m_endpoint_security;
Osamu Nakamura 0:7d720671e6dc 111 this->m_endpoint_object_list = ep.m_endpoint_object_list;
Osamu Nakamura 0:7d720671e6dc 112 this->m_device_manager = ep.m_device_manager;
Osamu Nakamura 0:7d720671e6dc 113 this->m_connected = ep.m_connected;
Osamu Nakamura 0:7d720671e6dc 114 this->m_registered = ep.m_registered;
Osamu Nakamura 0:7d720671e6dc 115 this->m_csi = ep.m_csi;
Osamu Nakamura 0:7d720671e6dc 116 this->m_oim = ep.m_oim;
Osamu Nakamura 0:7d720671e6dc 117 }
Osamu Nakamura 0:7d720671e6dc 118
Osamu Nakamura 0:7d720671e6dc 119 // Destructor
Osamu Nakamura 0:7d720671e6dc 120 Endpoint::~Endpoint() {
Osamu Nakamura 0:7d720671e6dc 121 if (this->m_endpoint_interface != NULL)
Osamu Nakamura 0:7d720671e6dc 122 delete this->m_endpoint_interface;
Osamu Nakamura 0:7d720671e6dc 123 if (this->m_endpoint_security != NULL)
Osamu Nakamura 0:7d720671e6dc 124 delete this->m_endpoint_security;
Osamu Nakamura 0:7d720671e6dc 125 }
Osamu Nakamura 0:7d720671e6dc 126
Osamu Nakamura 0:7d720671e6dc 127 // set the device manager
Osamu Nakamura 0:7d720671e6dc 128 void Endpoint::setDeviceManager(void *device_manager) {
Osamu Nakamura 0:7d720671e6dc 129 this->m_device_manager = device_manager;
Osamu Nakamura 0:7d720671e6dc 130 }
Osamu Nakamura 0:7d720671e6dc 131
Osamu Nakamura 0:7d720671e6dc 132 // get the device manager
Osamu Nakamura 0:7d720671e6dc 133 void *Endpoint::getDeviceManager(void) {
Osamu Nakamura 0:7d720671e6dc 134 return this->m_device_manager;
Osamu Nakamura 0:7d720671e6dc 135 }
Osamu Nakamura 0:7d720671e6dc 136
Osamu Nakamura 0:7d720671e6dc 137 // router node behavior setting
Osamu Nakamura 0:7d720671e6dc 138 void Endpoint::asRouterNode(bool canActAsRouterNode) {
Osamu Nakamura 0:7d720671e6dc 139 this->m_canActAsRouterNode = canActAsRouterNode;
Osamu Nakamura 0:7d720671e6dc 140 }
Osamu Nakamura 0:7d720671e6dc 141
Osamu Nakamura 0:7d720671e6dc 142 // set our Options
Osamu Nakamura 0:7d720671e6dc 143 void Endpoint::setOptions(Options *options) {
Osamu Nakamura 0:7d720671e6dc 144 this->m_options = options;
Osamu Nakamura 0:7d720671e6dc 145 }
Osamu Nakamura 0:7d720671e6dc 146
Osamu Nakamura 0:7d720671e6dc 147 // get our Options
Osamu Nakamura 0:7d720671e6dc 148 Options *Endpoint::getOptions() {
Osamu Nakamura 0:7d720671e6dc 149 return this->m_options;
Osamu Nakamura 0:7d720671e6dc 150 }
Osamu Nakamura 0:7d720671e6dc 151
Osamu Nakamura 0:7d720671e6dc 152 // get our Server
Osamu Nakamura 0:7d720671e6dc 153 M2MSecurity *Endpoint::getEndpointSecurity() {
Osamu Nakamura 0:7d720671e6dc 154 return this->m_endpoint_security;
Osamu Nakamura 0:7d720671e6dc 155 }
Osamu Nakamura 0:7d720671e6dc 156
Osamu Nakamura 0:7d720671e6dc 157 // get our ObjectList
Osamu Nakamura 0:7d720671e6dc 158 M2MObjectList Endpoint::getEndpointObjectList() {
Osamu Nakamura 0:7d720671e6dc 159 return this->m_endpoint_object_list;
Osamu Nakamura 0:7d720671e6dc 160 }
Osamu Nakamura 0:7d720671e6dc 161
Osamu Nakamura 0:7d720671e6dc 162 // get our endpoint interface
Osamu Nakamura 0:7d720671e6dc 163 M2MInterface *Endpoint::getEndpointInterface() {
Osamu Nakamura 0:7d720671e6dc 164 return this->m_endpoint_interface;
Osamu Nakamura 0:7d720671e6dc 165 }
Osamu Nakamura 0:7d720671e6dc 166
Osamu Nakamura 0:7d720671e6dc 167 // mbed-client: create our interface
Osamu Nakamura 0:7d720671e6dc 168 void Endpoint::createEndpointInterface() {
Osamu Nakamura 0:7d720671e6dc 169 // get the CoAP listening port
Osamu Nakamura 0:7d720671e6dc 170 uint16_t listening_port = (uint16_t)this->m_options->getConnectorPort();
Osamu Nakamura 0:7d720671e6dc 171
Osamu Nakamura 0:7d720671e6dc 172 // randomize the port if we are using certificates...
Osamu Nakamura 0:7d720671e6dc 173 if (this->m_options->getServerCertificateSize() > 0) {
Osamu Nakamura 0:7d720671e6dc 174 // Randomizing listening port for Certificate mode connectivity
Osamu Nakamura 0:7d720671e6dc 175 srand(time(NULL));
Osamu Nakamura 0:7d720671e6dc 176 listening_port = rand() % 65535 + 12345;
Osamu Nakamura 0:7d720671e6dc 177 }
Osamu Nakamura 0:7d720671e6dc 178
Osamu Nakamura 0:7d720671e6dc 179 // DEBUG
Osamu Nakamura 0:7d720671e6dc 180 //this->logger()->logging("Connector::Endpoint: listening port: %d",listening_port);
Osamu Nakamura 0:7d720671e6dc 181
Osamu Nakamura 0:7d720671e6dc 182 // Socket protocol type: TCP or UDP
Osamu Nakamura 0:7d720671e6dc 183 M2MInterface::BindingMode socket_protocol_type = M2MInterface::UDP;
Osamu Nakamura 0:7d720671e6dc 184 if (this->m_options->getCoAPConnectionType() == COAP_TCP) socket_protocol_type = M2MInterface::TCP;
Osamu Nakamura 0:7d720671e6dc 185
Osamu Nakamura 0:7d720671e6dc 186 // Socket address type: IPv4 or IPv6
Osamu Nakamura 0:7d720671e6dc 187 M2MInterface::NetworkStack socket_address_type = M2MInterface::LwIP_IPv4;
Osamu Nakamura 0:7d720671e6dc 188 if (this->m_options->getIPAddressType() == IP_ADDRESS_TYPE_IPV6) {
Osamu Nakamura 0:7d720671e6dc 189 // IPv6 mode for the socket addressing type...
Osamu Nakamura 0:7d720671e6dc 190 socket_address_type = M2MInterface::LwIP_IPv6;
Osamu Nakamura 0:7d720671e6dc 191
Osamu Nakamura 0:7d720671e6dc 192 #if defined (IPV4_OVERRIDE)
Osamu Nakamura 0:7d720671e6dc 193 // OVERRIDE (until patched...)
Osamu Nakamura 0:7d720671e6dc 194 this->logger()->logging("Connector::Endpoint: Socket Address Type: IPv4 (IPv6 OVERRIDE)");
Osamu Nakamura 0:7d720671e6dc 195 socket_address_type = M2MInterface::LwIP_IPv4;
Osamu Nakamura 0:7d720671e6dc 196 #endif
Osamu Nakamura 0:7d720671e6dc 197 }
Osamu Nakamura 0:7d720671e6dc 198
Osamu Nakamura 0:7d720671e6dc 199 // DEBUG
Osamu Nakamura 0:7d720671e6dc 200 if (socket_protocol_type == M2MInterface::TCP) this->logger()->logging("Connector::Endpoint: Socket Protocol: TCP");
Osamu Nakamura 0:7d720671e6dc 201 if (socket_protocol_type == M2MInterface::UDP) this->logger()->logging("Connector::Endpoint: Socket Protocol: UDP");
Osamu Nakamura 0:7d720671e6dc 202 if (socket_address_type == M2MInterface::LwIP_IPv4) this->logger()->logging("Connector::Endpoint: Socket Address Type: IPv4");
Osamu Nakamura 0:7d720671e6dc 203 if (socket_address_type == M2MInterface::LwIP_IPv6) this->logger()->logging("Connector::Endpoint: Socket Address Type: IPv6");
Osamu Nakamura 0:7d720671e6dc 204
Osamu Nakamura 0:7d720671e6dc 205 // Create the endpoint M2MInterface instance
Osamu Nakamura 0:7d720671e6dc 206 this->m_endpoint_interface = M2MInterfaceFactory::create_interface(*this,
Osamu Nakamura 0:7d720671e6dc 207 (char *)this->m_options->getEndpointNodename().c_str(), // endpoint name
Osamu Nakamura 0:7d720671e6dc 208 (char *)this->m_options->getEndpointType().c_str(), // endpoint type
Osamu Nakamura 0:7d720671e6dc 209 (int32_t)this->m_options->getLifetime(), // registration lifetime (in seconds)
Osamu Nakamura 0:7d720671e6dc 210 listening_port, // listening port (ephemeral...)
Osamu Nakamura 0:7d720671e6dc 211 (char *)this->m_options->getDomain().c_str(), // endpoint domain
Osamu Nakamura 0:7d720671e6dc 212 socket_protocol_type, // Socket protocol type: UDP or TCP...
Osamu Nakamura 0:7d720671e6dc 213 socket_address_type, // Socket addressing type: IPv4 or IPv6
Osamu Nakamura 0:7d720671e6dc 214 CONTEXT_ADDRESS_STRING // context address string (mbedConnectorInterface.h)
Osamu Nakamura 0:7d720671e6dc 215 );
Osamu Nakamura 0:7d720671e6dc 216
Osamu Nakamura 0:7d720671e6dc 217 // bind LWIP network interface pointer...
Osamu Nakamura 0:7d720671e6dc 218 if (__network_interface != NULL && this->m_endpoint_interface != NULL) {
Osamu Nakamura 0:7d720671e6dc 219 this->logger()->logging("Connector::Endpoint: binding LWIP network instance...");
Osamu Nakamura 0:7d720671e6dc 220 this->m_endpoint_interface->set_platform_network_handler((void *)__network_interface);
Osamu Nakamura 0:7d720671e6dc 221 }
Osamu Nakamura 0:7d720671e6dc 222 }
Osamu Nakamura 0:7d720671e6dc 223
Osamu Nakamura 0:7d720671e6dc 224 // mbed-client: createEndpointInstance()
Osamu Nakamura 0:7d720671e6dc 225 M2MSecurity *Endpoint::createEndpointInstance() {
Osamu Nakamura 0:7d720671e6dc 226 // Creates register server object with mbed device server address and other parameters
Osamu Nakamura 0:7d720671e6dc 227 M2MSecurity *server = M2MInterfaceFactory::create_security(M2MSecurity::M2MServer);
Osamu Nakamura 0:7d720671e6dc 228 if (server != NULL) {
Osamu Nakamura 0:7d720671e6dc 229 const String url = this->m_options->getConnectorURL();
Osamu Nakamura 0:7d720671e6dc 230 server->set_resource_value(M2MSecurity::M2MServerUri, url);
Osamu Nakamura 0:7d720671e6dc 231 server->set_resource_value(M2MSecurity::BootstrapServer, false);
Osamu Nakamura 0:7d720671e6dc 232 server->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::Certificate);
Osamu Nakamura 0:7d720671e6dc 233 server->set_resource_value(M2MSecurity::ServerPublicKey,this->m_options->getServerCertificate(),this->m_options->getServerCertificateSize());
Osamu Nakamura 0:7d720671e6dc 234 server->set_resource_value(M2MSecurity::PublicKey,this->m_options->getClientCertificate(),this->m_options->getClientCertificateSize());
Osamu Nakamura 0:7d720671e6dc 235 server->set_resource_value(M2MSecurity::Secretkey,this->m_options->getClientKey(),this->m_options->getClientKeySize());
Osamu Nakamura 0:7d720671e6dc 236 }
Osamu Nakamura 0:7d720671e6dc 237 return server;
Osamu Nakamura 0:7d720671e6dc 238 }
Osamu Nakamura 0:7d720671e6dc 239
Osamu Nakamura 0:7d720671e6dc 240 // mbed-client: Callback from mbed client stack if any error is encountered
Osamu Nakamura 0:7d720671e6dc 241 void Endpoint::error(M2MInterface::Error error) {
Osamu Nakamura 0:7d720671e6dc 242 switch(error){
Osamu Nakamura 0:7d720671e6dc 243 case M2MInterface::AlreadyExists:
Osamu Nakamura 0:7d720671e6dc 244 this->logger()->logging("Connector::Endpoint(ERROR): M2MInterface::AlreadyExists");
Osamu Nakamura 0:7d720671e6dc 245 break;
Osamu Nakamura 0:7d720671e6dc 246 case M2MInterface::BootstrapFailed:
Osamu Nakamura 0:7d720671e6dc 247 this->logger()->logging("Connector::Endpoint(ERROR): M2MInterface::BootstrapFailed");
Osamu Nakamura 0:7d720671e6dc 248 break;
Osamu Nakamura 0:7d720671e6dc 249 case M2MInterface::InvalidParameters:
Osamu Nakamura 0:7d720671e6dc 250 this->logger()->logging("Connector::Endpoint(ERROR): M2MInterface::InvalidParameters");
Osamu Nakamura 0:7d720671e6dc 251 break;
Osamu Nakamura 0:7d720671e6dc 252 case M2MInterface::NotRegistered:
Osamu Nakamura 0:7d720671e6dc 253 this->logger()->logging("Connector::Endpoint(ERROR): M2MInterface::NotRegistered");
Osamu Nakamura 0:7d720671e6dc 254 break;
Osamu Nakamura 0:7d720671e6dc 255 case M2MInterface::Timeout:
Osamu Nakamura 0:7d720671e6dc 256 this->logger()->logging("Connector::Endpoint(ERROR): M2MInterface::Timeout");
Osamu Nakamura 0:7d720671e6dc 257 break;
Osamu Nakamura 0:7d720671e6dc 258 case M2MInterface::NetworkError:
Osamu Nakamura 0:7d720671e6dc 259 this->logger()->logging("Connector::Endpoint(ERROR): M2MInterface::NetworkError");
Osamu Nakamura 0:7d720671e6dc 260 break;
Osamu Nakamura 0:7d720671e6dc 261 case M2MInterface::ResponseParseFailed:
Osamu Nakamura 0:7d720671e6dc 262 this->logger()->logging("Connector::Endpoint(ERROR): M2MInterface::ResponseParseFailed");
Osamu Nakamura 0:7d720671e6dc 263 break;
Osamu Nakamura 0:7d720671e6dc 264 case M2MInterface::UnknownError:
Osamu Nakamura 0:7d720671e6dc 265 this->logger()->logging("Connector::Endpoint(ERROR): M2MInterface::UnknownError");
Osamu Nakamura 0:7d720671e6dc 266 break;
Osamu Nakamura 0:7d720671e6dc 267 case M2MInterface::MemoryFail:
Osamu Nakamura 0:7d720671e6dc 268 this->logger()->logging("Connector::Endpoint(ERROR): M2MInterface::MemoryFail");
Osamu Nakamura 0:7d720671e6dc 269 break;
Osamu Nakamura 0:7d720671e6dc 270 case M2MInterface::NotAllowed:
Osamu Nakamura 0:7d720671e6dc 271 this->logger()->logging("Connector::Endpoint(ERROR): M2MInterface::NotAllowed");
Osamu Nakamura 0:7d720671e6dc 272 break;
Osamu Nakamura 0:7d720671e6dc 273 default:
Osamu Nakamura 0:7d720671e6dc 274 break;
Osamu Nakamura 0:7d720671e6dc 275 }
Osamu Nakamura 0:7d720671e6dc 276 }
Osamu Nakamura 0:7d720671e6dc 277
Osamu Nakamura 0:7d720671e6dc 278 // register the endpoint
Osamu Nakamura 0:7d720671e6dc 279 void Endpoint::register_endpoint(M2MSecurity *endpoint_security, M2MObjectList endpoint_objects) {
Osamu Nakamura 0:7d720671e6dc 280 if (this->m_endpoint_interface != NULL && endpoint_security != NULL && endpoint_objects.size() > 0) {
Osamu Nakamura 0:7d720671e6dc 281 // register endpoint
Osamu Nakamura 0:7d720671e6dc 282 this->logger()->logging("Connector::Endpoint: registering endpoint...");
Osamu Nakamura 0:7d720671e6dc 283 this->m_endpoint_interface->register_object(endpoint_security, endpoint_objects);
Osamu Nakamura 0:7d720671e6dc 284 }
Osamu Nakamura 0:7d720671e6dc 285 }
Osamu Nakamura 0:7d720671e6dc 286
Osamu Nakamura 0:7d720671e6dc 287 // re-register the endpoint
Osamu Nakamura 0:7d720671e6dc 288 void Endpoint::re_register_endpoint() {
Osamu Nakamura 0:7d720671e6dc 289 if (this->m_endpoint_interface != NULL) {
Osamu Nakamura 0:7d720671e6dc 290 this->m_endpoint_interface->update_registration(this->m_endpoint_security,this->m_options->getLifetime());
Osamu Nakamura 0:7d720671e6dc 291 }
Osamu Nakamura 0:7d720671e6dc 292 }
Osamu Nakamura 0:7d720671e6dc 293
Osamu Nakamura 0:7d720671e6dc 294 // de-register endpoint
Osamu Nakamura 0:7d720671e6dc 295 void Endpoint::de_register_endpoint(void) {
Osamu Nakamura 0:7d720671e6dc 296 if (this->m_endpoint_interface != NULL) {
Osamu Nakamura 0:7d720671e6dc 297 // de-register endpoint
Osamu Nakamura 0:7d720671e6dc 298 this->logger()->logging("Connector::Endpoint: de-registering endpoint...");
Osamu Nakamura 0:7d720671e6dc 299 this->m_endpoint_interface->unregister_object(NULL);
Osamu Nakamura 0:7d720671e6dc 300 if (this->m_csi != NULL) {
Osamu Nakamura 0:7d720671e6dc 301 this->m_csi->begin_object_unregistering((void *)this);
Osamu Nakamura 0:7d720671e6dc 302 }
Osamu Nakamura 0:7d720671e6dc 303 }
Osamu Nakamura 0:7d720671e6dc 304 }
Osamu Nakamura 0:7d720671e6dc 305
Osamu Nakamura 0:7d720671e6dc 306 // object registered
Osamu Nakamura 0:7d720671e6dc 307 void Endpoint::object_registered(M2MSecurity *security, const M2MServer &server) {
Osamu Nakamura 0:7d720671e6dc 308 this->logger()->logging("Connector::Endpoint: endpoint registered.");
Osamu Nakamura 0:7d720671e6dc 309 this->m_connected = true;
Osamu Nakamura 0:7d720671e6dc 310 this->m_registered = true;
Osamu Nakamura 0:7d720671e6dc 311 if (this->m_csi != NULL) {
Osamu Nakamura 0:7d720671e6dc 312 this->m_csi->object_registered((void *)this,(void *)security,(void *)&server);
Osamu Nakamura 0:7d720671e6dc 313 }
Osamu Nakamura 0:7d720671e6dc 314 }
Osamu Nakamura 0:7d720671e6dc 315
Osamu Nakamura 0:7d720671e6dc 316 // registration updated
Osamu Nakamura 0:7d720671e6dc 317 void Endpoint::registration_updated(M2MSecurity *security, const M2MServer &server) {
Osamu Nakamura 0:7d720671e6dc 318 this->logger()->logging("Connector::Endpoint: endpoint re-registered.");
Osamu Nakamura 0:7d720671e6dc 319 this->m_connected = true;
Osamu Nakamura 0:7d720671e6dc 320 this->m_registered = true;
Osamu Nakamura 0:7d720671e6dc 321 if (this->m_csi != NULL) {
Osamu Nakamura 0:7d720671e6dc 322 this->m_csi->registration_updated((void *)this,(void *)security,(void *)&server);
Osamu Nakamura 0:7d720671e6dc 323 }
Osamu Nakamura 0:7d720671e6dc 324 }
Osamu Nakamura 0:7d720671e6dc 325
Osamu Nakamura 0:7d720671e6dc 326 // object unregistered
Osamu Nakamura 0:7d720671e6dc 327 void Endpoint::object_unregistered(M2MSecurity *server) {
Osamu Nakamura 0:7d720671e6dc 328 // DEBUG
Osamu Nakamura 0:7d720671e6dc 329 this->logger()->logging("Connector::Endpoint: endpoint de-registered.");
Osamu Nakamura 0:7d720671e6dc 330
Osamu Nakamura 0:7d720671e6dc 331 // no longer connected/registered
Osamu Nakamura 0:7d720671e6dc 332 this->m_registered = false;
Osamu Nakamura 0:7d720671e6dc 333 this->m_connected = false;
Osamu Nakamura 0:7d720671e6dc 334
Osamu Nakamura 0:7d720671e6dc 335 // stop all observers...
Osamu Nakamura 0:7d720671e6dc 336 this->stopObservations();
Osamu Nakamura 0:7d720671e6dc 337
Osamu Nakamura 0:7d720671e6dc 338 // invoke ConnectionHandler if we have one...
Osamu Nakamura 0:7d720671e6dc 339 if (this->m_csi != NULL) {
Osamu Nakamura 0:7d720671e6dc 340 this->m_csi->object_unregistered((void *)this,(void *)server);
Osamu Nakamura 0:7d720671e6dc 341 }
Osamu Nakamura 0:7d720671e6dc 342
Osamu Nakamura 0:7d720671e6dc 343 // halt the main event loop... we are done.
Osamu Nakamura 0:7d720671e6dc 344 net_shutdown_endpoint();
Osamu Nakamura 0:7d720671e6dc 345 }
Osamu Nakamura 0:7d720671e6dc 346
Osamu Nakamura 0:7d720671e6dc 347 // bootstrap done
Osamu Nakamura 0:7d720671e6dc 348 void Endpoint::bootstrap_done(M2MSecurity *server) {
Osamu Nakamura 0:7d720671e6dc 349 this->logger()->logging("Connector::Endpoint: endpoint bootstrapped.");
Osamu Nakamura 0:7d720671e6dc 350 if (this->m_csi != NULL) {
Osamu Nakamura 0:7d720671e6dc 351 this->m_csi->bootstrapped((void *)this,(void *)server);
Osamu Nakamura 0:7d720671e6dc 352 }
Osamu Nakamura 0:7d720671e6dc 353 }
Osamu Nakamura 0:7d720671e6dc 354
Osamu Nakamura 0:7d720671e6dc 355 // resource value updated
Osamu Nakamura 0:7d720671e6dc 356 void Endpoint::value_updated(M2MBase *base, M2MBase::BaseType type) {
Osamu Nakamura 0:7d720671e6dc 357 // Lookup the resource and invoke process() on it...
Osamu Nakamura 0:7d720671e6dc 358 DynamicResource *target_res = this->lookupDynamicResource(base);
Osamu Nakamura 0:7d720671e6dc 359 if (target_res != NULL) {
Osamu Nakamura 0:7d720671e6dc 360 // DEBUG
Osamu Nakamura 0:7d720671e6dc 361 //this->logger()->logging("Value Updated (Custom Resource)");
Osamu Nakamura 0:7d720671e6dc 362
Osamu Nakamura 0:7d720671e6dc 363 // its a custom resource...
Osamu Nakamura 0:7d720671e6dc 364 target_res->process(base->operation(),type);
Osamu Nakamura 0:7d720671e6dc 365 }
Osamu Nakamura 0:7d720671e6dc 366 else {
Osamu Nakamura 0:7d720671e6dc 367 // DEBUG
Osamu Nakamura 0:7d720671e6dc 368 //this->logger()->logging("Value Updated (Device Manager)");
Osamu Nakamura 0:7d720671e6dc 369
Osamu Nakamura 0:7d720671e6dc 370 // let DeviceManager handle it
Osamu Nakamura 0:7d720671e6dc 371 ((DeviceManager *)this->m_device_manager)->process(base,type);
Osamu Nakamura 0:7d720671e6dc 372 }
Osamu Nakamura 0:7d720671e6dc 373
Osamu Nakamura 0:7d720671e6dc 374 // CSI
Osamu Nakamura 0:7d720671e6dc 375 if (this->m_csi != NULL) {
Osamu Nakamura 0:7d720671e6dc 376 this->m_csi->value_updated((void *)this,(void *)base,(int)type);
Osamu Nakamura 0:7d720671e6dc 377 }
Osamu Nakamura 0:7d720671e6dc 378 }
Osamu Nakamura 0:7d720671e6dc 379
Osamu Nakamura 0:7d720671e6dc 380 // lookup which DynamicResource cooresponds to a given M2MBase instance...
Osamu Nakamura 0:7d720671e6dc 381 DynamicResource *Endpoint::lookupDynamicResource(M2MBase *base) {
Osamu Nakamura 0:7d720671e6dc 382 const DynamicResourcesList *dynamic_resources = this->m_options->getDynamicResourceList();
Osamu Nakamura 0:7d720671e6dc 383 for(int i=0; i<(int)dynamic_resources->size(); ++i) {
Osamu Nakamura 0:7d720671e6dc 384 M2MBase *t = (M2MBase *)dynamic_resources->at(i)->getResource();
Osamu Nakamura 0:7d720671e6dc 385 if (t == base) {
Osamu Nakamura 0:7d720671e6dc 386 return dynamic_resources->at(i);
Osamu Nakamura 0:7d720671e6dc 387 }
Osamu Nakamura 0:7d720671e6dc 388 }
Osamu Nakamura 0:7d720671e6dc 389 return NULL;
Osamu Nakamura 0:7d720671e6dc 390 }
Osamu Nakamura 0:7d720671e6dc 391
Osamu Nakamura 0:7d720671e6dc 392 // build out the endpoint
Osamu Nakamura 0:7d720671e6dc 393 void Endpoint::buildEndpoint()
Osamu Nakamura 0:7d720671e6dc 394 {
Osamu Nakamura 0:7d720671e6dc 395 // initialize as an mbed-client
Osamu Nakamura 0:7d720671e6dc 396 this->createEndpointInterface();
Osamu Nakamura 0:7d720671e6dc 397
Osamu Nakamura 0:7d720671e6dc 398 // Create our server instance
Osamu Nakamura 0:7d720671e6dc 399 this->m_endpoint_security = this->createEndpointInstance();
Osamu Nakamura 0:7d720671e6dc 400
Osamu Nakamura 0:7d720671e6dc 401 // We now have to bind our device resources
Osamu Nakamura 0:7d720671e6dc 402 if (this->m_device_manager != NULL) {
Osamu Nakamura 0:7d720671e6dc 403 // DEBUG
Osamu Nakamura 0:7d720671e6dc 404 this->logger()->logging("Connector::Endpoint::build(): plumbing the device management objects and resources...");
Osamu Nakamura 0:7d720671e6dc 405
Osamu Nakamura 0:7d720671e6dc 406 // bind the device manager
Osamu Nakamura 0:7d720671e6dc 407 ((DeviceManager *)this->m_device_manager)->bind();
Osamu Nakamura 0:7d720671e6dc 408
Osamu Nakamura 0:7d720671e6dc 409 // push back the Device Resources Object
Osamu Nakamura 0:7d720671e6dc 410 if (this->m_options->getDeviceResourcesObject() != NULL) {
Osamu Nakamura 0:7d720671e6dc 411 // DEBUG
Osamu Nakamura 0:7d720671e6dc 412 this->logger()->logging("Connector::Endpoint::build(): plumbing device resources object...");
Osamu Nakamura 0:7d720671e6dc 413
Osamu Nakamura 0:7d720671e6dc 414 // push back the device resources object
Osamu Nakamura 0:7d720671e6dc 415 this->m_endpoint_object_list.push_back((M2MObject *)this->m_options->getDeviceResourcesObject());
Osamu Nakamura 0:7d720671e6dc 416 }
Osamu Nakamura 0:7d720671e6dc 417 else {
Osamu Nakamura 0:7d720671e6dc 418 // unable to plumb device manager
Osamu Nakamura 0:7d720671e6dc 419 this->logger()->logging("Connector::Endpoint::build(): Unable to plumb device resources. Not installing device resource object...");
Osamu Nakamura 0:7d720671e6dc 420 }
Osamu Nakamura 0:7d720671e6dc 421
Osamu Nakamura 0:7d720671e6dc 422 // push back the Firmware Resources Object
Osamu Nakamura 0:7d720671e6dc 423 if (this->m_options->getFirmwareResourcesObject() != NULL) {
Osamu Nakamura 0:7d720671e6dc 424 // DEBUG
Osamu Nakamura 0:7d720671e6dc 425 this->logger()->logging("Connector::Endpoint::build(): plumbing firmware resources object...");
Osamu Nakamura 0:7d720671e6dc 426
Osamu Nakamura 0:7d720671e6dc 427 // push back the firmware resources object
Osamu Nakamura 0:7d720671e6dc 428 this->m_endpoint_object_list.push_back((M2MObject *)this->m_options->getFirmwareResourcesObject());
Osamu Nakamura 0:7d720671e6dc 429 }
Osamu Nakamura 0:7d720671e6dc 430 else {
Osamu Nakamura 0:7d720671e6dc 431 // unable to plumb firmware manager
Osamu Nakamura 0:7d720671e6dc 432 this->logger()->logging("Connector::Endpoint::build(): Unable to plumb firmware resources. Not installing firmware resource object...");
Osamu Nakamura 0:7d720671e6dc 433 }
Osamu Nakamura 0:7d720671e6dc 434 }
Osamu Nakamura 0:7d720671e6dc 435 else {
Osamu Nakamura 0:7d720671e6dc 436 // no device manager installed
Osamu Nakamura 0:7d720671e6dc 437 this->logger()->logging("Connector::Endpoint::build(): No device manager installed.");
Osamu Nakamura 0:7d720671e6dc 438 }
Osamu Nakamura 0:7d720671e6dc 439
Osamu Nakamura 0:7d720671e6dc 440 // Loop through Static Resources and bind each of them...
Osamu Nakamura 0:7d720671e6dc 441 this->logger()->logging("Connector::Endpoint::build(): adding static resources...");
Osamu Nakamura 0:7d720671e6dc 442 const StaticResourcesList *static_resources = this->m_options->getStaticResourceList();
Osamu Nakamura 0:7d720671e6dc 443 for(int i=0; i<(int)static_resources->size(); ++i) {
Osamu Nakamura 0:7d720671e6dc 444 this->logger()->logging("Connector::Endpoint::build(): binding static resource: [%s]...",static_resources->at(i)->getFullName().c_str());
Osamu Nakamura 0:7d720671e6dc 445 static_resources->at(i)->bind(this);
Osamu Nakamura 0:7d720671e6dc 446 }
Osamu Nakamura 0:7d720671e6dc 447
Osamu Nakamura 0:7d720671e6dc 448 // Loop through Dynamic Resources and bind each of them...
Osamu Nakamura 0:7d720671e6dc 449 this->logger()->logging("Connector::Endpoint::build(): adding dynamic resources...");
Osamu Nakamura 0:7d720671e6dc 450 const DynamicResourcesList *dynamic_resources = this->m_options->getDynamicResourceList();
Osamu Nakamura 0:7d720671e6dc 451 for(int i=0; i<(int)dynamic_resources->size(); ++i) {
Osamu Nakamura 0:7d720671e6dc 452 this->logger()->logging("Connector::Endpoint::build(): binding dynamic resource: [%s]...",dynamic_resources->at(i)->getFullName().c_str());
Osamu Nakamura 0:7d720671e6dc 453 dynamic_resources->at(i)->bind(this);
Osamu Nakamura 0:7d720671e6dc 454 }
Osamu Nakamura 0:7d720671e6dc 455
Osamu Nakamura 0:7d720671e6dc 456 // Get the ObjectList from the ObjectInstanceManager...
Osamu Nakamura 0:7d720671e6dc 457 NamedPointerList list = this->getObjectInstanceManager()->getObjectList();
Osamu Nakamura 0:7d720671e6dc 458
Osamu Nakamura 0:7d720671e6dc 459 // DEBUG
Osamu Nakamura 0:7d720671e6dc 460 //this->logger()->logging("Endpoint::build(): All Resources bound. Number of Objects in list: %d",list.size());
Osamu Nakamura 0:7d720671e6dc 461
Osamu Nakamura 0:7d720671e6dc 462 // add all of the object instances we have created...
Osamu Nakamura 0:7d720671e6dc 463 for(int i=0;i<(int)list.size();++i) {
Osamu Nakamura 0:7d720671e6dc 464 // DEBUG
Osamu Nakamura 0:7d720671e6dc 465 //this->logger()->logging("Endpoint::build(): adding Object Instance with ObjID: %s...",list.at(i).name().c_str());
Osamu Nakamura 0:7d720671e6dc 466
Osamu Nakamura 0:7d720671e6dc 467 // push back the object instance...
Osamu Nakamura 0:7d720671e6dc 468 this->m_endpoint_object_list.push_back((M2MObject *)(list.at(i).ptr()));
Osamu Nakamura 0:7d720671e6dc 469 }
Osamu Nakamura 0:7d720671e6dc 470 }
Osamu Nakamura 0:7d720671e6dc 471
Osamu Nakamura 0:7d720671e6dc 472 // stop underlying observation mechanisms
Osamu Nakamura 0:7d720671e6dc 473 void Endpoint::stopObservations() {
Osamu Nakamura 0:7d720671e6dc 474 const DynamicResourcesList *dynamic_resources = this->m_options->getDynamicResourceList();
Osamu Nakamura 0:7d720671e6dc 475 for(int i=0; i<(int)dynamic_resources->size(); ++i) {
Osamu Nakamura 0:7d720671e6dc 476 if (dynamic_resources->at(i)->isObservable() == true) {
Osamu Nakamura 0:7d720671e6dc 477 ResourceObserver *observer = (ResourceObserver *)dynamic_resources->at(i)->getObserver();
Osamu Nakamura 0:7d720671e6dc 478 if (observer != NULL) {
Osamu Nakamura 0:7d720671e6dc 479 this->logger()->logging("Connector::Endpoint::stopObservations(): stopping resource observer for: [%s]...",dynamic_resources->at(i)->getFullName().c_str());
Osamu Nakamura 0:7d720671e6dc 480 observer->halt();
Osamu Nakamura 0:7d720671e6dc 481 }
Osamu Nakamura 0:7d720671e6dc 482 }
Osamu Nakamura 0:7d720671e6dc 483 }
Osamu Nakamura 0:7d720671e6dc 484 }
Osamu Nakamura 0:7d720671e6dc 485
Osamu Nakamura 0:7d720671e6dc 486 // underlying network is connected (SET)
Osamu Nakamura 0:7d720671e6dc 487 void Endpoint::isConnected(bool connected) {
Osamu Nakamura 0:7d720671e6dc 488 this->m_connected = connected;
Osamu Nakamura 0:7d720671e6dc 489 }
Osamu Nakamura 0:7d720671e6dc 490
Osamu Nakamura 0:7d720671e6dc 491 // underlying network is connected (GET)
Osamu Nakamura 0:7d720671e6dc 492 bool Endpoint::isConnected() {
Osamu Nakamura 0:7d720671e6dc 493 return this->m_connected;
Osamu Nakamura 0:7d720671e6dc 494 }
Osamu Nakamura 0:7d720671e6dc 495
Osamu Nakamura 0:7d720671e6dc 496 // Registered with mDC/mDS
Osamu Nakamura 0:7d720671e6dc 497 bool Endpoint::isRegistered() {
Osamu Nakamura 0:7d720671e6dc 498 return this->m_registered;
Osamu Nakamura 0:7d720671e6dc 499 }
Osamu Nakamura 0:7d720671e6dc 500
Osamu Nakamura 0:7d720671e6dc 501 // Set the ConnectionStatusInterface
Osamu Nakamura 0:7d720671e6dc 502 void Endpoint::setConnectionStatusInterfaceImpl(ConnectionStatusInterface *csi) {
Osamu Nakamura 0:7d720671e6dc 503 this->m_csi = csi;
Osamu Nakamura 0:7d720671e6dc 504 }
Osamu Nakamura 0:7d720671e6dc 505
Osamu Nakamura 0:7d720671e6dc 506 // Set our ObjectInstanceManager
Osamu Nakamura 0:7d720671e6dc 507 void Endpoint::setObjectInstanceManager(ObjectInstanceManager *oim) {
Osamu Nakamura 0:7d720671e6dc 508 this->m_oim = oim;
Osamu Nakamura 0:7d720671e6dc 509 }
Osamu Nakamura 0:7d720671e6dc 510
Osamu Nakamura 0:7d720671e6dc 511 // Get our ObjectInstanceManager
Osamu Nakamura 0:7d720671e6dc 512 ObjectInstanceManager *Endpoint::getObjectInstanceManager() {
Osamu Nakamura 0:7d720671e6dc 513 return this->m_oim;
Osamu Nakamura 0:7d720671e6dc 514 }
Osamu Nakamura 0:7d720671e6dc 515
Osamu Nakamura 0:7d720671e6dc 516 // our logger
Osamu Nakamura 0:7d720671e6dc 517 Logger *Endpoint::logger()
Osamu Nakamura 0:7d720671e6dc 518 {
Osamu Nakamura 0:7d720671e6dc 519 return this->m_logger;
Osamu Nakamura 0:7d720671e6dc 520 }
Osamu Nakamura 0:7d720671e6dc 521
Osamu Nakamura 0:7d720671e6dc 522 } // namespace Connector