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.
37 #define OC_WELL_KNOWN_QUERY "coap://224.0.1.187:5683/oc/core"
38 #define OC_EXPLICIT_DEVICE_DISCOVERY_URI "coap://224.0.1.187:5683/oc/core?rt=core.led"
39 #define OC_MULTICAST_PREFIX "coap://224.0.1.187:5683"
40 #define OC_MULTICAST_IP "coap://224.0.1.187"
42 #define USE_RANDOM_PORT (0)
44 #define OC_DEFAULT_PRESENCE_TTL (60)
45 #define OC_PRESENCE_URI "/oc/presence"
46 extern uint8_t PresenceTimeOutSize; // length of PresenceTimeOut - 1
47 extern uint32_t PresenceTimeOut[];
49 //-----------------------------------------------------------------------------
51 //-----------------------------------------------------------------------------
54 * OC Virtual resources supported by every OC device
57 OC_WELL_KNOWN_URI= 0, // "/oc/core"
58 OC_DEVICE_URI, // "/oc/core/d"
59 OC_RESOURCE_TYPES_URI, // "/oc/core/d/type"
61 OC_PRESENCE, // "/oc/presence"
63 OC_MAX_VIRTUAL_RESOURCES // Max items in the list
67 * Standard RESTful HTTP Methods
71 OC_REST_GET = (1 << 0), // Read
72 OC_REST_PUT = (1 << 1), // Write
73 OC_REST_POST = (1 << 2), // Update
74 OC_REST_DELETE = (1 << 3), // Delete
75 // Register observe request for most up date notifications ONLY.
76 OC_REST_OBSERVE = (1 << 4),
77 // Register observe request for all notifications, including stale notifications.
78 OC_REST_OBSERVE_ALL = (1 << 5),
79 // Deregister observation, intended for internal use
80 OC_REST_CANCEL_OBSERVE = (1 << 6),
82 // Subscribe for all presence notifications of a particular resource.
83 OC_REST_PRESENCE = (1 << 7)
88 * Host Mode of Operation
96 extern OCMode myStackMode;
104 OC_NA_QOS // No Quality is defined, let the stack decide
105 } OCQualityOfService;
108 * Resource Properties
110 * OC_ACTIVE - When this bit is set, the resource is initialized, otherwise the resource
111 * is 'inactive'. 'inactive' signifies that the resource has been marked for
112 * deletion or is already deleted.
113 * OC_DISCOVERABLE - When this bit is set, the resource is allowed to be discovered by clients.
114 * OC_OBSERVABLE - When this bit is set, the resource is allowed to be observed by clients.
115 * OC_SLOW - When this bit is set, the resource has been marked as 'slow'. 'slow' signifies
116 * that responses from this resource can expect delays in processing its
117 * requests from clients.
118 * OC_SECURE - When this bit is set, the resource is a secure resource.
121 OC_ACTIVE = (1 << 0),
122 OC_DISCOVERABLE = (1 << 1),
123 OC_OBSERVABLE = (1 << 2),
126 } OCResourceProperty;
129 * Transport Protocol IDs
132 OC_INVALID_ID = (1 << 0),
133 OC_COAP_ID = (1 << 1)
134 } OCTransportProtocolID;
137 * Declares Stack Results & Errors
140 /* Success status code - START HERE */
142 OC_STACK_RESOURCE_CREATED,
143 OC_STACK_RESOURCE_DELETED,
145 /* Success status code - END HERE */
146 /* Error status code - START HERE */
147 OC_STACK_INVALID_URI = 20,
148 OC_STACK_INVALID_QUERY,
150 OC_STACK_INVALID_PORT,
151 OC_STACK_INVALID_CALLBACK,
152 OC_STACK_INVALID_METHOD,
153 OC_STACK_INVALID_PARAM,
154 OC_STACK_INVALID_OBSERVE_PARAM,
158 OC_STACK_NO_RESOURCE, /* resource not found */
159 OC_STACK_RESOURCE_ERROR, /* ex: not supported method or interface */
160 OC_STACK_SLOW_RESOURCE,
161 OC_STACK_REPEATED_REQUEST,
162 OC_STACK_NO_OBSERVERS, /* resource has no registered observers */
163 OC_STACK_OBSERVER_NOT_FOUND,
164 OC_STACK_VIRTUAL_DO_NOT_HANDLE,
165 OC_STACK_INVALID_OPTION,
166 OC_STACK_MALFORMED_RESPONSE, /* the remote reply contained malformed data */
167 OC_STACK_PERSISTENT_BUFFER_REQUIRED,
168 OC_STACK_INVALID_REQUEST_HANDLE,
169 OC_STACK_INVALID_DEVICE_INFO,
170 OC_STACK_INVALID_JSON,
171 /* NOTE: Insert all new error codes here!*/
173 OC_STACK_PRESENCE_STOPPED = 128,
174 OC_STACK_PRESENCE_TIMEOUT,
175 OC_STACK_PRESENCE_DO_NOT_HANDLE,
178 /* Error status code - END HERE */
182 * Handle to an @ref OCDoResource invocation.
184 typedef void * OCDoHandle;
187 * Handle to an OCResource object owned by the OCStack.
189 typedef void * OCResourceHandle;
191 typedef void * OCRequestHandle;
192 typedef void * OCResponseHandle;
195 * Unique identifier for each observation request. Used when observations are
196 * registered or deregistering. Used by entity handler to signal specific
197 * observers to be notified of resource changes.
198 * There can be maximum of 256 observations per server.
200 typedef uint8_t OCObservationId;
203 * Action associated with observation
206 OC_OBSERVE_REGISTER = 0,
207 OC_OBSERVE_DEREGISTER = 1,
208 OC_OBSERVE_NO_OPTION = 2
212 // Action associated with observation request
213 OCObserveAction action;
214 // Identifier for observation being registered/deregistered
215 OCObservationId obsId;
219 * Possible returned values from entity handler
224 OC_EH_RESOURCE_CREATED,
225 OC_EH_RESOURCE_DELETED,
228 } OCEntityHandlerResult;
230 // following structure will be used to define the vendor specific header options to be included
231 // in communication packets
233 typedef struct OCHeaderOption {
234 // The protocol ID this option applies to
235 OCTransportProtocolID protocolID;
236 // The header option ID which will be added to communication packets
239 uint16_t optionLength;
240 // pointer to its data
241 uint8_t optionData[MAX_HEADER_OPTION_DATA_LENGTH];
245 * Incoming requests handled by the server. Requests are passed in as a parameter to the @ref OCEntityHandler callback API.
246 * @brief The @ref OCEntityHandler callback API must be implemented in the application in order to receive these requests.
249 // Associated resource
250 OCResourceHandle resource;
251 OCRequestHandle requestHandle;
252 // the REST method retrieved from received request PDU
254 // resource query send by client
255 unsigned char * query;
256 // Information associated with observation - valid only when OCEntityHandler
257 // flag includes OC_OBSERVE_FLAG
258 OCObservationInfo obsInfo;
259 // An array of the received vendor specific header options
260 uint8_t numRcvdVendorSpecificHeaderOptions;
261 OCHeaderOption * rcvdVendorSpecificHeaderOptions;
262 // reqJSON is retrieved from the payload of the received request PDU
263 unsigned char * reqJSONPayload;
264 }OCEntityHandlerRequest;
267 * Response from queries to remote servers. Queries are made by calling the @ref OCDoResource API.
270 // Address of remote server
272 // the is the result of our stack, OCStackResult should contain coap/other error codes;
273 OCStackResult result;
274 // If associated with observe, this will represent the sequence of notifications from server.
275 uint32_t sequenceNumber;
276 // resJSONPayload is retrieved from the payload of the received request PDU
277 unsigned const char * resJSONPayload;
278 // An array of the received vendor specific header options
279 uint8_t numRcvdVendorSpecificHeaderOptions;
280 OCHeaderOption rcvdVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
284 * Following structure describes the device properties. All non-Null properties will be included
285 * in a device discovery request.
294 char *manufacturerName;
295 char *manufacturerUrl;
297 char *dateOfManufacture;
298 char *platformVersion;
299 char *firmwareVersion;
305 // Request handle is passed to server via the entity handler for each incoming request.
306 // Stack assigns when request is received, server sets to indicate what request response is for
307 OCRequestHandle requestHandle;
308 // New handle for tracking block (or slow) response. Stack assigns, server uses for subsequent calls
309 OCResponseHandle *responseHandle;
311 OCResourceHandle resourceHandle;
312 // Allow the entity handler to pass a result with the response
313 OCEntityHandlerResult ehResult;
314 // this is the pointer to server payload data to be transferred
315 unsigned char *payload;
316 // size of server payload data. I don't think we should rely on null terminated data for size
317 uint16_t payloadSize;
318 // An array of the vendor specific header options the entity handler wishes to use in response
319 uint8_t numSendVendorSpecificHeaderOptions;
320 OCHeaderOption sendVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
321 // URI of new resource that entity handler might create
322 unsigned char resourceUri[MAX_URI_LENGTH];
323 // Server sets to true for persistent response buffer, false for non-persistent response buffer
324 uint8_t persistentBufferFlag;
325 } OCEntityHandlerResponse;
328 OC_INIT_FLAG = (1 << 0),
329 OC_REQUEST_FLAG = (1 << 1),
330 OC_OBSERVE_FLAG = (1 << 2)
331 } OCEntityHandlerFlag; //entity_handler_flag_t ;
333 // possible returned values from client application
335 OC_STACK_DELETE_TRANSACTION = 0,
336 OC_STACK_KEEP_TRANSACTION
337 } OCStackApplicationResult;
339 //-----------------------------------------------------------------------------
340 // Callback function definitions
341 //-----------------------------------------------------------------------------
344 * Client applications implement this callback to consume responses received from Servers.
346 typedef OCStackApplicationResult (* OCClientResponseHandler)(void *context, OCDoHandle handle,
347 OCClientResponse * clientResponse);
350 * Client applications using a context pointer implement this callback to delete the
351 * context upon removal of the callback/context pointer from the internal callback-list
353 typedef void (* OCClientContextDeleter)(void *context);
356 * This info is passed from application to OC Stack when initiating a request to Server
360 OCClientResponseHandler cb;
361 OCClientContextDeleter cd;
365 * Application server implementations must implement this callback to consume requests OTA.
366 * Entity handler callback needs to fill the resPayload of the entityHandlerRequest.
368 typedef OCEntityHandlerResult (*OCEntityHandler)
369 (OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest);
372 * Device Entity handler need to use this call back instead of OCEntityHandler
374 typedef OCEntityHandlerResult (*OCDeviceEntityHandler)
375 (OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest, char* uri);
377 //-----------------------------------------------------------------------------
378 // Function prototypes
379 //-----------------------------------------------------------------------------
382 * Initialize the OC Stack. Must be called prior to starting the stack.
385 * IP Address of host device
387 * Port of host device
389 * Host device is client, server, or client-server
392 * OC_STACK_OK - no errors
393 * OC_STACK_ERROR - stack init error
395 OCStackResult OCInit(const char *ipAddr, uint16_t port, OCMode mode);
398 * Stop the OC stack. Use for a controlled shutdown.
400 * Note: OCStop() performs operations similar to OCStopPresence(), as well as OCDeleteResource() on
401 * all resources this server is hosting. OCDeleteResource() performs operations similar to
402 * OCNotifyAllObservers() to notify all client observers that the respective resource is being
406 * OC_STACK_OK - no errors
407 * OC_STACK_ERROR - stack not initialized
409 OCStackResult OCStop();
412 * Called in main loop of OC client or server. Allows low-level processing of
416 * OC_STACK_OK - no errors
417 * OC_STACK_ERROR - stack process error
419 OCStackResult OCProcess();
422 * Discover or Perform requests on a specified resource (specified by that Resource's respective
425 * @param handle - @ref OCDoHandle to refer to the request sent out on behalf of
427 * @param method - @ref OCMethod to perform on the resource
428 * @param requiredUri - URI of the resource to interact with
429 * @param referenceUri - URI of the reference resource
430 * @param request - JSON encoded request
431 * @param qos - quality of service. Note that if this API is called on a uri with
432 * the well-known multicast IP address, the qos will be forced to
434 * since it is impractical to send other QOS levels on such addresses.
435 * @param clientApplicationCB- asynchronous callback function that is invoked
436 * by the stack when discovery or resource interaction is complete
437 * @param options - The address of an array containing the vendor specific
438 * header options to be sent with the request
439 * @param numOptions - Number of header options to be included
441 * Note: Presence subscription amendments (ie. adding additional resource type filters by calling
442 * this API again) require the use of the same base URI as the original request to successfully
443 * amend the presence filters.
446 * OC_STACK_OK - no errors
447 * OC_STACK_INVALID_CALLBACK - invalid callback function pointer
448 * OC_STACK_INVALID_METHOD - invalid resource method
449 * OC_STACK_INVALID_URI - invalid required or reference URI
450 * OC_STACK_INVALID_QUERY - number of resource types specified for filtering presence
451 * notifications exceeds @ref MAX_PRESENCE_FILTERS.
453 OCStackResult OCDoResource(OCDoHandle *handle, OCMethod method, const char *requiredUri, const char *referenceUri,
454 const char *request, OCQualityOfService qos, OCCallbackData *cbData, OCHeaderOption * options,
458 * Cancel a request associated with a specific @ref OCDoResource invocation.
460 * @param handle - Used to identify a specific OCDoResource invocation.
461 * @param qos - used to specify Quality of Service (read below for more info)
462 * @param options- used to specify vendor specific header options when sending
463 * explicit observe cancellation
464 * @param numOptions- Number of header options to be included
467 * OC_STACK_OK - No errors; Success
468 * OC_STACK_INVALID_PARAM - The handle provided is invalid.
470 OCStackResult OCCancel(OCDoHandle handle, OCQualityOfService qos, OCHeaderOption * options,
475 * When operating in @ref OCServer or @ref OCClientServer mode, this API will start sending out
476 * presence notifications to clients via multicast. Once this API has been called with a success,
477 * clients may query for this server's presence and this server's stack will respond via multicast.
479 * Server can call this function when it comes online for the first time, or when it comes back
480 * online from offline mode, or when it re enters network.
482 * @param ttl - Time To Live in seconds
483 * Note: If ttl is '0', then the default stack value will be used (60 Seconds).
486 * OC_STACK_OK - No errors; Success
488 OCStackResult OCStartPresence(const uint32_t ttl);
491 * When operating in @ref OCServer or @ref OCClientServer mode, this API will stop sending out
492 * presence notifications to clients via multicast. Once this API has been called with a success,
493 * this server's stack will not respond to clients querying for this server's presence.
495 * Server can call this function when it is terminating, going offline, or when going
499 * OC_STACK_OK - No errors; Success
502 OCStackResult OCStopPresence();
507 * Set default device entity handler
509 * @param entityHandler - entity handler function that is called by ocstack to handle requests for
510 * any undefined resources or default actions.
511 * if NULL is passed it removes the device default entity handler.
514 * OC_STACK_OK - no errors
515 * OC_STACK_ERROR - stack process error
517 OCStackResult OCSetDefaultDeviceEntityHandler(OCDeviceEntityHandler entityHandler);
520 * Set device information.
522 * @param deviceInfo - Structure passed by the server application containing
523 * the device information.
527 * OC_STACK_OK - no errors
528 * OC_STACK_INVALID_PARAM - invalid paramerter
529 * OC_STACK_ERROR - stack process error
531 OCStackResult OCSetDeviceInfo(OCDeviceInfo deviceInfo);
536 * @param handle - pointer to handle to newly created resource. Set by ocstack. Used to refer to resource
537 * @param resourceTypeName - name of resource type. Example: "core.led"
538 * @param resourceInterfaceName - name of resource interface. Example: "core.rw"
539 * @param uri - URI of the resource. Example: "/a/led"
540 * @param entityHandler - entity handler function that is called by ocstack to handle requests, etc
541 * NULL for default entity handler
542 * @param resourceProperties - properties supported by resource. Example: OC_DISCOVERABLE|OC_OBSERVABLE
545 * OC_STACK_OK - no errors
546 * OC_STACK_ERROR - stack process error
548 OCStackResult OCCreateResource(OCResourceHandle *handle,
549 const char *resourceTypeName,
550 const char *resourceInterfaceName,
552 OCEntityHandler entityHandler,
553 uint8_t resourceProperties);
556 * Create a resource. with host ip address for remote resource
558 * @param handle - pointer to handle to newly created resource. Set by ocstack.
559 * Used to refer to resource
560 * @param resourceTypeName - name of resource type. Example: "core.led"
561 * @param resourceInterfaceName - name of resource interface. Example: "core.rw"
562 * @param host - HOST address of the remote resource. Example: "coap://xxx.xxx.xxx.xxx:xxxxx"
563 * @param uri - URI of the resource. Example: "/a/led"
564 * @param entityHandler - entity handler function that is called by ocstack to handle requests, etc
565 * NULL for default entity handler
566 * @param resourceProperties - properties supported by resource.
567 * Example: OC_DISCOVERABLE|OC_OBSERVABLE
570 * OC_STACK_OK - no errors
571 * OC_STACK_ERROR - stack process error
573 OCStackResult OCCreateResourceWithHost(OCResourceHandle *handle,
574 const char *resourceTypeName,
575 const char *resourceInterfaceName,
578 OCEntityHandler entityHandler,
579 uint8_t resourceProperties);
582 * Add a resource to a collection resource.
584 * @param collectionHandle - handle to the collection resource
585 * @param resourceHandle - handle to resource to be added to the collection resource
588 * OC_STACK_OK - no errors
589 * OC_STACK_ERROR - stack process error
590 * OC_STACK_INVALID_PARAM - invalid collectionhandle
592 OCStackResult OCBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
595 * Remove a resource from a collection resource.
597 * @param collectionHandle - handle to the collection resource
598 * @param resourceHandle - handle to resource to be removed from the collection resource
601 * OC_STACK_OK - no errors
602 * OC_STACK_ERROR - stack process error
603 * OC_STACK_INVALID_PARAM - invalid collectionhandle
605 OCStackResult OCUnBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
608 * Bind a resourcetype to a resource.
610 * @param handle - handle to the resource
611 * @param resourceTypeName - name of resource type. Example: "core.led"
614 * OC_STACK_OK - no errors
615 * OC_STACK_ERROR - stack process error
617 OCStackResult OCBindResourceTypeToResource(OCResourceHandle handle,
618 const char *resourceTypeName);
620 * Bind a resource interface to a resource.
622 * @param handle - handle to the resource
623 * @param resourceInterfaceName - name of resource interface. Example: "core.rw"
626 * OC_STACK_OK - no errors
627 * OC_STACK_ERROR - stack process error
629 OCStackResult OCBindResourceInterfaceToResource(OCResourceHandle handle,
630 const char *resourceInterfaceName);
633 * Bind an entity handler to the resource.
635 * @param handle - handle to the resource that the contained resource is to be bound
636 * @param entityHandler - entity handler function that is called by ocstack to handle requests, etc
638 * OC_STACK_OK - no errors
639 * OC_STACK_ERROR - stack process error
641 OCStackResult OCBindResourceHandler(OCResourceHandle handle, OCEntityHandler entityHandler);
644 * Get the number of resources that have been created in the stack.
646 * @param numResources - pointer to count variable
649 * OC_STACK_OK - no errors
650 * OC_STACK_ERROR - stack process error
653 OCStackResult OCGetNumberOfResources(uint8_t *numResources);
656 * Get a resource handle by index.
658 * @param index - index of resource, 0 to Count - 1
661 * Resource handle - if found
662 * NULL - if not found
664 OCResourceHandle OCGetResourceHandle(uint8_t index);
667 * Delete resource specified by handle. Deletes resource and all resourcetype and resourceinterface
670 * Note: OCDeleteResource() performs operations similar to OCNotifyAllObservers() to notify all
671 * client observers that "this" resource is being deleted.
673 * @param handle - handle of resource to be deleted
676 * OC_STACK_OK - no errors
677 * OC_STACK_ERROR - stack process error
679 OCStackResult OCDeleteResource(OCResourceHandle handle);
682 * Get the URI of the resource specified by handle.
684 * @param handle - handle of resource
686 * URI string - if resource found
687 * NULL - resource not found
689 const char *OCGetResourceUri(OCResourceHandle handle);
692 * Get the properties of the resource specified by handle.
693 * NOTE: that after a resource is created, the OC_ACTIVE property is set
694 * for the resource by the stack.
696 * @param handle - handle of resource
698 * property bitmap - if resource found
699 * NULL - resource not found
701 uint8_t OCGetResourceProperties(OCResourceHandle handle);
704 * Get the number of resource types of the resource.
706 * @param handle - handle of resource
707 * @param numResourceTypes - pointer to count variable
710 * OC_STACK_OK - no errors
711 * OC_STACK_ERROR - stack process error
713 OCStackResult OCGetNumberOfResourceTypes(OCResourceHandle handle, uint8_t *numResourceTypes);
716 * Get name of resource type of the resource.
718 * @param handle - handle of resource
719 * @param index - index of resource, 0 to Count - 1
722 * resource type name - if resource found
723 * NULL - resource not found
725 const char *OCGetResourceTypeName(OCResourceHandle handle, uint8_t index);
728 * Get the number of resource interfaces of the resource.
730 * @param handle - handle of resource
731 * @param numResources - pointer to count variable
734 * OC_STACK_OK - no errors
735 * OC_STACK_ERROR - stack process error
738 OCStackResult OCGetNumberOfResourceInterfaces(OCResourceHandle handle, uint8_t *numResourceInterfaces);
741 * Get name of resource interface of the resource.
743 * @param handle - handle of resource
744 * @param index - index of resource, 0 to Count - 1
747 * resource interface name - if resource found
748 * NULL - resource not found
750 const char *OCGetResourceInterfaceName(OCResourceHandle handle, uint8_t index);
753 * Get methods of resource interface of the resource.
755 * @param handle - handle of resource
756 * @param index - index of resource, 0 to Count - 1
759 * allowed methods - if resource found
760 * NULL - resource not found
762 uint8_t OCGetResourceInterfaceAllowedMethods(OCResourceHandle handle, uint8_t index);
765 * Get resource handle from the collection resource by index.
767 * @param collectionHandle - handle of collection resource
768 * @param index - index of contained resource, 0 to Count - 1
771 * handle to contained resource - if resource found
772 * NULL - resource not found
774 OCResourceHandle OCGetResourceHandleFromCollection(OCResourceHandle collectionHandle, uint8_t index);
777 * Get the entity handler for a resource.
779 * @param handle - handle of resource
782 * entity handler - if resource found
783 * NULL - resource not found
785 OCEntityHandler OCGetResourceHandler(OCResourceHandle handle);
788 * Notify all registered observers that the resource representation has
789 * changed. If observation includes a query the client is notified only
790 * if the query is valid after the resource representation has changed.
792 * @param handle - handle of resource
795 * OC_STACK_OK - no errors
796 * OC_STACK_NO_RESOURCE - invalid resource handle
797 * OC_STACK_NO_OBSERVERS - no more observers intrested in resource
799 OCStackResult OCNotifyAllObservers(OCResourceHandle handle, OCQualityOfService qos);
802 * Notify specific observers with updated value of representation.
803 * Before this API is invoked by entity handler it has finished processing
804 * queries for the associated observers.
806 * @param handle - handle of resource
807 * @param obsIdList - list of observation ids that need to be notified
808 * @param numberOfIds - number of observation ids included in obsIdList
809 * @param notificationJSONPayload - JSON encoded payload to send in notification
810 * @param qos - desired quality of service of the observation notifications
811 * NOTE: The memory for obsIdList and notificationJSONPayload is managed by the
812 * entity invoking the API. The maximum size of the notification is 1015 bytes
813 * for non-Arduino platforms. For Arduino the maximum size is 247 bytes.
816 * OC_STACK_OK - no errors
817 * OC_STACK_NO_RESOURCE - invalid resource handle
820 OCNotifyListOfObservers (OCResourceHandle handle,
821 OCObservationId *obsIdList,
823 unsigned char *notificationJSONPayload,
824 OCQualityOfService qos);
828 * Send a response to a request.
829 * The response can be a normal, slow, or block (i.e. a response that
830 * is too large to be sent in a single PDU and must span multiple transmissions)
832 * @param response - pointer to structure that contains response parameters
835 * OC_STACK_OK - no errors
837 OCStackResult OCDoResponse(OCEntityHandlerResponse *response);
840 * Cancel a response. Applies to a block response
842 * @param responseHandle - response handle set by stack in OCServerResponse after
843 * OCDoResponse is called
846 * OC_STACK_OK - No errors; Success
847 * OC_STACK_INVALID_PARAM - The handle provided is invalid.
849 OCStackResult OCCancelResponse(OCResponseHandle responseHandle);
854 #endif // __cplusplus
856 #endif /* OCSTACK_H_ */