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 /// Authority + URI string to prefix well known queries
39 #define OC_WELL_KNOWN_QUERY "224.0.1.187:5683/oc/core"
40 #define OC_EXPLICIT_DEVICE_DISCOVERY_URI "224.0.1.187:5683/oc/core/d?rt=core.led"
41 /// Multicast address and port string to prefix multicast queries
42 #define OC_MULTICAST_PREFIX "224.0.1.187:5683"
43 /// IP Multicast address to use for multicast requests
44 #define OC_MULTICAST_IP "224.0.1.187"
45 /// IP Multicast port to use for multicast requests
46 #define OC_MULTICAST_PORT 5683
49 #define OC_DEFAULT_PRESENCE_TTL_SECONDS (60)
50 /// OC_MAX_PRESENCE_TTL_SECONDS sets the maximum time to live (TTL) for presence.
51 /// NOTE: Changing the setting to a longer duration may lead to unsupported and untested
53 #define OC_MAX_PRESENCE_TTL_SECONDS (60 * 60 * 24) // 60 sec/min * 60 min/hr * 24 hr/day
54 #define OC_PRESENCE_URI "/oc/presence"
57 //-----------------------------------------------------------------------------
59 //-----------------------------------------------------------------------------
62 * Data structure to encapsulate IPv4/IPv6/Contiki/lwIP device addresses.
64 typedef struct OCDevAddr
66 uint32_t size; ///< length of the address stored in addr field.
67 uint8_t addr[DEV_ADDR_SIZE_MAX]; ///< device address.
71 * OC Virtual resources supported by every OC device.
75 OC_WELL_KNOWN_URI= 0, ///< "/oc/core"
76 OC_DEVICE_URI, ///< "/oc/core/d"
77 OC_RESOURCE_TYPES_URI, ///< "/oc/core/d/type"
79 OC_PRESENCE, ///< "/oc/presence"
81 OC_MAX_VIRTUAL_RESOURCES ///<s Max items in the list
85 * Standard RESTful HTTP Methods.
90 OC_REST_GET = (1 << 0), ///< Read
91 OC_REST_PUT = (1 << 1), ///< Write
92 OC_REST_POST = (1 << 2), ///< Update
93 OC_REST_DELETE = (1 << 3), ///< Delete
94 /// Register observe request for most up date notifications ONLY.
95 OC_REST_OBSERVE = (1 << 4),
96 /// Register observe request for all notifications, including stale notifications.
97 OC_REST_OBSERVE_ALL = (1 << 5),
98 /// Deregister observation, intended for internal use
99 OC_REST_CANCEL_OBSERVE = (1 << 6),
101 /// Subscribe for all presence notifications of a particular resource.
102 OC_REST_PRESENCE = (1 << 7)
107 * Host Mode of Operation.
117 * Quality of Service.
119 * OCQualityOfService attempts to abstract the guarantees provided by the underlying transport
120 * protocol. The precise definitions of each quality of service level depend on the
121 * implementation. In descriptions below are for the current implementation and may changed
126 /// Packet delivery is best effort
128 /// Packet delivery is best effort
130 /// Acknowledgements are used to confirm delivery
132 /// No Quality is defined, let the stack decide
134 } OCQualityOfService;
137 * Resource Properties.
139 * ::OC_ACTIVE When this bit is set, the resource is initialized, otherwise the resource
140 * is 'inactive'. 'inactive' signifies that the resource has been marked for
141 * deletion or is already deleted.
142 * ::OC_DISCOVERABLE When this bit is set, the resource is allowed to be discovered by clients.
143 * ::OC_OBSERVABLE When this bit is set, the resource is allowed to be observed by clients.
144 * ::OC_SLOW When this bit is set, the resource has been marked as 'slow'. 'slow' signifies
145 * that responses from this resource can expect delays in processing its
146 * requests from clients.
147 * ::OC_SECURE When this bit is set, the resource is a secure resource.
151 OC_ACTIVE = (1 << 0),
152 OC_DISCOVERABLE = (1 << 1),
153 OC_OBSERVABLE = (1 << 2),
156 } OCResourceProperty;
159 * Transport Protocol IDs.
163 OC_INVALID_ID = (1 << 0),
164 OC_COAP_ID = (1 << 1)
165 } OCTransportProtocolID;
176 OC_ALL // Multicast message: send over all the interfaces.
177 } OCConnectivityType;
180 * Declares Stack Results & Errors.
184 /* Success status code - START HERE */
186 OC_STACK_RESOURCE_CREATED,
187 OC_STACK_RESOURCE_DELETED,
189 /* Success status code - END HERE */
190 /* Error status code - START HERE */
191 OC_STACK_INVALID_URI = 20,
192 OC_STACK_INVALID_QUERY,
194 OC_STACK_INVALID_PORT,
195 OC_STACK_INVALID_CALLBACK,
196 OC_STACK_INVALID_METHOD,
197 OC_STACK_INVALID_PARAM,
198 OC_STACK_INVALID_OBSERVE_PARAM,
202 OC_STACK_ADAPTER_NOT_ENABLED,
204 OC_STACK_NO_RESOURCE, /* resource not found */
205 OC_STACK_RESOURCE_ERROR, /* ex: not supported method or interface */
206 OC_STACK_SLOW_RESOURCE,
207 OC_STACK_DUPLICATE_REQUEST,
208 OC_STACK_NO_OBSERVERS, /* resource has no registered observers */
209 OC_STACK_OBSERVER_NOT_FOUND,
210 OC_STACK_VIRTUAL_DO_NOT_HANDLE,
211 OC_STACK_INVALID_OPTION,
212 OC_STACK_MALFORMED_RESPONSE, /* the remote reply contained malformed data */
213 OC_STACK_PERSISTENT_BUFFER_REQUIRED,
214 OC_STACK_INVALID_REQUEST_HANDLE,
215 OC_STACK_INVALID_DEVICE_INFO,
216 OC_STACK_INVALID_JSON,
217 /* NOTE: Insert all new error codes here!*/
219 OC_STACK_PRESENCE_STOPPED = 128,
220 OC_STACK_PRESENCE_TIMEOUT,
221 OC_STACK_PRESENCE_DO_NOT_HANDLE,
224 /* Error status code - END HERE */
228 * Handle to an @ref OCDoResource invocation.
230 typedef void * OCDoHandle;
233 * Handle to an OCResource object owned by the OCStack.
235 typedef void * OCResourceHandle;
237 typedef void * OCRequestHandle;
238 typedef void * OCResponseHandle;
241 * Unique identifier for each observation request. Used when observations are
242 * registered or deregistering. Used by entity handler to signal specific
243 * observers to be notified of resource changes.
244 * There can be maximum of 256 observations per server.
246 typedef uint8_t OCObservationId;
249 * Action associated with observation.
253 OC_OBSERVE_REGISTER = 0,
254 OC_OBSERVE_DEREGISTER = 1,
255 OC_OBSERVE_NO_OPTION = 2
260 // Action associated with observation request
261 OCObserveAction action;
262 // Identifier for observation being registered/deregistered
263 OCObservationId obsId;
267 * Possible returned values from entity handler.
273 OC_EH_RESOURCE_CREATED,
274 OC_EH_RESOURCE_DELETED,
277 OC_EH_RESOURCE_NOT_FOUND
278 } OCEntityHandlerResult;
281 * This structure will be used to define the vendor specific header options to be included
282 * in communication packets.
284 typedef struct OCHeaderOption
286 // The protocol ID this option applies to
287 OCTransportProtocolID protocolID;
288 // The header option ID which will be added to communication packets
291 uint16_t optionLength;
292 // pointer to its data
293 uint8_t optionData[MAX_HEADER_OPTION_DATA_LENGTH];
297 * Incoming requests handled by the server. Requests are passed in as a parameter to the
298 * @ref OCEntityHandler callback API.
299 * @brief The @ref OCEntityHandler callback API must be implemented in the application in order
300 * to receive these requests.
304 // Associated resource
305 OCResourceHandle resource;
306 OCRequestHandle requestHandle;
307 // the REST method retrieved from received request PDU
309 // resource query send by client
311 // Information associated with observation - valid only when OCEntityHandler
312 // flag includes OC_OBSERVE_FLAG
313 OCObservationInfo obsInfo;
314 // An array of the received vendor specific header options
315 uint8_t numRcvdVendorSpecificHeaderOptions;
316 OCHeaderOption * rcvdVendorSpecificHeaderOptions;
317 // reqJSON is retrieved from the payload of the received request PDU
318 char * reqJSONPayload;
319 } OCEntityHandlerRequest;
322 * Response from queries to remote servers. Queries are made by calling the @ref OCDoResource API.
326 /// Address of remote server
328 /// Indicates adaptor type on which the response was received
329 OCConnectivityType connType;
330 /// the is the result of our stack, OCStackResult should contain coap/other error codes;
331 OCStackResult result;
332 /// If associated with observe, this will represent the sequence of notifications from server.
333 uint32_t sequenceNumber;
334 /// resJSONPayload is retrieved from the payload of the received request PDU
335 const char * resJSONPayload;
336 /// An array of the received vendor specific header options
337 uint8_t numRcvdVendorSpecificHeaderOptions;
338 OCHeaderOption rcvdVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
342 * This structure describes the device properties. All non-Null properties will be included
343 * in a device discovery request.
352 char *manufacturerName;
353 char *manufacturerUrl;
355 char *dateOfManufacture;
356 char *platformVersion;
357 char *firmwareVersion;
363 // Request handle is passed to server via the entity handler for each incoming request.
364 // Stack assigns when request is received, server sets to indicate what request response is for
365 OCRequestHandle requestHandle;
366 // New handle for tracking block (or slow) response. Stack assigns, server uses for subsequent calls
367 OCResponseHandle *responseHandle;
369 OCResourceHandle resourceHandle;
370 // Allow the entity handler to pass a result with the response
371 OCEntityHandlerResult ehResult;
372 // this is the pointer to server payload data to be transferred
374 // size of server payload data. I don't think we should rely on null terminated data for size
375 uint16_t payloadSize;
376 // An array of the vendor specific header options the entity handler wishes to use in response
377 uint8_t numSendVendorSpecificHeaderOptions;
378 OCHeaderOption sendVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
379 // URI of new resource that entity handler might create
380 char resourceUri[MAX_URI_LENGTH];
381 // Server sets to true for persistent response buffer, false for non-persistent response buffer
382 uint8_t persistentBufferFlag;
383 } OCEntityHandlerResponse;
387 OC_INIT_FLAG = (1 << 0),
388 OC_REQUEST_FLAG = (1 << 1),
389 OC_OBSERVE_FLAG = (1 << 2)
390 } OCEntityHandlerFlag; //entity_handler_flag_t ;
393 * Possible returned values from client application.
397 OC_STACK_DELETE_TRANSACTION = 0,//!< OC_STACK_DELETE_TRANSACTION
398 OC_STACK_KEEP_TRANSACTION //!< OC_STACK_KEEP_TRANSACTION
399 } OCStackApplicationResult;
401 //-----------------------------------------------------------------------------
402 // Callback function definitions
403 //-----------------------------------------------------------------------------
406 * Client applications implement this callback to consume responses received from Servers.
408 typedef OCStackApplicationResult (* OCClientResponseHandler)(void *context, OCDoHandle handle,
409 OCClientResponse * clientResponse);
412 * Client applications using a context pointer implement this callback to delete the
413 * context upon removal of the callback/context pointer from the internal callback-list.
415 typedef void (* OCClientContextDeleter)(void *context);
418 * This info is passed from application to OC Stack when initiating a request to Server.
423 /// The pointer to a function the stack will call to handle the requests
424 OCClientResponseHandler cb;
425 /// A pointer to a function to delete the context when this callback is removed
426 OCClientContextDeleter cd;
430 * Application server implementations must implement this callback to consume requests OTA.
431 * Entity handler callback needs to fill the resPayload of the entityHandlerRequest.
433 typedef OCEntityHandlerResult (*OCEntityHandler)
434 (OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest);
437 * Device Entity handler need to use this call back instead of OCEntityHandler.
439 typedef OCEntityHandlerResult (*OCDeviceEntityHandler)
440 (OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest, char* uri);
442 //-----------------------------------------------------------------------------
443 // Function prototypes
444 //-----------------------------------------------------------------------------
447 * Initialize the OC Stack. Must be called prior to starting the stack.
450 * IP Address of host device. Deprecated parameter.
452 * Port of host device. Deprecated parameter.
454 * Host device is client, server, or client-server.
456 * @return ::OC_STACK_OK on success, some other value upon failure.
458 OCStackResult OCInit(const char *ipAddr, uint16_t port, OCMode mode);
461 * Stop the OC stack. Use for a controlled shutdown.
463 * Note: OCStop() performs operations similar to OCStopPresence(), as well as OCDeleteResource() on
464 * all resources this server is hosting. OCDeleteResource() performs operations similar to
465 * OCNotifyAllObservers() to notify all client observers that the respective resource is being
468 * @return ::OC_STACK_OK on success, some other value upon failure.
470 OCStackResult OCStop();
473 * Called in main loop of OC client or server. Allows low-level processing of
476 * @return ::OC_STACK_OK on success, some other value upon failure.
478 OCStackResult OCProcess();
481 * Discover or Perform requests on a specified resource (specified by that Resource's respective
484 * @param handle @ref OCDoHandle to refer to the request sent out on behalf of
485 * calling this API. This handle can be used to cancel this operation
486 * via the OCCancel API.
487 * Note: This reference is handled internally, and
488 * should not be free'd by the consumer. A NULL handle is permitted
489 * in the event where the caller has no use for the return value.
490 * @param method @ref OCMethod to perform on the resource.
491 * @param requiredUri URI of the resource to interact with.
492 * @param referenceUri URI of the reference resource.
493 * @param request JSON encoded request.
494 * @param conType @ref OCConnectivityType type of connectivity indicating the
495 * interface. Example: ::OC_WIFI, ::OC_ETHERNET, ::OC_ALL.
496 * @param qos Quality of service. Note that if this API is called on a uri with
497 * the well-known multicast IP address, the qos will be forced to
499 * since it is impractical to send other QOS levels on such addresses.
500 * @param cbData Asynchronous callback function that is invoked
501 * by the stack when discovery or resource interaction is complete.
502 * @param options The address of an array containing the vendor specific
503 * header options to be sent with the request.
504 * @param numOptions Number of header options to be included.
506 * Note: Presence subscription amendments (ie. adding additional resource type filters by calling
507 * this API again) require the use of the same base URI as the original request to successfully
508 * amend the presence filters.
510 * @return ::OC_STACK_OK on success, some other value upon failure.
512 OCStackResult OCDoResource(OCDoHandle *handle, OCMethod method, const char *requiredUri,
513 const char *referenceUri, const char *request, OCConnectivityType conType,
514 OCQualityOfService qos, OCCallbackData *cbData,
515 OCHeaderOption * options, uint8_t numOptions);
518 * Cancel a request associated with a specific @ref OCDoResource invocation.
520 * @param handle - Used to identify a specific OCDoResource invocation.
521 * @param qos - used to specify Quality of Service (read below for more info)
522 * @param options- used to specify vendor specific header options when sending
523 * explicit observe cancellation
524 * @param numOptions- Number of header options to be included
526 * @return ::OC_STACK_OK on success, some other value upon failure.
528 OCStackResult OCCancel(OCDoHandle handle, OCQualityOfService qos, OCHeaderOption * options,
533 * When operating in @ref OCServer or @ref OCClientServer mode, this API will start sending out
534 * presence notifications to clients via multicast. Once this API has been called with a success,
535 * clients may query for this server's presence and this server's stack will respond via multicast.
537 * Server can call this function when it comes online for the first time, or when it comes back
538 * online from offline mode, or when it re enters network.
540 * @param ttl Time To Live in seconds.
541 * Note: If ttl is '0', then the default stack value will be used (60 Seconds).
543 * If ttl is greater than OC_MAX_PRESENCE_TTL_SECONDS, then the ttl will be set to
544 * OC_MAX_PRESENCE_TTL_SECONDS.
546 * @return ::OC_STACK_OK on success, some other value upon failure.
548 OCStackResult OCStartPresence(const uint32_t ttl);
551 * When operating in @ref OCServer or @ref OCClientServer mode, this API will stop sending out
552 * presence notifications to clients via multicast. Once this API has been called with a success,
553 * this server's stack will not respond to clients querying for this server's presence.
555 * Server can call this function when it is terminating, going offline, or when going
558 * @return ::OC_STACK_OK on success, some other value upon failure.
561 OCStackResult OCStopPresence();
566 * Set default device entity handler.
568 * @param entityHandler Entity handler function that is called by ocstack to handle requests for
569 * any undefined resources or default actions.
570 * If NULL is passed it removes the device default entity handler.
572 * @return ::OC_STACK_OK on success, some other value upon failure.
574 OCStackResult OCSetDefaultDeviceEntityHandler(OCDeviceEntityHandler entityHandler);
577 * Set device information.
579 * @param deviceInfo - Structure passed by the server application containing
580 * the device information.
584 * OC_STACK_OK - no errors
585 * OC_STACK_INVALID_PARAM - invalid paramerter
586 * OC_STACK_ERROR - stack process error
588 OCStackResult OCSetDeviceInfo(OCDeviceInfo deviceInfo);
593 * @param handle Pointer to handle to newly created resource. Set by ocstack and
594 * used to refer to resource.
595 * @param resourceTypeName Name of resource type. Example: "core.led".
596 * @param resourceInterfaceName Name of resource interface. Example: "core.rw".
597 * @param uri URI of the resource. Example: "/a/led".
598 * @param entityHandler Entity handler function that is called by ocstack to handle requests, etc.
599 * NULL for default entity handler.
600 * @param resourceProperties Properties supported by resource.
601 * Example: ::OC_DISCOVERABLE|::OC_OBSERVABLE.
603 * @return ::OC_STACK_OK on success, some other value upon failure.
605 OCStackResult OCCreateResource(OCResourceHandle *handle,
606 const char *resourceTypeName,
607 const char *resourceInterfaceName,
609 OCEntityHandler entityHandler,
610 uint8_t resourceProperties);
613 * Create a resource. with host ip address for remote resource.
615 * @param handle Pointer to handle to newly created resource. Set by ocstack.
616 * Used to refer to resource.
617 * @param resourceTypeName Name of resource type. Example: "core.led".
618 * @param resourceInterfaceName Name of resource interface. Example: "core.rw".
619 * @param host HOST address of the remote resource. Example: "coap://xxx.xxx.xxx.xxx:xxxxx".
620 * @param uri URI of the resource. Example: "/a/led".
621 * @param entityHandler Entity handler function that is called by ocstack to handle requests, etc.
622 * NULL for default entity handler.
623 * @param resourceProperties Properties supported by resource.
624 * Example: ::OC_DISCOVERABLE|::OC_OBSERVABLE
626 * @return ::OC_STACK_OK on success, some other value upon failure.
628 OCStackResult OCCreateResourceWithHost(OCResourceHandle *handle,
629 const char *resourceTypeName,
630 const char *resourceInterfaceName,
633 OCEntityHandler entityHandler,
634 uint8_t resourceProperties);
637 * Add a resource to a collection resource.
639 * @param collectionHandle Handle to the collection resource.
640 * @param resourceHandle Handle to resource to be added to the collection resource.
642 * @return ::OC_STACK_OK on success, some other value upon failure.
644 OCStackResult OCBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
647 * Remove a resource from a collection resource.
649 * @param collectionHandle Handle to the collection resource.
650 * @param resourceHandle Handle to resource to be removed from the collection resource.
652 * @return ::OC_STACK_OK on success, some other value upon failure.
654 OCStackResult OCUnBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
657 * Bind a resourcetype to a resource.
659 * @param handle Handle to the resource.
660 * @param resourceTypeName Name of resource type. Example: "core.led".
662 * @return ::OC_STACK_OK on success, some other value upon failure.
664 OCStackResult OCBindResourceTypeToResource(OCResourceHandle handle,
665 const char *resourceTypeName);
667 * Bind a resource interface to a resource.
669 * @param handle Handle to the resource.
670 * @param resourceInterfaceName Name of resource interface. Example: "core.rw".
672 * @return ::OC_STACK_OK on success, some other value upon failure.
674 OCStackResult OCBindResourceInterfaceToResource(OCResourceHandle handle,
675 const char *resourceInterfaceName);
678 * Bind an entity handler to the resource.
680 * @param handle Handle to the resource that the contained resource is to be bound.
681 * @param entityHandler Entity handler function that is called by ocstack to handle requests, etc.
682 * @return ::OC_STACK_OK on success, some other value upon failure.
684 OCStackResult OCBindResourceHandler(OCResourceHandle handle, OCEntityHandler entityHandler);
687 * Get the number of resources that have been created in the stack.
689 * @param numResources Pointer to count variable.
691 * @return ::OC_STACK_OK on success, some other value upon failure.
693 OCStackResult OCGetNumberOfResources(uint8_t *numResources);
696 * Get a resource handle by index.
698 * @param index Index of resource, 0 to Count - 1.
700 * @return Found resource handle or NULL if not found.
702 OCResourceHandle OCGetResourceHandle(uint8_t index);
705 * Delete resource specified by handle. Deletes resource and all resourcetype and resourceinterface
708 * Note: OCDeleteResource() performs operations similar to OCNotifyAllObservers() to notify all
709 * client observers that "this" resource is being deleted.
711 * @param handle Handle of resource to be deleted.
713 * @return ::OC_STACK_OK on success, some other value upon failure.
715 OCStackResult OCDeleteResource(OCResourceHandle handle);
718 * Get the URI of the resource specified by handle.
720 * @param handle Handle of resource.
721 * @return URI string if resource found or NULL if not found.
723 const char *OCGetResourceUri(OCResourceHandle handle);
726 * Get the properties of the resource specified by handle.
727 * NOTE: that after a resource is created, the OC_ACTIVE property is set
728 * for the resource by the stack.
730 * @param handle Handle of resource.
731 * @return OCResourceProperty Bitmask or -1 if resource is not found.
733 OCResourceProperty OCGetResourceProperties(OCResourceHandle handle);
736 * Get the number of resource types of the resource.
738 * @param handle Handle of resource.
739 * @param numResourceTypes Pointer to count variable.
741 * @return ::OC_STACK_OK on success, some other value upon failure.
743 OCStackResult OCGetNumberOfResourceTypes(OCResourceHandle handle, uint8_t *numResourceTypes);
746 * Get name of resource type of the resource.
748 * @param handle Handle of resource.
749 * @param index Index of resource, 0 to Count - 1.
751 * @return Resource type name if resource found or NULL if resource not found.
753 const char *OCGetResourceTypeName(OCResourceHandle handle, uint8_t index);
756 * Get the number of resource interfaces of the resource.
758 * @param handle Handle of resource.
759 * @param numResourceInterfaces Pointer to count variable.
761 * @return ::OC_STACK_OK on success, some other value upon failure.
763 OCStackResult OCGetNumberOfResourceInterfaces(OCResourceHandle handle,
764 uint8_t *numResourceInterfaces);
767 * Get name of resource interface of the resource.
769 * @param handle Handle of resource.
770 * @param index Index of resource, 0 to Count - 1.
772 * @return Resource interface name if resource found or NULL if resource not found.
774 const char *OCGetResourceInterfaceName(OCResourceHandle handle, uint8_t index);
777 * Get methods of resource interface of the resource.
779 * @param handle Handle of resource.
780 * @param index Index of resource, 0 to Count - 1.
782 * @return Allowed methods if resource found or NULL if resource not found.
784 uint8_t OCGetResourceInterfaceAllowedMethods(OCResourceHandle handle, uint8_t index);
787 * Get resource handle from the collection resource by index.
789 * @param collectionHandle Handle of collection resource.
790 * @param index Index of contained resource, 0 to Count - 1.
792 * @return Handle to contained resource if resource found or NULL if resource not found.
794 OCResourceHandle OCGetResourceHandleFromCollection(OCResourceHandle collectionHandle,
798 * Get the entity handler for a resource.
800 * @param handle Handle of resource.
802 * @return Entity handler if resource found or NULL resource not found.
804 OCEntityHandler OCGetResourceHandler(OCResourceHandle handle);
807 * Notify all registered observers that the resource representation has
808 * changed. If observation includes a query the client is notified only
809 * if the query is valid after the resource representation has changed.
811 * @param handle Handle of resource.
812 * @param qos Desired quality of service for the observation notifications.
814 * @return ::OC_STACK_OK on success, some other value upon failure.
816 OCStackResult OCNotifyAllObservers(OCResourceHandle handle, OCQualityOfService qos);
819 * Notify specific observers with updated value of representation.
820 * Before this API is invoked by entity handler it has finished processing
821 * queries for the associated observers.
823 * @param handle Handle of resource.
824 * @param obsIdList List of observation ids that need to be notified.
825 * @param numberOfIds Number of observation ids included in obsIdList.
826 * @param notificationJSONPayload JSON encoded payload to send in notification.
827 * @param qos Desired quality of service of the observation notifications.
828 * NOTE: The memory for obsIdList and notificationJSONPayload is managed by the
829 * entity invoking the API. The maximum size of the notification is 1015 bytes
830 * for non-Arduino platforms. For Arduino the maximum size is 247 bytes.
832 * @return ::OC_STACK_OK on success, some other value upon failure.
835 OCNotifyListOfObservers (OCResourceHandle handle,
836 OCObservationId *obsIdList,
838 const char *notificationJSONPayload,
839 OCQualityOfService qos);
843 * Send a response to a request.
844 * The response can be a normal, slow, or block (i.e. a response that
845 * is too large to be sent in a single PDU and must span multiple transmissions).
847 * @param response Pointer to structure that contains response parameters.
849 * @return ::OC_STACK_OK on success, some other value upon failure.
851 OCStackResult OCDoResponse(OCEntityHandlerResponse *response);
854 * Cancel a response. Applies to a block response.
856 * @param responseHandle Response handle set by stack in OCServerResponse after
857 * OCDoResponse is called.
859 * @return ::OC_STACK_OK on success, some other value upon failure.
861 OCStackResult OCCancelResponse(OCResponseHandle responseHandle);
866 * This method is used to retrieved the IPv4 address from OCDev address
869 * @param ipAddr OCDevAddr address.
870 * @param a first byte of IPv4 address.
871 * @param b second byte of IPv4 address.
872 * @param c third byte of IPv4 address.
873 * @param d fourth byte of IPv4 address.
874 * @return ::OC_STACK_OK on success, some other value upon failure.
876 int32_t OCDevAddrToIPv4Addr(OCDevAddr *ipAddr, uint8_t *a, uint8_t *b,
877 uint8_t *c, uint8_t *d );
880 * This method is used to retrieve the port number from OCDev address
883 * @param ipAddr OCDevAddr address.
884 * @param port Port number.
885 * @return ::OC_STACK_OK on success, some other value upon failure.
887 int32_t OCDevAddrToPort(OCDevAddr *ipAddr, uint16_t *port);
891 #endif // __cplusplus
893 #endif /* OCSTACK_H_ */