Michael Koster / mbedConnectorInterface_custom

Fork of mbedConnectorInterface by Doug Anson

Files at this revision

API Documentation at this revision

Comitter:
ansond
Date:
Fri Mar 13 05:46:48 2015 +0000
Parent:
20:abfbaf524192
Child:
22:192b598ba389
Commit message:
added observability support, post() and del() support

Changed in this revision

api/DynamicResource.cpp Show annotated file Show diff for this revision Revisions of this file
api/DynamicResource.h Show annotated file Show diff for this revision Revisions of this file
--- a/api/DynamicResource.cpp	Thu Mar 05 18:23:28 2015 +0000
+++ b/api/DynamicResource.cpp	Fri Mar 13 05:46:48 2015 +0000
@@ -31,6 +31,9 @@
     this->m_res_type = string(res_type);
     this->m_observable = observable;
     this->m_res_mask = res_mask;
+    this->m_obs_number = 0;
+    this->m_obs_token_ptr = NULL;
+    this->m_obs_token_len = 0;
 }
 
 // constructor (input initial value)
@@ -39,6 +42,9 @@
     this->m_res_type = string(res_type);
     this->m_observable = observable;
     this->m_res_mask = res_mask;
+    this->m_obs_number = 0;
+    this->m_obs_token_ptr = NULL;
+    this->m_obs_token_len = 0;
 }
 
 // constructor (strings)
@@ -47,6 +53,9 @@
     this->m_res_type = res_type;
     this->m_observable = observable;
     this->m_res_mask = res_mask;
+    this->m_obs_number = 0;
+    this->m_obs_token_ptr = NULL;
+    this->m_obs_token_len = 0;
 }
 
 // copy constructor
@@ -55,11 +64,15 @@
     this->m_res_type = resource.m_res_type;
     this->m_observable = resource.m_observable;
     this->m_res_mask = resource.m_res_mask;
+    this->m_obs_number = resource.m_obs_number;
+    this->m_obs_token_ptr = resource.m_obs_token_ptr;
+    this->m_obs_token_len = resource.m_obs_token_len;
 }
 
 // destructor
 DynamicResource::~DynamicResource()
 {
+    if(this->m_obs_token_ptr) free(this->m_obs_token_ptr);
 }
 
 // bind resource to NSDL
@@ -110,10 +123,32 @@
             // fill in the CoAP response payload
             coap_res_ptr->payload_len = length;
             coap_res_ptr->payload_ptr = (uint8_t *)value_buffer;
+            
+            // Observation handling... 
+            if(received_coap_ptr->token_ptr) {
+                if(this->m_obs_token_ptr) {
+                    free(this->m_obs_token_ptr);
+                    this->m_obs_token_ptr = NULL;
+                }
+                this->m_obs_token_ptr = (uint8_t*)malloc(received_coap_ptr->token_len);
+                if(this->m_obs_token_ptr) {
+                    memcpy(this->m_obs_token_ptr, received_coap_ptr->token_ptr,received_coap_ptr->token_len);
+                    this->m_obs_token_len = received_coap_ptr->token_len;
+                }
+            }
+            
+            if(received_coap_ptr->options_list_ptr->observe) {
+                coap_res_ptr->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s));
+                memset(coap_res_ptr->options_list_ptr, 0, sizeof(sn_coap_options_list_s));
+                coap_res_ptr->options_list_ptr->observe_ptr = &this->m_obs_number;
+                coap_res_ptr->options_list_ptr->observe_len = 1;
+                this->m_obs_number++;
+            }
 
             // build out the response and send...
-            sn_nsdl_send_coap_message(address, coap_res_ptr);
-        } else {
+            sn_nsdl_send_coap_message(address,coap_res_ptr);
+        } 
+        else {
             this->logger()->log("ERROR: resource(GET) mask is munged (mask: 0x%x)",this->m_res_mask);
         }
     } else if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_PUT) {
@@ -129,14 +164,56 @@
 
                 // build out the response and send...
                 this->logger()->log("resource(PUT) completed for [%s]...",key.c_str());
-                coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CHANGED);
-                sn_nsdl_send_coap_message(address, coap_res_ptr);
+                coap_res_ptr = sn_coap_build_response(received_coap_ptr,COAP_MSG_CODE_RESPONSE_CHANGED);
+                sn_nsdl_send_coap_message(address,coap_res_ptr);
             } else {
                 this->logger()->log("ERROR: resource(PUT) mask is munged (mask: 0x%x)",this->m_res_mask);
             }
         } else {
             this->logger()->log("ERROR: Binder(PUT) payload is NULL...");
         }
+    } else if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_POST) {
+        if(received_coap_ptr->payload_len > 0) {
+            // process the POST if we have registered a callback for it...
+            if ((this->m_res_mask&SN_GRS_POST_ALLOWED) != 0) {
+                // binder interacts only with strings
+                string value = this->coapDataToString(received_coap_ptr->payload_ptr,received_coap_ptr->payload_len);
+
+                // call the resource post() to set the resource value
+                this->logger()->log("Calling resource(POST) with [%s]=[%s]...",key.c_str(),value.c_str());
+                this->post(value);
+
+                // build out the response and send...
+                this->logger()->log("resource(POST) completed for [%s]...",key.c_str());
+                coap_res_ptr = sn_coap_build_response(received_coap_ptr,COAP_MSG_CODE_RESPONSE_CHANGED);
+                sn_nsdl_send_coap_message(address,coap_res_ptr);
+            } else {
+                this->logger()->log("ERROR: resource(POST) mask is munged (mask: 0x%x)",this->m_res_mask);
+            }
+        } else {
+            this->logger()->log("ERROR: Binder(POST) payload is NULL...");
+        }
+    } else if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_DELETE) {
+        if(received_coap_ptr->payload_len > 0) {
+            // process the DELETE if we have registered a callback for it...
+            if ((this->m_res_mask&SN_GRS_DELETE_ALLOWED) != 0) {
+                // binder interacts only with strings
+                string value = this->coapDataToString(received_coap_ptr->payload_ptr,received_coap_ptr->payload_len);
+
+                // call the resource del() to set the resource value
+                this->logger()->log("Calling resource(DELETE) with [%s]=[%s]...",key.c_str(),value.c_str());
+                this->del(value);
+
+                // build out the response and send...
+                this->logger()->log("resource(DELETE) completed for [%s]...",key.c_str());
+                coap_res_ptr = sn_coap_build_response(received_coap_ptr,COAP_MSG_CODE_RESPONSE_CHANGED);
+                sn_nsdl_send_coap_message(address,coap_res_ptr);
+            } else {
+                this->logger()->log("ERROR: resource(DELETE) mask is munged (mask: 0x%x)",this->m_res_mask);
+            }
+        } else {
+            this->logger()->log("ERROR: Binder(DELETE) payload is NULL...");
+        }
     }
 
     sn_coap_parser_release_allocated_coap_msg_mem(coap_res_ptr);
@@ -144,6 +221,20 @@
     return 0;
 }
 
+// send the notification
+int DynamicResource::notify(const string data) {
+    return this->notify((uint8_t *)data.c_str(),(int)data.length());
+}
+
+// send the notification
+int DynamicResource::notify(uint8_t *data,int data_length) {
+    int status = sn_nsdl_send_observation_notification(this->m_obs_token_ptr,this->m_obs_token_len,data,data_length, &this->m_obs_number, 1,COAP_MSG_TYPE_NON_CONFIRMABLE,0);
+    if (status == 0) {
+        this->logger()->log("ERROR: resource(NOTIFY) send failed...");
+    }
+    return status;
+}
+
 // default PUT (does nothing)
 void DynamicResource::put(const string value)
 {
@@ -151,6 +242,20 @@
     ;
 }
 
+// default POST (does nothing)
+void DynamicResource::post(const string value)
+{
+    // not used by default
+    ;
+}
+
+// default DELETE (does nothing)
+void DynamicResource::del(const string value)
+{
+    // not used by default
+    ;
+}
+
 // convenience method to get the URI from its buffer field...
 string DynamicResource::coapDataToString(uint8_t *coap_data_ptr,int coap_data_ptr_length)
 {
--- a/api/DynamicResource.h	Thu Mar 05 18:23:28 2015 +0000
+++ b/api/DynamicResource.h	Fri Mar 13 05:46:48 2015 +0000
@@ -99,18 +99,41 @@
     virtual string get() = 0;
 
     /**
-    Resource value setter (OPTIONAL: defaulted noop if not derived. Binders MAY implement PUT if needed)
+    Resource value setter (PUT) (OPTIONAL: defaulted noop if not derived. Binders MAY implement PUT if needed)
     @param string value of the resource
     */
     virtual void put(const string value);
-
+    
+    /**
+    Resource value setter (POST) (OPTIONAL: defaulted noop if not derived. Binders MAY implement POST if needed)
+    @param string value of the resource
+    */
+    virtual void post(const string value);
+    
+    /**
+    Resource value deleter (OPTIONAL: defaulted noop if not derived. Binders MAY implement DELETE if needed)
+    @param string value of the resource
+    */
+    virtual void del(const string value);
+    
+    /**
+    Send notification of new data
+    @param data input the new data to update
+    @returns 1 - success, 0 - failure
+    */
+    int notify(const string data);
+    
 protected:
+    int notify(uint8_t *data,int data_length);
 
 private:
 
     string      m_res_type;
     uint8_t     m_res_mask;
     bool        m_observable;
+    uint8_t     m_obs_number;
+    uint8_t    *m_obs_token_ptr;
+    uint8_t     m_obs_token_len;
 
     // convenience method to create a string from the NSDL CoAP data buffers...
     string coapDataToString(uint8_t *coap_data_ptr,int coap_data_ptr_length);