Initial merge-commit of the OIC code. Should successfully do discovery for single...
[platform/upstream/iotivity.git] / csdk / stack / samples / SimpleClientServer / ocserver.cpp
1 //******************************************************************
2 //
3 // Copyright 2014 Intel Corporation All Rights Reserved.
4 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
5
6
7 #include <stdio.h>
8 #include <string.h>
9 #include <stdlib.h>
10 #include <unistd.h>
11 #include <signal.h>
12 #include <ocstack.h>
13
14 static const char * LEVEL[] __attribute__ ((unused)) = {"DEBUG", "INFO", "WARNING", "ERROR", "FATAL"};
15 char *getResult(OCStackResult result);
16 void printToScreen(LogLevel level, const char * tag, const char * logStr);
17 void printToScreenV(LogLevel level,  const char * tag, const char * format, ...);
18
19 #define TAG PCF("ocserver")
20
21 int gQuitFlag = 0;
22 void createLEDResource();
23 typedef struct LEDRESOURCE{
24         OCResourceHandle handle;
25         bool power;
26 } LEDResource;
27
28 static LEDResource LED;
29
30 void MyOCEntityHandler (OCEntityHandlerFlag flag, const char *request, char *response, uint16_t maxResponseSize, OCResourceHandle resource) {
31         char* typeOfMessage;
32         switch (flag) {
33                 case OC_INIT_FLAG:
34                         typeOfMessage = "OC_INIT_FLAG";
35                         break;
36                 case OC_REQUEST_FLAG:
37                         typeOfMessage = "OC_REQUEST_FLAG";
38                         break;
39                 case OC_OBSERVE_FLAG:
40                         typeOfMessage = "OC_OBSERVE_FLAG";
41                         break;
42                 default:
43                         typeOfMessage = "UNKNOWN";
44         }
45         printToScreenV(INFO, TAG, "/nReceiving message type:/n/t %s. /n/nWith request:/n/t %s", typeOfMessage, request);
46 }
47
48 /* SIGINT handler: set gQuitFlag to 1 for graceful termination */
49 void handleSigInt(int signum) {
50     if (signum == SIGINT) {
51         gQuitFlag = 1;
52     }
53 }
54
55 int main() {
56         printToScreen(DEBUG, TAG, "OCServer is starting...");
57         LED = {0};
58     uint8_t addr[20] = {0};
59     uint16_t port = USE_RANDOM_PORT;
60     uint8_t ifname[] = "eth0";
61
62     /*Get Ip address on defined interface and initialize coap on it with random port number
63      * this port number will be used as a source port in all coap communications*/
64     OCGetInterfaceAddress(ifname, sizeof(ifname), AF_INET, addr, sizeof(addr));
65
66     printToScreenV(INFO, TAG, "Starting ocserver on address %s:%d",addr,port);
67     if (OCInit((char *) addr, port, OC_SERVER) != OC_STACK_OK) {
68         printToScreen(ERROR, TAG, "OCStack init error");
69         return 0;
70     }
71
72         /*
73          * Declare and create the example resource: LED
74          */
75     createLEDResource();
76
77     // Break from loop with Ctrl-C
78     printToScreen(INFO, TAG, "Entering ocserver main loop...");
79     signal(SIGINT, handleSigInt);
80     while (!gQuitFlag) {
81         if (OCProcess() != OC_STACK_OK) {
82             printToScreen(ERROR, TAG, "OCStack process error");
83             return 0;
84         }
85         sleep(1);
86     }
87
88    printToScreen(INFO, TAG, "Exiting ocserver main loop...");
89
90     if (OCStop() != OC_STACK_OK) {
91         printToScreen(ERROR, TAG, "OCStack process error");
92     }
93
94     return 0;
95 }
96 void createLEDResource() {
97         LED.power = false;
98         OCStackResult res = OCCreateResource(&LED.handle,
99                                         "core.led",
100                                         "state:oc.bt.b;power:oc.bt.i",
101                                         "core.rw",
102                                         OC_REST_GET|OC_REST_PUT,
103                                         "/a/led",
104                                         0,
105                                         OC_DISCOVERABLE|OC_OBSERVABLE);
106         printToScreenV(INFO, TAG, "Created LED resource with result: %s", getResult(res));
107 }
108 char *getResult(OCStackResult result) {
109         char resString[40] = {0};
110         strcpy(resString, "Result: ");
111         switch(result) {
112                 case OC_STACK_OK:
113                         strcat(resString, "OC_STACK_OK");
114                         break;
115                 case OC_STACK_INVALID_URI:
116                         strcat(resString, "OC_STACK_INVALID_URI");
117                         break;
118                 case OC_STACK_INVALID_IP:
119                         strcat(resString, "OC_STACK_INVALID_IP");
120                         break;
121                 case OC_STACK_INVALID_PORT:
122                         strcat(resString, "OC_STACK_INVALID_PORT");
123                         break;
124                 case OC_STACK_INVALID_CALLBACK:
125                         strcat(resString, "OC_STACK_INVALID_CALLBACK");
126                         break;
127                 case OC_STACK_INVALID_METHOD:
128                         strcat(resString, "OC_STACK_INVALID_METHOD");
129                         break;
130                 case OC_STACK_ERROR:
131                         strcat(resString, "OC_STACK_ERROR");
132                         break;
133                 default:
134                         strcat(resString, "UNKNOWN");
135         }
136         return resString;
137 }
138 void printToScreen(LogLevel level, const char * tag, const char * logStr) {
139         printf("%s: %s: %s\n", LEVEL[level], tag, logStr);
140 }
141 void printToScreenV(LogLevel level,  const char * tag, const char * format, ...) {
142         if (!format || !tag) {
143                 return;
144             }
145             char buffer[MAX_LOG_V_BUFFER_SIZE];
146             memset(buffer, 0, sizeof buffer);
147             va_list args;
148             va_start(args, format);
149             vsnprintf(buffer, sizeof buffer - 1, format, args);
150             va_end(args);
151             printToScreen(level, tag, buffer);
152 }
153