1 //******************************************************************
3 // Copyright 2014 Intel Mobile Communications GmbH All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
25 #include "ocstackconfig.h"
31 //-----------------------------------------------------------------------------
33 //-----------------------------------------------------------------------------
35 //TODO: May want to refactor this in upcoming sprints.
36 //Don't want to expose to application layer that lower level stack is using CoAP.
38 #define OC_WELL_KNOWN_QUERY "224.0.1.187:5683/oc/core"
39 #define OC_EXPLICIT_DEVICE_DISCOVERY_URI "224.0.1.187:5683/oc/core/d?rt=core.led"
40 #define OC_MULTICAST_PREFIX "224.0.1.187:5683"
41 #define OC_MULTICAST_IP "224.0.1.187"
44 #define OC_DEFAULT_PRESENCE_TTL (60)
45 #define OC_PRESENCE_URI "/oc/presence"
48 //-----------------------------------------------------------------------------
50 //-----------------------------------------------------------------------------
52 /** This would need to be modified for specific platforms and specific
55 #define DEV_ADDR_SIZE_MAX (16)
58 * Data structure to encapsulate IPv4/IPv6/Contiki/lwIP device addresses
61 typedef struct OCDevAddr
63 uint32_t size; /**< length of the address stored in addr field. */
64 uint8_t addr[DEV_ADDR_SIZE_MAX]; /**< device address. */
68 * OC Virtual resources supported by every OC device
72 OC_WELL_KNOWN_URI= 0, // "/oc/core"
73 OC_DEVICE_URI, // "/oc/core/d"
74 OC_RESOURCE_TYPES_URI, // "/oc/core/d/type"
76 OC_PRESENCE, // "/oc/presence"
78 OC_MAX_VIRTUAL_RESOURCES // Max items in the list
82 * Standard RESTful HTTP Methods
87 OC_REST_GET = (1 << 0), // Read
88 OC_REST_PUT = (1 << 1), // Write
89 OC_REST_POST = (1 << 2), // Update
90 OC_REST_DELETE = (1 << 3), // Delete
91 // Register observe request for most up date notifications ONLY.
92 OC_REST_OBSERVE = (1 << 4),
93 // Register observe request for all notifications, including stale notifications.
94 OC_REST_OBSERVE_ALL = (1 << 5),
95 // Deregister observation, intended for internal use
96 OC_REST_CANCEL_OBSERVE = (1 << 6),
98 // Subscribe for all presence notifications of a particular resource.
99 OC_REST_PRESENCE = (1 << 7)
104 * Host Mode of Operation
121 OC_NA_QOS // No Quality is defined, let the stack decide
122 } OCQualityOfService;
125 * Resource Properties
127 * OC_ACTIVE - When this bit is set, the resource is initialized, otherwise the resource
128 * is 'inactive'. 'inactive' signifies that the resource has been marked for
129 * deletion or is already deleted.
130 * OC_DISCOVERABLE - When this bit is set, the resource is allowed to be discovered by clients.
131 * OC_OBSERVABLE - When this bit is set, the resource is allowed to be observed by clients.
132 * OC_SLOW - When this bit is set, the resource has been marked as 'slow'. 'slow' signifies
133 * that responses from this resource can expect delays in processing its
134 * requests from clients.
135 * OC_SECURE - When this bit is set, the resource is a secure resource.
139 OC_ACTIVE = (1 << 0),
140 OC_DISCOVERABLE = (1 << 1),
141 OC_OBSERVABLE = (1 << 2),
144 } OCResourceProperty;
147 * Transport Protocol IDs
151 OC_INVALID_ID = (1 << 0),
152 OC_COAP_ID = (1 << 1)
153 } OCTransportProtocolID;
164 OC_ALL //Multicast message: send over all the interfaces.
165 } OCConnectivityType;
168 * Declares Stack Results & Errors
172 /* Success status code - START HERE */
174 OC_STACK_RESOURCE_CREATED,
175 OC_STACK_RESOURCE_DELETED,
177 /* Success status code - END HERE */
178 /* Error status code - START HERE */
179 OC_STACK_INVALID_URI = 20,
180 OC_STACK_INVALID_QUERY,
182 OC_STACK_INVALID_PORT,
183 OC_STACK_INVALID_CALLBACK,
184 OC_STACK_INVALID_METHOD,
185 OC_STACK_INVALID_PARAM,
186 OC_STACK_INVALID_OBSERVE_PARAM,
190 OC_STACK_ADAPTER_NOT_ENABLED,
192 OC_STACK_NO_RESOURCE, /* resource not found */
193 OC_STACK_RESOURCE_ERROR, /* ex: not supported method or interface */
194 OC_STACK_SLOW_RESOURCE,
195 OC_STACK_NO_OBSERVERS, /* resource has no registered observers */
196 OC_STACK_OBSERVER_NOT_FOUND,
197 OC_STACK_VIRTUAL_DO_NOT_HANDLE,
198 OC_STACK_INVALID_OPTION,
199 OC_STACK_MALFORMED_RESPONSE, /* the remote reply contained malformed data */
200 OC_STACK_PERSISTENT_BUFFER_REQUIRED,
201 OC_STACK_INVALID_REQUEST_HANDLE,
202 OC_STACK_INVALID_DEVICE_INFO,
203 OC_STACK_INVALID_JSON,
204 /* NOTE: Insert all new error codes here!*/
206 OC_STACK_PRESENCE_STOPPED = 128,
207 OC_STACK_PRESENCE_TIMEOUT,
208 OC_STACK_PRESENCE_DO_NOT_HANDLE,
211 /* Error status code - END HERE */
215 * Handle to an @ref OCDoResource invocation.
217 typedef void * OCDoHandle;
220 * Handle to an OCResource object owned by the OCStack.
222 typedef void * OCResourceHandle;
224 typedef void * OCRequestHandle;
225 typedef void * OCResponseHandle;
228 * Unique identifier for each observation request. Used when observations are
229 * registered or deregistering. Used by entity handler to signal specific
230 * observers to be notified of resource changes.
231 * There can be maximum of 256 observations per server.
233 typedef uint8_t OCObservationId;
236 * Action associated with observation
240 OC_OBSERVE_REGISTER = 0,
241 OC_OBSERVE_DEREGISTER = 1,
242 OC_OBSERVE_NO_OPTION = 2
247 // Action associated with observation request
248 OCObserveAction action;
249 // Identifier for observation being registered/deregistered
250 OCObservationId obsId;
254 * Possible returned values from entity handler
260 OC_EH_RESOURCE_CREATED,
261 OC_EH_RESOURCE_DELETED,
264 } OCEntityHandlerResult;
266 // following structure will be used to define the vendor specific header options to be included
267 // in communication packets
269 typedef struct OCHeaderOption
271 // The protocol ID this option applies to
272 OCTransportProtocolID protocolID;
273 // The header option ID which will be added to communication packets
276 uint16_t optionLength;
277 // pointer to its data
278 uint8_t optionData[MAX_HEADER_OPTION_DATA_LENGTH];
282 * Incoming requests handled by the server. Requests are passed in as a parameter to the
283 * @ref OCEntityHandler callback API.
284 * @brief The @ref OCEntityHandler callback API must be implemented in the application in order
285 * to receive these requests.
289 // Associated resource
290 OCResourceHandle resource;
291 OCRequestHandle requestHandle;
292 // the REST method retrieved from received request PDU
294 // resource query send by client
296 // Information associated with observation - valid only when OCEntityHandler
297 // flag includes OC_OBSERVE_FLAG
298 OCObservationInfo obsInfo;
299 // An array of the received vendor specific header options
300 uint8_t numRcvdVendorSpecificHeaderOptions;
301 OCHeaderOption * rcvdVendorSpecificHeaderOptions;
302 // reqJSON is retrieved from the payload of the received request PDU
303 char * reqJSONPayload;
304 } OCEntityHandlerRequest;
307 * Response from queries to remote servers. Queries are made by calling the @ref OCDoResource API.
311 // Address of remote server
313 // Indicates adaptor type on which the response was received
314 OCConnectivityType connType;
315 // the is the result of our stack, OCStackResult should contain coap/other error codes;
316 OCStackResult result;
317 // If associated with observe, this will represent the sequence of notifications from server.
318 uint32_t sequenceNumber;
319 // resJSONPayload is retrieved from the payload of the received request PDU
320 const char * resJSONPayload;
321 // An array of the received vendor specific header options
322 uint8_t numRcvdVendorSpecificHeaderOptions;
323 OCHeaderOption rcvdVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
327 * Following structure describes the device properties. All non-Null properties will be included
328 * in a device discovery request.
337 char *manufacturerName;
338 char *manufacturerUrl;
340 char *dateOfManufacture;
341 char *platformVersion;
342 char *firmwareVersion;
348 // Request handle is passed to server via the entity handler for each incoming request.
349 // Stack assigns when request is received, server sets to indicate what request response is for
350 OCRequestHandle requestHandle;
351 // New handle for tracking block (or slow) response. Stack assigns, server uses for subsequent calls
352 OCResponseHandle *responseHandle;
354 OCResourceHandle resourceHandle;
355 // Allow the entity handler to pass a result with the response
356 OCEntityHandlerResult ehResult;
357 // this is the pointer to server payload data to be transferred
359 // size of server payload data. I don't think we should rely on null terminated data for size
360 uint16_t payloadSize;
361 // An array of the vendor specific header options the entity handler wishes to use in response
362 uint8_t numSendVendorSpecificHeaderOptions;
363 OCHeaderOption sendVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
364 // URI of new resource that entity handler might create
365 char resourceUri[MAX_URI_LENGTH];
366 // Server sets to true for persistent response buffer, false for non-persistent response buffer
367 uint8_t persistentBufferFlag;
368 } OCEntityHandlerResponse;
372 OC_INIT_FLAG = (1 << 0),
373 OC_REQUEST_FLAG = (1 << 1),
374 OC_OBSERVE_FLAG = (1 << 2)
375 } OCEntityHandlerFlag; //entity_handler_flag_t ;
377 // possible returned values from client application
380 OC_STACK_DELETE_TRANSACTION = 0,
381 OC_STACK_KEEP_TRANSACTION
382 } OCStackApplicationResult;
384 //-----------------------------------------------------------------------------
385 // Callback function definitions
386 //-----------------------------------------------------------------------------
389 * Client applications implement this callback to consume responses received from Servers.
391 typedef OCStackApplicationResult (* OCClientResponseHandler)(void *context, OCDoHandle handle,
392 OCClientResponse * clientResponse);
395 * Client applications using a context pointer implement this callback to delete the
396 * context upon removal of the callback/context pointer from the internal callback-list
398 typedef void (* OCClientContextDeleter)(void *context);
401 * This info is passed from application to OC Stack when initiating a request to Server
406 OCClientResponseHandler cb;
407 OCClientContextDeleter cd;
411 * Application server implementations must implement this callback to consume requests OTA.
412 * Entity handler callback needs to fill the resPayload of the entityHandlerRequest.
414 typedef OCEntityHandlerResult (*OCEntityHandler)
415 (OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest);
418 * Device Entity handler need to use this call back instead of OCEntityHandler
420 typedef OCEntityHandlerResult (*OCDeviceEntityHandler)
421 (OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest, char* uri);
423 //-----------------------------------------------------------------------------
424 // Function prototypes
425 //-----------------------------------------------------------------------------
428 * Initialize the OC Stack. Must be called prior to starting the stack.
431 * IP Address of host device
433 * Port of host device
435 * Host device is client, server, or client-server
438 * OC_STACK_OK - no errors
439 * OC_STACK_ERROR - stack init error
441 OCStackResult OCInit(const char *ipAddr, uint16_t port, OCMode mode);
444 * Stop the OC stack. Use for a controlled shutdown.
446 * Note: OCStop() performs operations similar to OCStopPresence(), as well as OCDeleteResource() on
447 * all resources this server is hosting. OCDeleteResource() performs operations similar to
448 * OCNotifyAllObservers() to notify all client observers that the respective resource is being
452 * OC_STACK_OK - no errors
453 * OC_STACK_ERROR - stack not initialized
455 OCStackResult OCStop();
458 * Called in main loop of OC client or server. Allows low-level processing of
462 * OC_STACK_OK - no errors
463 * OC_STACK_ERROR - stack process error
465 OCStackResult OCProcess();
468 * Discover or Perform requests on a specified resource (specified by that Resource's respective
471 * @param handle - @ref OCDoHandle to refer to the request sent out on behalf of
472 * calling this API. This handle can be used to cancel this operation
473 * via the OCCancel API.
474 * Note: This reference is handled internally, and
475 * should not be free'd by the consumer. A NULL handle is permitted
476 * in the event where the caller has no use for the return value.
477 * @param method - @ref OCMethod to perform on the resource
478 * @param requiredUri - URI of the resource to interact with
479 * @param referenceUri - URI of the reference resource
480 * @param request - JSON encoded request
481 * @param conType - @ref OCConnectivityType type of connectivity indicating the
482 * interface. Example: OC_WIFI, OC_ETHERNET, OC_ALL
483 * @param qos - quality of service. Note that if this API is called on a uri with
484 * the well-known multicast IP address, the qos will be forced to
486 * since it is impractical to send other QOS levels on such addresses.
487 * @param cbData - asynchronous callback function that is invoked
488 * by the stack when discovery or resource interaction is complete
489 * @param options - The address of an array containing the vendor specific
490 * header options to be sent with the request
491 * @param numOptions - Number of header options to be included
493 * Note: Presence subscription amendments (ie. adding additional resource type filters by calling
494 * this API again) require the use of the same base URI as the original request to successfully
495 * amend the presence filters.
498 * OC_STACK_OK - no errors
499 * OC_STACK_INVALID_CALLBACK - invalid callback function pointer
500 * OC_STACK_INVALID_METHOD - invalid resource method
501 * OC_STACK_INVALID_URI - invalid required or reference URI
502 * OC_STACK_INVALID_QUERY - number of resource types specified for filtering presence
503 * notifications exceeds @ref MAX_PRESENCE_FILTERS.
505 OCStackResult OCDoResource(OCDoHandle *handle, OCMethod method, const char *requiredUri,
506 const char *referenceUri, const char *request, OCConnectivityType conType,
507 OCQualityOfService qos, OCCallbackData *cbData,
508 OCHeaderOption * options, uint8_t numOptions);
511 * Cancel a request associated with a specific @ref OCDoResource invocation.
513 * @param handle - Used to identify a specific OCDoResource invocation.
514 * @param qos - used to specify Quality of Service (read below for more info)
515 * @param options- used to specify vendor specific header options when sending
516 * explicit observe cancellation
517 * @param numOptions- Number of header options to be included
520 * OC_STACK_OK - No errors; Success
521 * OC_STACK_INVALID_PARAM - The handle provided is invalid.
523 OCStackResult OCCancel(OCDoHandle handle, OCQualityOfService qos, OCHeaderOption * options,
528 * When operating in @ref OCServer or @ref OCClientServer mode, this API will start sending out
529 * presence notifications to clients via multicast. Once this API has been called with a success,
530 * clients may query for this server's presence and this server's stack will respond via multicast.
532 * Server can call this function when it comes online for the first time, or when it comes back
533 * online from offline mode, or when it re enters network.
535 * @param ttl - Time To Live in seconds
536 * Note: If ttl is '0', then the default stack value will be used (60 Seconds).
539 * OC_STACK_OK - No errors; Success
541 OCStackResult OCStartPresence(const uint32_t ttl);
544 * When operating in @ref OCServer or @ref OCClientServer mode, this API will stop sending out
545 * presence notifications to clients via multicast. Once this API has been called with a success,
546 * this server's stack will not respond to clients querying for this server's presence.
548 * Server can call this function when it is terminating, going offline, or when going
552 * OC_STACK_OK - No errors; Success
555 OCStackResult OCStopPresence();
560 * Set default device entity handler
562 * @param entityHandler - entity handler function that is called by ocstack to handle requests for
563 * any undefined resources or default actions.
564 * if NULL is passed it removes the device default entity handler.
567 * OC_STACK_OK - no errors
568 * OC_STACK_ERROR - stack process error
570 OCStackResult OCSetDefaultDeviceEntityHandler(OCDeviceEntityHandler entityHandler);
573 * Set device information.
575 * @param deviceInfo - Structure passed by the server application containing
576 * the device information.
580 * OC_STACK_OK - no errors
581 * OC_STACK_INVALID_PARAM - invalid paramerter
582 * OC_STACK_ERROR - stack process error
584 OCStackResult OCSetDeviceInfo(OCDeviceInfo deviceInfo);
589 * @param handle - pointer to handle to newly created resource. Set by ocstack. Used to refer to resource
590 * @param resourceTypeName - name of resource type. Example: "core.led"
591 * @param resourceInterfaceName - name of resource interface. Example: "core.rw"
592 * @param uri - URI of the resource. Example: "/a/led"
593 * @param entityHandler - entity handler function that is called by ocstack to handle requests, etc
594 * NULL for default entity handler
595 * @param resourceProperties - properties supported by resource. Example: OC_DISCOVERABLE|OC_OBSERVABLE
598 * OC_STACK_OK - no errors
599 * OC_STACK_ERROR - stack process error
601 OCStackResult OCCreateResource(OCResourceHandle *handle,
602 const char *resourceTypeName,
603 const char *resourceInterfaceName,
605 OCEntityHandler entityHandler,
606 uint8_t resourceProperties);
609 * Create a resource. with host ip address for remote resource
611 * @param handle - pointer to handle to newly created resource. Set by ocstack.
612 * Used to refer to resource
613 * @param resourceTypeName - name of resource type. Example: "core.led"
614 * @param resourceInterfaceName - name of resource interface. Example: "core.rw"
615 * @param host - HOST address of the remote resource. Example: "coap://xxx.xxx.xxx.xxx:xxxxx"
616 * @param uri - URI of the resource. Example: "/a/led"
617 * @param entityHandler - entity handler function that is called by ocstack to handle requests, etc
618 * NULL for default entity handler
619 * @param resourceProperties - properties supported by resource.
620 * Example: OC_DISCOVERABLE|OC_OBSERVABLE
623 * OC_STACK_OK - no errors
624 * OC_STACK_ERROR - stack process error
626 OCStackResult OCCreateResourceWithHost(OCResourceHandle *handle,
627 const char *resourceTypeName,
628 const char *resourceInterfaceName,
631 OCEntityHandler entityHandler,
632 uint8_t resourceProperties);
635 * Add a resource to a collection resource.
637 * @param collectionHandle - handle to the collection resource
638 * @param resourceHandle - handle to resource to be added to the collection resource
641 * OC_STACK_OK - no errors
642 * OC_STACK_ERROR - stack process error
643 * OC_STACK_INVALID_PARAM - invalid collectionhandle
645 OCStackResult OCBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
648 * Remove a resource from a collection resource.
650 * @param collectionHandle - handle to the collection resource
651 * @param resourceHandle - handle to resource to be removed from the collection resource
654 * OC_STACK_OK - no errors
655 * OC_STACK_ERROR - stack process error
656 * OC_STACK_INVALID_PARAM - invalid collectionhandle
658 OCStackResult OCUnBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
661 * Bind a resourcetype to a resource.
663 * @param handle - handle to the resource
664 * @param resourceTypeName - name of resource type. Example: "core.led"
667 * OC_STACK_OK - no errors
668 * OC_STACK_ERROR - stack process error
670 OCStackResult OCBindResourceTypeToResource(OCResourceHandle handle,
671 const char *resourceTypeName);
673 * Bind a resource interface to a resource.
675 * @param handle - handle to the resource
676 * @param resourceInterfaceName - name of resource interface. Example: "core.rw"
679 * OC_STACK_OK - no errors
680 * OC_STACK_ERROR - stack process error
682 OCStackResult OCBindResourceInterfaceToResource(OCResourceHandle handle,
683 const char *resourceInterfaceName);
686 * Bind an entity handler to the resource.
688 * @param handle - handle to the resource that the contained resource is to be bound
689 * @param entityHandler - entity handler function that is called by ocstack to handle requests, etc
691 * OC_STACK_OK - no errors
692 * OC_STACK_ERROR - stack process error
694 OCStackResult OCBindResourceHandler(OCResourceHandle handle, OCEntityHandler entityHandler);
697 * Get the number of resources that have been created in the stack.
699 * @param numResources - pointer to count variable
702 * OC_STACK_OK - no errors
703 * OC_STACK_ERROR - stack process error
706 OCStackResult OCGetNumberOfResources(uint8_t *numResources);
709 * Get a resource handle by index.
711 * @param index - index of resource, 0 to Count - 1
714 * Resource handle - if found
715 * NULL - if not found
717 OCResourceHandle OCGetResourceHandle(uint8_t index);
720 * Delete resource specified by handle. Deletes resource and all resourcetype and resourceinterface
723 * Note: OCDeleteResource() performs operations similar to OCNotifyAllObservers() to notify all
724 * client observers that "this" resource is being deleted.
726 * @param handle - handle of resource to be deleted
729 * OC_STACK_OK - no errors
730 * OC_STACK_ERROR - stack process error
732 OCStackResult OCDeleteResource(OCResourceHandle handle);
735 * Get the URI of the resource specified by handle.
737 * @param handle - handle of resource
739 * URI string - if resource found
740 * NULL - resource not found
742 const char *OCGetResourceUri(OCResourceHandle handle);
745 * Get the properties of the resource specified by handle.
746 * NOTE: that after a resource is created, the OC_ACTIVE property is set
747 * for the resource by the stack.
749 * @param handle - handle of resource
751 * OCResourceProperty Bitmask
752 * -1 if resource is not found
754 OCResourceProperty OCGetResourceProperties(OCResourceHandle handle);
757 * Get the number of resource types of the resource.
759 * @param handle - handle of resource
760 * @param numResourceTypes - pointer to count variable
763 * OC_STACK_OK - no errors
764 * OC_STACK_ERROR - stack process error
766 OCStackResult OCGetNumberOfResourceTypes(OCResourceHandle handle, uint8_t *numResourceTypes);
769 * Get name of resource type of the resource.
771 * @param handle - handle of resource
772 * @param index - index of resource, 0 to Count - 1
775 * resource type name - if resource found
776 * NULL - resource not found
778 const char *OCGetResourceTypeName(OCResourceHandle handle, uint8_t index);
781 * Get the number of resource interfaces of the resource.
783 * @param handle - handle of resource
784 * @param numResourceInterfaces - pointer to count variable
787 * OC_STACK_OK - no errors
788 * OC_STACK_ERROR - stack process error
791 OCStackResult OCGetNumberOfResourceInterfaces(OCResourceHandle handle,
792 uint8_t *numResourceInterfaces);
795 * Get name of resource interface of the resource.
797 * @param handle - handle of resource
798 * @param index - index of resource, 0 to Count - 1
801 * resource interface name - if resource found
802 * NULL - resource not found
804 const char *OCGetResourceInterfaceName(OCResourceHandle handle, uint8_t index);
807 * Get methods of resource interface of the resource.
809 * @param handle - handle of resource
810 * @param index - index of resource, 0 to Count - 1
813 * allowed methods - if resource found
814 * NULL - resource not found
816 uint8_t OCGetResourceInterfaceAllowedMethods(OCResourceHandle handle, uint8_t index);
819 * Get resource handle from the collection resource by index.
821 * @param collectionHandle - handle of collection resource
822 * @param index - index of contained resource, 0 to Count - 1
825 * handle to contained resource - if resource found
826 * NULL - resource not found
828 OCResourceHandle OCGetResourceHandleFromCollection(OCResourceHandle collectionHandle,
832 * Get the entity handler for a resource.
834 * @param handle - handle of resource
837 * entity handler - if resource found
838 * NULL - resource not found
840 OCEntityHandler OCGetResourceHandler(OCResourceHandle handle);
843 * Notify all registered observers that the resource representation has
844 * changed. If observation includes a query the client is notified only
845 * if the query is valid after the resource representation has changed.
847 * @param handle - handle of resource
848 * @param qos - desired quality of service for the observation notifications
851 * OC_STACK_OK - no errors
852 * OC_STACK_NO_RESOURCE - invalid resource handle
853 * OC_STACK_NO_OBSERVERS - no more observers intrested in resource
855 OCStackResult OCNotifyAllObservers(OCResourceHandle handle, OCQualityOfService qos);
858 * Notify specific observers with updated value of representation.
859 * Before this API is invoked by entity handler it has finished processing
860 * queries for the associated observers.
862 * @param handle - handle of resource
863 * @param obsIdList - list of observation ids that need to be notified
864 * @param numberOfIds - number of observation ids included in obsIdList
865 * @param notificationJSONPayload - JSON encoded payload to send in notification
866 * @param qos - desired quality of service of the observation notifications
867 * NOTE: The memory for obsIdList and notificationJSONPayload is managed by the
868 * entity invoking the API. The maximum size of the notification is 1015 bytes
869 * for non-Arduino platforms. For Arduino the maximum size is 247 bytes.
872 * OC_STACK_OK - no errors
873 * OC_STACK_NO_RESOURCE - invalid resource handle
876 OCNotifyListOfObservers (OCResourceHandle handle,
877 OCObservationId *obsIdList,
879 const char *notificationJSONPayload,
880 OCQualityOfService qos);
884 * Send a response to a request.
885 * The response can be a normal, slow, or block (i.e. a response that
886 * is too large to be sent in a single PDU and must span multiple transmissions)
888 * @param response - pointer to structure that contains response parameters
891 * OC_STACK_OK - no errors
893 OCStackResult OCDoResponse(OCEntityHandlerResponse *response);
896 * Cancel a response. Applies to a block response
898 * @param responseHandle - response handle set by stack in OCServerResponse after
899 * OCDoResponse is called
902 * OC_STACK_OK - No errors; Success
903 * OC_STACK_INVALID_PARAM - The handle provided is invalid.
905 OCStackResult OCCancelResponse(OCResponseHandle responseHandle);
909 //-- OCDevAddrToIPv4Addr -------------------------------------------------
911 * This method is used to retrieved the IPv4 address from OCDev address
916 * @param[out] a first byte of IPv4 address.
917 * @param[out] b second byte of IPv4 address.
918 * @param[out] c third byte of IPv4 address.
919 * @param[out] d fourth byte of IPv4 address.
921 * @retval 0 for Success, otherwise some error value
923 //------------------------------------------------------------------------
924 int32_t OCDevAddrToIPv4Addr(OCDevAddr *ipAddr, uint8_t *a, uint8_t *b,
925 uint8_t *c, uint8_t *d );
928 //-- OCDevAddrToPort -------------------------------------------------
930 * This method is used to retrieve the port number from OCDev address
938 * @retval 0 for Success, otherwise some error value
940 //------------------------------------------------------------------------
941 int32_t OCDevAddrToPort(OCDevAddr *ipAddr, uint16_t *port);
945 #endif // __cplusplus
947 #endif /* OCSTACK_H_ */