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"
41 #define USE_RANDOM_PORT (0)
43 #define OC_DEFAULT_PRESENCE_TTL (60)
44 #define OC_PRESENCE_URI "/oc/presence"
45 extern uint8_t PresenceTimeOutSize; // length of PresenceTimeOut - 1
46 extern uint32_t PresenceTimeOut[];
48 //-----------------------------------------------------------------------------
50 //-----------------------------------------------------------------------------
53 * OC Virtual resources supported by every OC device
56 OC_WELL_KNOWN_URI= 0, // "/oc/core"
57 OC_DEVICE_URI, // "/oc/core/d"
58 OC_RESOURCE_TYPES_URI, // "/oc/core/d/type"
60 OC_PRESENCE, // "/oc/presence"
62 OC_MAX_VIRTUAL_RESOURCES // Max items in the list
66 * Standard RESTful HTTP Methods
70 OC_REST_GET = (1 << 0), // Read
71 OC_REST_PUT = (1 << 1), // Write
72 OC_REST_POST = (1 << 2), // Update
73 OC_REST_DELETE = (1 << 3), // Delete
74 // Register observe request for most up date notifications ONLY.
75 OC_REST_OBSERVE = (1 << 4),
76 // Register observe request for all notifications, including stale notifications.
77 OC_REST_OBSERVE_ALL = (1 << 5),
78 // Deregister observation, intended for internal use
79 OC_REST_CANCEL_OBSERVE = (1 << 6),
81 // Subscribe for all presence notifications of a particular resource.
82 OC_REST_PRESENCE = (1 << 7)
87 * Host Mode of Operation
95 extern OCMode myStackMode;
103 OC_NA_QOS // No Quality is defined, let the stack decide
104 } OCQualityOfService;
107 * Resource Properties
109 * OC_ACTIVE - When this bit is set, the resource is initialized, otherwise the resource
110 * is 'inactive'. 'inactive' signifies that the resource has been marked for
111 * deletion or is already deleted.
112 * OC_DISCOVERABLE - When this bit is set, the resource is allowed to be discovered by clients.
113 * OC_OBSERVABLE - When this bit is set, the resource is allowed to be observed by clients.
114 * OC_SLOW - When this bit is set, the resource has been marked as 'slow'. 'slow' signifies
115 * that responses from this resource can expect delays in processing its
116 * requests from clients.
119 OC_ACTIVE = (1 << 0),
120 OC_DISCOVERABLE = (1 << 1),
121 OC_OBSERVABLE = (1 << 2),
123 } OCResourceProperty;
126 * Transport Protocol IDs
129 OC_INVALID_ID = (1 << 0),
130 OC_COAP_ID = (1 << 1)
131 } OCTransportProtocolID;
134 * Declares Stack Results & Errors
137 /* Success status code - START HERE */
139 OC_STACK_RESOURCE_CREATED,
140 OC_STACK_RESOURCE_DELETED,
141 /* Success status code - END HERE */
142 /* Error status code - START HERE */
143 OC_STACK_INVALID_URI,
144 OC_STACK_INVALID_QUERY,
146 OC_STACK_INVALID_PORT,
147 OC_STACK_INVALID_CALLBACK,
148 OC_STACK_INVALID_METHOD,
149 OC_STACK_INVALID_PARAM,
150 OC_STACK_INVALID_OBSERVE_PARAM,
154 OC_STACK_NO_RESOURCE, /* resource not found */
155 OC_STACK_RESOURCE_ERROR, /* ex: not supported method or interface */
156 OC_STACK_SLOW_RESOURCE,
157 OC_STACK_NO_OBSERVERS, /* resource has no registered observers */
158 OC_STACK_OBSERVER_NOT_FOUND,
159 OC_STACK_OBSERVER_NOT_ADDED,
160 OC_STACK_OBSERVER_NOT_REMOVED,
162 OC_STACK_PRESENCE_STOPPED,
163 OC_STACK_PRESENCE_DO_NOT_HANDLE,
165 OC_STACK_INVALID_OPTION,
166 OC_STACK_MALFORMED_RESPONSE, /* the remote reply contained malformed data */
168 /* Error status code - END HERE */
172 * Handle to an @ref OCDoResource invocation.
174 typedef void * OCDoHandle;
177 * Handle to an OCResource object owned by the OCStack.
179 typedef void * OCResourceHandle;
182 * Unique identifier for each observation request. Used when observations are
183 * registered or deregistering. Used by entity handler to signal specific
184 * observers to be notified of resource changes.
185 * There can be maximum of 256 observations per server.
187 typedef uint8_t OCObservationId;
190 * Action associated with observation
193 OC_OBSERVE_REGISTER = 0,
194 OC_OBSERVE_DEREGISTER = 1,
195 OC_OBSERVE_NO_OPTION = 2
199 // Action associated with observation request
200 OCObserveAction action;
201 // Identifier for observation being registered/deregistered
202 OCObservationId obsId;
205 // following structure will be used to define the vendor specific header options to be included
206 // in communication packets
208 typedef struct OCHeaderOption {
209 // The protocol ID this option applies to
210 OCTransportProtocolID protocolID;
211 // The header option ID which will be added to communication packets
214 uint16_t optionLength;
215 // pointer to its data
216 uint8_t optionData[MAX_HEADER_OPTION_DATA_LENGTH];
220 * Incoming requests handled by the server. Requests are passed in as a parameter to the @ref OCEntityHandler callback API.
221 * @brief The @ref OCEntityHandler callback API must be implemented in the application in order to receive these requests.
224 // Associated resource
225 OCResourceHandle resource;
226 // resource query send by client
227 unsigned char * query;
228 // the REST method retrieved from received request PDU
230 // reqJSON is retrieved from the payload of the received request PDU
231 unsigned const char * reqJSONPayload;
232 // resJSON is allocated in the stack and will be used by entity handler to fill in its response
233 unsigned char * resJSONPayload;
234 // Length of maximum allowed response
235 uint16_t resJSONPayloadLen;
236 // Information associated with observation - valid only when OCEntityHandler
237 // flag includes OC_OBSERVE_FLAG
238 OCObservationInfo *obsInfo;
239 // An array of the received vendor specific header options
240 uint8_t numRcvdVendorSpecificHeaderOptions;
241 OCHeaderOption rcvdVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
242 // An array of the vendor specific header options the entity handler wishes to use in response
243 uint8_t numSendVendorSpecificHeaderOptions;
244 OCHeaderOption sendVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
245 // URI of new resource that entity handler might create
246 unsigned char *newResourceUri;
248 }OCEntityHandlerRequest;
251 * Response from queries to remote servers. Queries are made by calling the @ref OCDoResource API.
254 // the is the result of our stack, OCStackResult should contain coap/other error codes;
255 OCStackResult result;
256 // Address of remote server
258 // If associated with observe, this will represent the sequence of notifications from server.
259 uint32_t sequenceNumber;
260 // resJSONPayload is retrieved from the payload of the received request PDU
261 unsigned const char * resJSONPayload;
262 // An array of the received vendor specific header options
263 uint8_t numRcvdVendorSpecificHeaderOptions;
264 OCHeaderOption rcvdVendorSpecificHeaderOptions[MAX_HEADER_OPTIONS];
268 OC_INIT_FLAG = (1 << 0),
269 OC_REQUEST_FLAG = (1 << 1),
270 OC_OBSERVE_FLAG = (1 << 2)
271 } OCEntityHandlerFlag; //entity_handler_flag_t ;
273 // possible returned values from client application
275 OC_STACK_DELETE_TRANSACTION = 0,
276 OC_STACK_KEEP_TRANSACTION
277 } OCStackApplicationResult;
279 //-----------------------------------------------------------------------------
280 // Callback function definitions
281 //-----------------------------------------------------------------------------
284 * Client applications implement this callback to consume responses received from Servers.
286 typedef OCStackApplicationResult (* OCClientResponseHandler)(void *context, OCDoHandle handle,
287 OCClientResponse * clientResponse);
290 * Client applications using a context pointer implement this callback to delete the
291 * context upon removal of the callback/context pointer from the internal callback-list
293 typedef void (* OCClientContextDeleter)(void *context);
296 * This info is passed from application to OC Stack when initiating a request to Server
300 OCClientResponseHandler cb;
301 OCClientContextDeleter cd;
305 * Possible returned values from entity handler
310 OC_EH_RESOURCE_CREATED,
311 OC_EH_RESOURCE_DELETED,
313 } OCEntityHandlerResult;
316 * Application server implementations must implement this callback to consume requests OTA.
317 * Entity handler callback needs to fill the resPayload of the entityHandlerRequest.
319 typedef OCEntityHandlerResult (*OCEntityHandler)
320 (OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest);
323 * Device Entity handler need to use this call back instead of OCEntityHandler
325 typedef OCEntityHandlerResult (*OCDeviceEntityHandler)
326 (OCEntityHandlerFlag flag, OCEntityHandlerRequest * entityHandlerRequest, char* uri);
328 //-----------------------------------------------------------------------------
329 // Function prototypes
330 //-----------------------------------------------------------------------------
333 * Initialize the OC Stack. Must be called prior to starting the stack.
336 * IP Address of host device
338 * Port of host device
340 * Host device is client, server, or client-server
343 * OC_STACK_OK - no errors
344 * OC_STACK_ERROR - stack init error
346 OCStackResult OCInit(const char *ipAddr, uint16_t port, OCMode mode);
349 * Stop the OC stack. Use for a controlled shutdown.
351 * Note: OCStop() performs operations similar to OCStopPresence(), as well as OCDeleteResource() on
352 * all resources this server is hosting. OCDeleteResource() performs operations similar to
353 * OCNotifyAllObservers() to notify all client observers that the respective resource is being
357 * OC_STACK_OK - no errors
358 * OC_STACK_ERROR - stack not initialized
360 OCStackResult OCStop();
363 * Called in main loop of OC client or server. Allows low-level processing of
367 * OC_STACK_OK - no errors
368 * OC_STACK_ERROR - stack process error
370 OCStackResult OCProcess();
373 * Discover or Perform requests on a specified resource (specified by that Resource's respective URI).
375 * @param handle - @ref OCDoHandle to refer to the request sent out on behalf of calling this API.
376 * @param method - @ref OCMethod to perform on the resource
377 * @param requiredUri - URI of the resource to interact with
378 * @param referenceUri - URI of the reference resource
379 * @param request - JSON encoded request
380 * @param qos - quality of service
381 * @param clientApplicationCB- asynchronous callback function that is invoked
382 * by the stack when discovery or resource interaction is complete
383 * @param options - The address of an array containing the vendor specific
384 * header options to be sent with the request
385 * @param numOptions - Number of header options to be included
388 * OC_STACK_OK - no errors
389 * OC_STACK_INVALID_CALLBACK - invalid callback function pointer
390 * OC_STACK_INVALID_METHOD - invalid resource method
391 * OC_STACK_INVALID_URI - invalid required or reference URI
393 OCStackResult OCDoResource(OCDoHandle *handle, OCMethod method, const char *requiredUri, const char *referenceUri,
394 const char *request, OCQualityOfService qos, OCCallbackData *cbData, OCHeaderOption * options,
398 * Cancel a request associated with a specific @ref OCDoResource invocation.
400 * @param handle - Used to identify a specific OCDoResource invocation.
401 * @param qos - used to specify Quality of Service (read below for more info)
402 * @param options- used to specify vendor specific header options when sending
403 * explicit observe cancellation
404 * @param numOptions- Number of header options to be included
407 * OC_STACK_OK - No errors; Success
408 * OC_STACK_INVALID_PARAM - The handle provided is invalid.
410 OCStackResult OCCancel(OCDoHandle handle, OCQualityOfService qos, OCHeaderOption * options,
415 * When operating in @ref OCServer or @ref OCClientServer mode, this API will start sending out
416 * presence notifications to clients via multicast. Once this API has been called with a success,
417 * clients may query for this server's presence and this server's stack will respond via multicast.
419 * Server can call this function when it comes online for the first time, or when it comes back
420 * online from offline mode, or when it re enters network.
422 * @param ttl - Time To Live in seconds
423 * Note: If ttl is '0', then the default stack value will be used (60 Seconds).
426 * OC_STACK_OK - No errors; Success
428 OCStackResult OCStartPresence(const uint32_t ttl);
431 * When operating in @ref OCServer or @ref OCClientServer mode, this API will stop sending out
432 * presence notifications to clients via multicast. Once this API has been called with a success,
433 * this server's stack will not respond to clients querying for this server's presence.
435 * Server can call this function when it is terminating, going offline, or when going
439 * OC_STACK_OK - No errors; Success
442 OCStackResult OCStopPresence();
447 * Set default device entity handler
449 * @param entityHandler - entity handler function that is called by ocstack to handle requests for
450 * any undefined resources or default actions.
451 * if NULL is passed it removes the device default entity handler.
454 * OC_STACK_OK - no errors
455 * OC_STACK_ERROR - stack process error
457 OCStackResult OCSetDefaultDeviceEntityHandler(OCDeviceEntityHandler entityHandler);
462 * @param handle - pointer to handle to newly created resource. Set by ocstack. Used to refer to resource
463 * @param resourceTypeName - name of resource type. Example: "core.led"
464 * @param resourceInterfaceName - name of resource interface. Example: "core.rw"
465 * @param uri - URI of the resource. Example: "/a/led"
466 * @param entityHandler - entity handler function that is called by ocstack to handle requests, etc
467 * NULL for default entity handler
468 * @param resourceProperties - properties supported by resource. Example: OC_DISCOVERABLE|OC_OBSERVABLE
471 * OC_STACK_OK - no errors
472 * OC_STACK_ERROR - stack process error
474 OCStackResult OCCreateResource(OCResourceHandle *handle,
475 const char *resourceTypeName,
476 const char *resourceInterfaceName,
478 OCEntityHandler entityHandler,
479 uint8_t resourceProperties);
482 * Create a resource. with host ip address for rsrc_t
484 * @param handle - pointer to handle to newly created resource. Set by ocstack. Used to refer to resource
485 * @param resourceTypeName - name of resource type. Example: "core.led"
486 * @param resourceInterfaceName - name of resource interface. Example: "core.rw"
487 * @param host - HOST address of the resource. Example: "coap://xxx.xxx.xxx.xxx:xxxxx"
488 * @param uri - URI of the resource. Example: "/a/led"
489 * @param entityHandler - entity handler function that is called by ocstack to handle requests, etc
490 * NULL for default entity handler
491 * @param resourceProperties - properties supported by resource. Example: OC_DISCOVERABLE|OC_OBSERVABLE
494 * OC_STACK_OK - no errors
495 * OC_STACK_ERROR - stack process error
497 OCStackResult OCCreateResourceWithHost(OCResourceHandle *handle,
498 const char *resourceTypeName,
499 const char *resourceInterfaceName,
502 OCEntityHandler entityHandler,
503 uint8_t resourceProperties);
506 * Add a resource to a collection resource.
508 * @param collectionHandle - handle to the collection resource
509 * @param resourceHandle - handle to resource to be added to the collection resource
512 * OC_STACK_OK - no errors
513 * OC_STACK_ERROR - stack process error
514 * OC_STACK_INVALID_PARAM - invalid collectionhandle
516 OCStackResult OCBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
519 * Remove a resource from a collection resource.
521 * @param collectionHandle - handle to the collection resource
522 * @param resourceHandle - handle to resource to be removed from the collection resource
525 * OC_STACK_OK - no errors
526 * OC_STACK_ERROR - stack process error
527 * OC_STACK_INVALID_PARAM - invalid collectionhandle
529 OCStackResult OCUnBindResource(OCResourceHandle collectionHandle, OCResourceHandle resourceHandle);
532 * Bind a resourcetype to a resource.
534 * @param handle - handle to the resource
535 * @param resourceTypeName - name of resource type. Example: "core.led"
538 * OC_STACK_OK - no errors
539 * OC_STACK_ERROR - stack process error
541 OCStackResult OCBindResourceTypeToResource(OCResourceHandle handle,
542 const char *resourceTypeName);
544 * Bind a resource interface to a resource.
546 * @param handle - handle to the resource
547 * @param resourceInterfaceName - name of resource interface. Example: "core.rw"
550 * OC_STACK_OK - no errors
551 * OC_STACK_ERROR - stack process error
553 OCStackResult OCBindResourceInterfaceToResource(OCResourceHandle handle,
554 const char *resourceInterfaceName);
557 * Bind an entity handler to the resource.
559 * @param handle - handle to the resource that the contained resource is to be bound
560 * @param entityHandler - entity handler function that is called by ocstack to handle requests, etc
562 * OC_STACK_OK - no errors
563 * OC_STACK_ERROR - stack process error
565 OCStackResult OCBindResourceHandler(OCResourceHandle handle, OCEntityHandler entityHandler);
568 * Get the number of resources that have been created in the stack.
570 * @param numResources - pointer to count variable
573 * OC_STACK_OK - no errors
574 * OC_STACK_ERROR - stack process error
577 OCStackResult OCGetNumberOfResources(uint8_t *numResources);
580 * Get a resource handle by index.
582 * @param index - index of resource, 0 to Count - 1
585 * Resource handle - if found
586 * NULL - if not found
588 OCResourceHandle OCGetResourceHandle(uint8_t index);
591 * Delete resource specified by handle. Deletes resource and all resourcetype and resourceinterface
594 * Note: OCDeleteResource() performs operations similar to OCNotifyAllObservers() to notify all
595 * client observers that "this" resource is being deleted.
597 * @param handle - handle of resource to be deleted
600 * OC_STACK_OK - no errors
601 * OC_STACK_ERROR - stack process error
603 OCStackResult OCDeleteResource(OCResourceHandle handle);
606 * Get the URI of the resource specified by handle.
608 * @param handle - handle of resource
610 * URI string - if resource found
611 * NULL - resource not found
613 const char *OCGetResourceUri(OCResourceHandle handle);
616 * Get the properties of the resource specified by handle.
617 * NOTE: that after a resource is created, the OC_ACTIVE property is set
618 * for the resource by the stack.
620 * @param handle - handle of resource
622 * property bitmap - if resource found
623 * NULL - resource not found
625 uint8_t OCGetResourceProperties(OCResourceHandle handle);
628 * Get the number of resource types of the resource.
630 * @param handle - handle of resource
631 * @param numResourceTypes - pointer to count variable
634 * OC_STACK_OK - no errors
635 * OC_STACK_ERROR - stack process error
637 OCStackResult OCGetNumberOfResourceTypes(OCResourceHandle handle, uint8_t *numResourceTypes);
640 * Get name of resource type of the resource.
642 * @param handle - handle of resource
643 * @param index - index of resource, 0 to Count - 1
646 * resource type name - if resource found
647 * NULL - resource not found
649 const char *OCGetResourceTypeName(OCResourceHandle handle, uint8_t index);
652 * Get the number of resource interfaces of the resource.
654 * @param handle - handle of resource
655 * @param numResources - pointer to count variable
658 * OC_STACK_OK - no errors
659 * OC_STACK_ERROR - stack process error
662 OCStackResult OCGetNumberOfResourceInterfaces(OCResourceHandle handle, uint8_t *numResourceInterfaces);
665 * Get name of resource interface of the resource.
667 * @param handle - handle of resource
668 * @param index - index of resource, 0 to Count - 1
671 * resource interface name - if resource found
672 * NULL - resource not found
674 const char *OCGetResourceInterfaceName(OCResourceHandle handle, uint8_t index);
677 * Get methods of resource interface of the resource.
679 * @param handle - handle of resource
680 * @param index - index of resource, 0 to Count - 1
683 * allowed methods - if resource found
684 * NULL - resource not found
686 uint8_t OCGetResourceInterfaceAllowedMethods(OCResourceHandle handle, uint8_t index);
689 * Get resource handle from the collection resource by index.
691 * @param collectionHandle - handle of collection resource
692 * @param index - index of contained resource, 0 to Count - 1
695 * handle to contained resource - if resource found
696 * NULL - resource not found
698 OCResourceHandle OCGetResourceHandleFromCollection(OCResourceHandle collectionHandle, uint8_t index);
701 * Get the entity handler for a resource.
703 * @param handle - handle of resource
706 * entity handler - if resource found
707 * NULL - resource not found
709 OCEntityHandler OCGetResourceHandler(OCResourceHandle handle);
712 * Notify all registered observers that the resource representation has
713 * changed. If observation includes a query the client is notified only
714 * if the query is valid after the resource representation has changed.
716 * @param handle - handle of resource
719 * OC_STACK_OK - no errors
720 * OC_STACK_NO_RESOURCE - invalid resource handle
721 * OC_STACK_NO_OBSERVERS - no more observers intrested in resource
723 OCStackResult OCNotifyAllObservers(OCResourceHandle handle, OCQualityOfService qos);
726 * Notify specific observers with updated value of representation.
727 * Before this API is invoked by entity handler it has finished processing
728 * queries for the associated observers.
730 * @param handle - handle of resource
731 * @param obsIdList - list of observation ids that need to be notified
732 * @param numberOfIds - number of observation ids included in obsIdList
733 * @param notificationJSONPayload - JSON encoded payload to send in notification
734 * NOTE: The memory for obsIdList and notificationJSONPayload is managed by the
735 * entity invoking the API. The maximum size of the notification is 1015 bytes
736 * for non-Arduino platforms. For Arduino the maximum size is 247 bytes.
739 * OC_STACK_OK - no errors
740 * OC_STACK_NO_RESOURCE - invalid resource handle
743 OCNotifyListOfObservers (OCResourceHandle handle,
744 OCObservationId *obsIdList,
746 unsigned char *notificationJSONPayload,
747 OCQualityOfService qos);
751 #endif // __cplusplus
753 #endif /* OCSTACK_H_ */