Distributed Publish Subscribe for IoT
dps.h
Go to the documentation of this file.
1 /*
2  *******************************************************************
3  *
4  * Copyright 2016 Intel Corporation All rights reserved.
5  *
6  *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21  */
22 
23 #ifndef _DPS_H
24 #define _DPS_H
25 
26 #include <stdint.h>
27 #include <stddef.h>
28 #include <uv.h>
29 #include <dps/err.h>
30 #include <dps/uuid.h>
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
36 #define A_SIZEOF(a) (sizeof(a) / sizeof((a)[0]))
37 
38 #define DPS_TRUE 1
39 #define DPS_FALSE 0
40 
44 #define DPS_MCAST_PUB_DISABLED 0
45 #define DPS_MCAST_PUB_ENABLE_SEND 1
46 #define DPS_MCAST_PUB_ENABLE_RECV 2
47 
48 
52 typedef struct _DPS_Node DPS_Node;
53 
57 typedef struct _DPS_NodeAddress DPS_NodeAddress;
58 
62 typedef struct _DPS_Subscription DPS_Subscription;
63 
72 const char* DPS_SubscriptionGetTopic(const DPS_Subscription* sub, size_t index);
73 
78 
82 typedef struct _DPS_Publication DPS_Publication;
83 
90 
99 
108 const char* DPS_PublicationGetTopic(const DPS_Publication* pub, size_t index);
109 
116 
125 
134 
136 
149 typedef DPS_Status (*DPS_ContentKeyCallback)(DPS_KeyStore* keyStore, const DPS_UUID* kid, uint8_t* key, size_t keyLen);
150 
151 typedef DPS_Status (*DPS_NetworkKeyCallback)(DPS_KeyStore* keyStore, uint8_t* buffer, size_t bufferLen, size_t* keyLen);
152 
154  /* TODO: Add version information to this exposed struct or make it opaque and add setters. */
155  void* userData;
158 };
159 
160 typedef struct _DPS_MemoryKeyStore DPS_MemoryKeyStore;
163 DPS_Status DPS_SetContentKey(DPS_MemoryKeyStore* mks, const DPS_UUID* kid, uint8_t* key, size_t keyLen);
164 DPS_Status DPS_SetNetworkKey(DPS_MemoryKeyStore* mks, uint8_t* key, size_t keyLen);
166 
176 DPS_Node* DPS_CreateNode(const char* separators, DPS_KeyStore* keyStore, const DPS_UUID* keyId);
177 
186 DPS_Status DPS_SetNodeData(DPS_Node* node, void* data);
187 
195 void* DPS_GetNodeData(const DPS_Node* node);
196 
207 DPS_Status DPS_StartNode(DPS_Node* node, int mcastPub, int listenPort);
208 
217 typedef void (*DPS_OnNodeDestroyed)(DPS_Node* node, void* data);
218 
231 
239 uv_loop_t* DPS_GetLoop(DPS_Node* node);
240 
251 typedef void (*DPS_AcknowledgementHandler)(DPS_Publication* pub, uint8_t* payload, size_t len);
252 
259 
272 
282 
290 void* DPS_GetPublicationData(const DPS_Publication* pub);
291 
309  const char** topics,
310  size_t numTopics,
311  int noWildCard,
312  const DPS_UUID* keyId,
314 
331 DPS_Status DPS_Publish(DPS_Publication* pub, const uint8_t* pubPayload, size_t len, int16_t ttl);
332 
343 
363 typedef void (*DPS_PublicationHandler)(DPS_Subscription* sub, const DPS_Publication* pub, uint8_t* payload, size_t len);
364 
375 DPS_Status DPS_AckPublication(const DPS_Publication* pub, const uint8_t* ackPayload, size_t len);
376 
385 
396 DPS_Subscription* DPS_CreateSubscription(DPS_Node* node, const char** topics, size_t numTopics);
397 
407 
416 
425 
433 
440 
449 typedef void (*DPS_OnLinkComplete)(DPS_Node* node, DPS_NodeAddress* addr, DPS_Status status, void* data);
450 
461 DPS_Status DPS_Link(DPS_Node* node, DPS_NodeAddress* addr, DPS_OnLinkComplete cb, void* data);
462 
470 typedef void (*DPS_OnUnlinkComplete)(DPS_Node* node, DPS_NodeAddress* addr, void* data);
471 
483 
489 uint16_t DPS_GetPortNumber(DPS_Node* node);
490 
498 typedef void (*DPS_OnResolveAddressComplete)(DPS_Node* node, DPS_NodeAddress* addr, void* data);
499 
511 DPS_Status DPS_ResolveAddress(DPS_Node* node, const char* host, const char* service, DPS_OnResolveAddressComplete cb, void* data);
512 
520 const char* DPS_NodeAddrToString(DPS_NodeAddress* addr);
521 
526 
535 DPS_NodeAddress* DPS_SetAddress(DPS_NodeAddress* addr, const struct sockaddr* sa);
536 
540 void DPS_CopyAddress(DPS_NodeAddress* dest, const DPS_NodeAddress* src);
541 
546 
550 uint32_t DPS_Rand();
551 
552 #ifdef __cplusplus
553 }
554 #endif
555 
556 #endif
int DPS_PublicationIsAckRequested(const DPS_Publication *pub)
Check if an acknowledgement was requested for a publication.
Type definition for a UUID.
Definition: uuid.h:36
DPS_Publication * DPS_CopyPublication(const DPS_Publication *pub)
Creates a partial copy of a publication that can be used to acknowledge the publication.
void * DPS_GetNodeData(const DPS_Node *node)
Get application data pointer previously set by DPS_SetNodeData()
void DPS_DestroyMemoryKeyStore(DPS_MemoryKeyStore *mks)
void(* DPS_OnLinkComplete)(DPS_Node *node, DPS_NodeAddress *addr, DPS_Status status, void *data)
Function prototype for function called when a DPS_Link() completes.
Definition: dps.h:449
void(* DPS_OnUnlinkComplete)(DPS_Node *node, DPS_NodeAddress *addr, void *data)
Function prototype for function called when a DPS_Unlink() completes.
Definition: dps.h:470
DPS_Node * DPS_SubscriptionGetNode(const DPS_Subscription *sub)
Get the local node associated with a subscription.
DPS_Status DPS_SetNodeData(DPS_Node *node, void *data)
Store a pointer to application data in a node.
DPS_Status DPS_StartNode(DPS_Node *node, int mcastPub, int listenPort)
Initialized and starts running a local node.
DPS_Status DPS_DestroyPublication(DPS_Publication *pub)
Delete a publication and frees any resources allocated.
uint16_t DPS_GetPortNumber(DPS_Node *node)
Get the port number this node is listening for connections on.
void(* DPS_OnResolveAddressComplete)(DPS_Node *node, DPS_NodeAddress *addr, void *data)
Function prototype for function called when a DPS_ResolveAddress() completes.
Definition: dps.h:498
DPS_NodeAddress * DPS_SetAddress(DPS_NodeAddress *addr, const struct sockaddr *sa)
Set a node address.
DPS_Publication * DPS_CreatePublication(DPS_Node *node)
Allocates storage for a publication.
DPS_Status DPS_ResolveAddress(DPS_Node *node, const char *host, const char *service, DPS_OnResolveAddressComplete cb, void *data)
Resolve a host name or IP address and service name or port number.
void DPS_DestroyAddress(DPS_NodeAddress *addr)
Frees resources associated with an address.
void * userData
Definition: dps.h:155
int DPS_Status
Definition: err.h:30
DPS_MemoryKeyStore * DPS_CreateMemoryKeyStore()
size_t DPS_PublicationGetNumTopics(const DPS_Publication *pub)
Get the number of topics in a publication.
void * DPS_GetPublicationData(const DPS_Publication *pub)
Get application data pointer previously set by DPS_SetPublicationData()
size_t DPS_SubscriptionGetNumTopics(const DPS_Subscription *sub)
Get the number of topics registered with an active subscription.
DPS_Node * DPS_CreateNode(const char *separators, DPS_KeyStore *keyStore, const DPS_UUID *keyId)
Allocates space for a local DPS node.
void(* DPS_OnNodeDestroyed)(DPS_Node *node, void *data)
Function prototype for callback function called when a node is destroyed.
Definition: dps.h:217
uint32_t DPS_Rand()
Returns a non-secure random number.
void * DPS_GetSubscriptionData(DPS_Subscription *sub)
Get application data pointer previously set by DPS_SetSubscriptionData()
struct _DPS_NodeAddress DPS_NodeAddress
Opaque type for a remote node address.
Definition: dps.h:57
DPS_Status DPS_Link(DPS_Node *node, DPS_NodeAddress *addr, DPS_OnLinkComplete cb, void *data)
Link the local node to a remote node.
const DPS_UUID * DPS_PublicationGetUUID(const DPS_Publication *pub)
Get the UUID for a publication.
DPS_Status DPS_SetSubscriptionData(DPS_Subscription *sub, void *data)
Store a pointer to application data in a subscription.
DPS_Status DPS_SetContentKey(DPS_MemoryKeyStore *mks, const DPS_UUID *kid, uint8_t *key, size_t keyLen)
DPS_Status DPS_DestroySubscription(DPS_Subscription *sub)
Stop subscribing to the subscription topic and free resources allocated for the subscription.
DPS_Status DPS_DestroyNode(DPS_Node *node, DPS_OnNodeDestroyed cb, void *data)
Destroys a node and free any resources.
uint32_t DPS_PublicationGetSequenceNum(const DPS_Publication *pub)
Get the sequence number for a publication.
DPS_Node * DPS_GetPublicationNode(const DPS_Publication *pub)
Get the local node associated with a publication.
struct _DPS_Publication DPS_Publication
Opaque type for a publication.
Definition: dps.h:82
DPS_NetworkKeyCallback networkKeyCB
Definition: dps.h:157
DPS_Status(* DPS_ContentKeyCallback)(DPS_KeyStore *keyStore, const DPS_UUID *kid, uint8_t *key, size_t keyLen)
Function prototype for callback function for requesting the encryption key for a specific key identif...
Definition: dps.h:149
const char * DPS_PublicationGetTopic(const DPS_Publication *pub, size_t index)
Get a topic for a publication.
uv_loop_t * DPS_GetLoop(DPS_Node *node)
Get the uv event loop for this node.
DPS_Status DPS_AckPublication(const DPS_Publication *pub, const uint8_t *ackPayload, size_t len)
Aknowledge a publication.
DPS_Status DPS_SetNetworkKey(DPS_MemoryKeyStore *mks, uint8_t *key, size_t keyLen)
DPS_Node * DPS_PublicationGetNode(const DPS_Publication *pub)
Get the local node associated with a publication.
DPS_KeyStore * DPS_MemoryKeyStoreHandle(DPS_MemoryKeyStore *mks)
DPS_Status DPS_Unlink(DPS_Node *node, DPS_NodeAddress *addr, DPS_OnUnlinkComplete cb, void *data)
Unlink the local node from a remote node.
DPS_NodeAddress * DPS_CreateAddress()
Creates an node address.
DPS_Status DPS_SetPublicationData(DPS_Publication *pub, void *data)
Store a pointer to application data in a publication.
Definition: dps.h:153
DPS_Status DPS_Subscribe(DPS_Subscription *sub, DPS_PublicationHandler handler)
Start subscribing to a set of topics.
struct _DPS_Node DPS_Node
Opaque type for a node.
Definition: dps.h:52
void(* DPS_PublicationHandler)(DPS_Subscription *sub, const DPS_Publication *pub, uint8_t *payload, size_t len)
Function prototype for a publication handler called when a publication is received that matches a sub...
Definition: dps.h:363
void DPS_CopyAddress(DPS_NodeAddress *dest, const DPS_NodeAddress *src)
Copy a node address.
DPS_ContentKeyCallback contentKeyCB
Definition: dps.h:156
const char * DPS_NodeAddrToString(DPS_NodeAddress *addr)
Get text representation of an address.
DPS_Status(* DPS_NetworkKeyCallback)(DPS_KeyStore *keyStore, uint8_t *buffer, size_t bufferLen, size_t *keyLen)
Definition: dps.h:151
struct _DPS_Subscription DPS_Subscription
Opaque type for a subscription.
Definition: dps.h:62
DPS_Status DPS_Publish(DPS_Publication *pub, const uint8_t *pubPayload, size_t len, int16_t ttl)
Publish a set of topics along with an optional payload.
DPS_Status DPS_InitPublication(DPS_Publication *pub, const char **topics, size_t numTopics, int noWildCard, const DPS_UUID *keyId, DPS_AcknowledgementHandler handler)
Initializes a newly created publication with a set of topics.
void(* DPS_AcknowledgementHandler)(DPS_Publication *pub, uint8_t *payload, size_t len)
Function prototype for a publication acknowledgment handler called when an acknowledgement for a publ...
Definition: dps.h:251
const char * DPS_SubscriptionGetTopic(const DPS_Subscription *sub, size_t index)
Get a topic for an active subscription.
DPS_Subscription * DPS_CreateSubscription(DPS_Node *node, const char **topics, size_t numTopics)
Allocate memory for a subscription and initialize topics.
struct _DPS_MemoryKeyStore DPS_MemoryKeyStore
Definition: dps.h:160