Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@16:31c387e94b6d, 2017-05-11 (annotated)
- Committer:
- terencez
- Date:
- Thu May 11 12:40:25 2017 +0000
- Revision:
- 16:31c387e94b6d
- Parent:
- 15:d0f20339c1ad
Added a demo temperature object based on sensor LM75B.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
terencez | 0:f9d13e09cf11 | 1 | #include "mbed.h" |
terencez | 0:f9d13e09cf11 | 2 | #include "C12832.h" |
terencez | 0:f9d13e09cf11 | 3 | #include "LM75B.h" |
terencez | 14:ec9e195830ff | 4 | #include "EthernetInterface.h" |
terencez | 14:ec9e195830ff | 5 | |
terencez | 0:f9d13e09cf11 | 6 | extern "C" { |
terencez | 0:f9d13e09cf11 | 7 | #include "liblwm2m.h" |
terencez | 14:ec9e195830ff | 8 | //External API |
terencez | 16:31c387e94b6d | 9 | extern lwm2m_object_t * get_object_device(void); |
terencez | 16:31c387e94b6d | 10 | extern void free_object_device(lwm2m_object_t * objectP); |
terencez | 16:31c387e94b6d | 11 | extern lwm2m_object_t * get_server_object(void); |
terencez | 16:31c387e94b6d | 12 | extern void free_server_object(lwm2m_object_t * object); |
terencez | 16:31c387e94b6d | 13 | extern lwm2m_object_t * get_security_object(void); |
terencez | 16:31c387e94b6d | 14 | extern void free_security_object(lwm2m_object_t * objectP); |
terencez | 16:31c387e94b6d | 15 | extern char * get_server_uri(lwm2m_object_t * objectP, uint16_t secObjInstID); |
terencez | 16:31c387e94b6d | 16 | } |
terencez | 16:31c387e94b6d | 17 | #ifdef ENABLE_RGB_LED |
terencez | 16:31c387e94b6d | 18 | lwm2m_object_t * get_object_rgb_led(void); |
terencez | 14:ec9e195830ff | 19 | #endif |
terencez | 16:31c387e94b6d | 20 | lwm2m_object_t * get_object_temperature(void); |
terencez | 0:f9d13e09cf11 | 21 | |
terencez | 0:f9d13e09cf11 | 22 | //Global definitions |
terencez | 0:f9d13e09cf11 | 23 | #define ENDPOINT_NAME "MBED-OS-EXAMPLE-WAKAAMA" |
terencez | 1:3549d3c3967c | 24 | //Connect to the Leshan test server as default: http://leshan.eclipse.org |
terencez | 1:3549d3c3967c | 25 | #define LESHAN_SERVER "5.39.83.206" |
terencez | 0:f9d13e09cf11 | 26 | #define LESHAN_PORT 5683 |
terencez | 1:3549d3c3967c | 27 | #define UDP_TIMEOUT 60000 |
terencez | 15:d0f20339c1ad | 28 | #define UDP_PORT 5683 |
terencez | 16:31c387e94b6d | 29 | |
terencez | 16:31c387e94b6d | 30 | #ifdef ENABLE_RGB_LED |
terencez | 16:31c387e94b6d | 31 | #define DEVICE_OBJ_NUM 5 |
terencez | 16:31c387e94b6d | 32 | #else |
terencez | 14:ec9e195830ff | 33 | #define DEVICE_OBJ_NUM 4 |
terencez | 16:31c387e94b6d | 34 | #endif |
terencez | 15:d0f20339c1ad | 35 | #define LOCAL_PORT 5683 |
terencez | 14:ec9e195830ff | 36 | |
terencez | 0:f9d13e09cf11 | 37 | // LCD 128X32 |
terencez | 0:f9d13e09cf11 | 38 | C12832 lcd(p5, p7, p6, p8, p11); |
terencez | 0:f9d13e09cf11 | 39 | // Sensor of temperature |
terencez | 0:f9d13e09cf11 | 40 | LM75B sensor_temp(p28,p27); |
terencez | 0:f9d13e09cf11 | 41 | // Network interface |
terencez | 0:f9d13e09cf11 | 42 | EthernetInterface eth; |
terencez | 0:f9d13e09cf11 | 43 | // UDP Socket |
terencez | 0:f9d13e09cf11 | 44 | UDPSocket udp; |
terencez | 0:f9d13e09cf11 | 45 | |
terencez | 14:ec9e195830ff | 46 | typedef struct |
terencez | 14:ec9e195830ff | 47 | { |
terencez | 14:ec9e195830ff | 48 | lwm2m_object_t * securityObjP; |
terencez | 14:ec9e195830ff | 49 | UDPSocket sock; |
terencez | 14:ec9e195830ff | 50 | /*connection_t * connList;*/ |
terencez | 14:ec9e195830ff | 51 | } client_data_t; |
terencez | 0:f9d13e09cf11 | 52 | |
terencez | 14:ec9e195830ff | 53 | //Functions |
terencez | 14:ec9e195830ff | 54 | void print_state(lwm2m_context_t * lwm2mH) |
terencez | 14:ec9e195830ff | 55 | { |
terencez | 14:ec9e195830ff | 56 | lwm2m_server_t * targetP; |
terencez | 14:ec9e195830ff | 57 | |
terencez | 14:ec9e195830ff | 58 | fprintf(stderr, "State: "); |
terencez | 14:ec9e195830ff | 59 | switch(lwm2mH->state) |
terencez | 14:ec9e195830ff | 60 | { |
terencez | 14:ec9e195830ff | 61 | case STATE_INITIAL: |
terencez | 14:ec9e195830ff | 62 | fprintf(stderr, "STATE_INITIAL"); |
terencez | 14:ec9e195830ff | 63 | break; |
terencez | 14:ec9e195830ff | 64 | case STATE_BOOTSTRAP_REQUIRED: |
terencez | 14:ec9e195830ff | 65 | fprintf(stderr, "STATE_BOOTSTRAP_REQUIRED"); |
terencez | 14:ec9e195830ff | 66 | break; |
terencez | 14:ec9e195830ff | 67 | case STATE_BOOTSTRAPPING: |
terencez | 14:ec9e195830ff | 68 | fprintf(stderr, "STATE_BOOTSTRAPPING"); |
terencez | 14:ec9e195830ff | 69 | break; |
terencez | 14:ec9e195830ff | 70 | case STATE_REGISTER_REQUIRED: |
terencez | 14:ec9e195830ff | 71 | fprintf(stderr, "STATE_REGISTER_REQUIRED"); |
terencez | 14:ec9e195830ff | 72 | break; |
terencez | 14:ec9e195830ff | 73 | case STATE_REGISTERING: |
terencez | 14:ec9e195830ff | 74 | fprintf(stderr, "STATE_REGISTERING"); |
terencez | 14:ec9e195830ff | 75 | break; |
terencez | 14:ec9e195830ff | 76 | case STATE_READY: |
terencez | 14:ec9e195830ff | 77 | fprintf(stderr, "STATE_READY"); |
terencez | 14:ec9e195830ff | 78 | break; |
terencez | 14:ec9e195830ff | 79 | default: |
terencez | 14:ec9e195830ff | 80 | fprintf(stderr, "Unknown !"); |
terencez | 14:ec9e195830ff | 81 | break; |
terencez | 14:ec9e195830ff | 82 | } |
terencez | 14:ec9e195830ff | 83 | fprintf(stderr, "\r\n"); |
terencez | 14:ec9e195830ff | 84 | |
terencez | 14:ec9e195830ff | 85 | targetP = lwm2mH->bootstrapServerList; |
terencez | 14:ec9e195830ff | 86 | |
terencez | 14:ec9e195830ff | 87 | if (lwm2mH->bootstrapServerList == NULL) |
terencez | 14:ec9e195830ff | 88 | { |
terencez | 14:ec9e195830ff | 89 | fprintf(stderr, "No Bootstrap Server.\r\n"); |
terencez | 14:ec9e195830ff | 90 | } |
terencez | 14:ec9e195830ff | 91 | else |
terencez | 14:ec9e195830ff | 92 | { |
terencez | 14:ec9e195830ff | 93 | fprintf(stderr, "Bootstrap Servers:\r\n"); |
terencez | 14:ec9e195830ff | 94 | for (targetP = lwm2mH->bootstrapServerList ; targetP != NULL ; targetP = targetP->next) |
terencez | 14:ec9e195830ff | 95 | { |
terencez | 14:ec9e195830ff | 96 | fprintf(stderr, " - Security Object ID %d", targetP->secObjInstID); |
terencez | 14:ec9e195830ff | 97 | fprintf(stderr, "\tHold Off Time: %lu s", (unsigned long)targetP->lifetime); |
terencez | 14:ec9e195830ff | 98 | fprintf(stderr, "\tstatus: "); |
terencez | 14:ec9e195830ff | 99 | switch(targetP->status) |
terencez | 14:ec9e195830ff | 100 | { |
terencez | 14:ec9e195830ff | 101 | case STATE_DEREGISTERED: |
terencez | 14:ec9e195830ff | 102 | fprintf(stderr, "DEREGISTERED\r\n"); |
terencez | 14:ec9e195830ff | 103 | break; |
terencez | 14:ec9e195830ff | 104 | case STATE_BS_HOLD_OFF: |
terencez | 14:ec9e195830ff | 105 | fprintf(stderr, "CLIENT HOLD OFF\r\n"); |
terencez | 14:ec9e195830ff | 106 | break; |
terencez | 14:ec9e195830ff | 107 | case STATE_BS_INITIATED: |
terencez | 14:ec9e195830ff | 108 | fprintf(stderr, "BOOTSTRAP INITIATED\r\n"); |
terencez | 14:ec9e195830ff | 109 | break; |
terencez | 14:ec9e195830ff | 110 | case STATE_BS_PENDING: |
terencez | 14:ec9e195830ff | 111 | fprintf(stderr, "BOOTSTRAP PENDING\r\n"); |
terencez | 14:ec9e195830ff | 112 | break; |
terencez | 14:ec9e195830ff | 113 | case STATE_BS_FINISHED: |
terencez | 14:ec9e195830ff | 114 | fprintf(stderr, "BOOTSTRAP FINISHED\r\n"); |
terencez | 14:ec9e195830ff | 115 | break; |
terencez | 14:ec9e195830ff | 116 | case STATE_BS_FAILED: |
terencez | 14:ec9e195830ff | 117 | fprintf(stderr, "BOOTSTRAP FAILED\r\n"); |
terencez | 14:ec9e195830ff | 118 | break; |
terencez | 14:ec9e195830ff | 119 | default: |
terencez | 14:ec9e195830ff | 120 | fprintf(stderr, "INVALID (%d)\r\n", (int)targetP->status); |
terencez | 14:ec9e195830ff | 121 | } |
terencez | 14:ec9e195830ff | 122 | fprintf(stderr, "\r\n"); |
terencez | 14:ec9e195830ff | 123 | } |
terencez | 14:ec9e195830ff | 124 | } |
terencez | 14:ec9e195830ff | 125 | |
terencez | 14:ec9e195830ff | 126 | if (lwm2mH->serverList == NULL) |
terencez | 14:ec9e195830ff | 127 | { |
terencez | 14:ec9e195830ff | 128 | fprintf(stderr, "No LWM2M Server.\r\n"); |
terencez | 14:ec9e195830ff | 129 | } |
terencez | 14:ec9e195830ff | 130 | else |
terencez | 14:ec9e195830ff | 131 | { |
terencez | 14:ec9e195830ff | 132 | fprintf(stderr, "LWM2M Servers:\r\n"); |
terencez | 14:ec9e195830ff | 133 | for (targetP = lwm2mH->serverList ; targetP != NULL ; targetP = targetP->next) |
terencez | 14:ec9e195830ff | 134 | { |
terencez | 14:ec9e195830ff | 135 | fprintf(stderr, " - Server ID %d", targetP->shortID); |
terencez | 14:ec9e195830ff | 136 | fprintf(stderr, "\tstatus: "); |
terencez | 14:ec9e195830ff | 137 | switch(targetP->status) |
terencez | 14:ec9e195830ff | 138 | { |
terencez | 14:ec9e195830ff | 139 | case STATE_DEREGISTERED: |
terencez | 14:ec9e195830ff | 140 | fprintf(stderr, "DEREGISTERED\r\n"); |
terencez | 14:ec9e195830ff | 141 | break; |
terencez | 14:ec9e195830ff | 142 | case STATE_REG_PENDING: |
terencez | 14:ec9e195830ff | 143 | fprintf(stderr, "REGISTRATION PENDING\r\n"); |
terencez | 14:ec9e195830ff | 144 | break; |
terencez | 14:ec9e195830ff | 145 | case STATE_REGISTERED: |
terencez | 14:ec9e195830ff | 146 | fprintf(stderr, "REGISTERED\tlocation: \"%s\"\tLifetime: %lus\r\n", targetP->location, (unsigned long)targetP->lifetime); |
terencez | 14:ec9e195830ff | 147 | break; |
terencez | 14:ec9e195830ff | 148 | case STATE_REG_UPDATE_PENDING: |
terencez | 14:ec9e195830ff | 149 | fprintf(stderr, "REGISTRATION UPDATE PENDING\r\n"); |
terencez | 14:ec9e195830ff | 150 | break; |
terencez | 14:ec9e195830ff | 151 | case STATE_REG_UPDATE_NEEDED: |
terencez | 14:ec9e195830ff | 152 | fprintf(stderr, "REGISTRATION UPDATE REQUIRED\r\n"); |
terencez | 14:ec9e195830ff | 153 | break; |
terencez | 14:ec9e195830ff | 154 | case STATE_DEREG_PENDING: |
terencez | 14:ec9e195830ff | 155 | fprintf(stderr, "DEREGISTRATION PENDING\r\n"); |
terencez | 14:ec9e195830ff | 156 | break; |
terencez | 14:ec9e195830ff | 157 | case STATE_REG_FAILED: |
terencez | 14:ec9e195830ff | 158 | fprintf(stderr, "REGISTRATION FAILED\r\n"); |
terencez | 14:ec9e195830ff | 159 | break; |
terencez | 14:ec9e195830ff | 160 | default: |
terencez | 14:ec9e195830ff | 161 | fprintf(stderr, "INVALID (%d)\r\n", (int)targetP->status); |
terencez | 14:ec9e195830ff | 162 | } |
terencez | 14:ec9e195830ff | 163 | fprintf(stderr, "\r\n"); |
terencez | 14:ec9e195830ff | 164 | } |
terencez | 14:ec9e195830ff | 165 | } |
terencez | 0:f9d13e09cf11 | 166 | } |
terencez | 0:f9d13e09cf11 | 167 | |
terencez | 14:ec9e195830ff | 168 | void debug_dump(uint8_t * buffer, size_t length) |
terencez | 14:ec9e195830ff | 169 | { |
terencez | 14:ec9e195830ff | 170 | int i; |
terencez | 14:ec9e195830ff | 171 | printf("\n--------------------------\n"); |
terencez | 14:ec9e195830ff | 172 | for(i=0;i<length;i++){ |
terencez | 14:ec9e195830ff | 173 | printf("0x%2x ",buffer[i]); |
terencez | 14:ec9e195830ff | 174 | if(i%16==15)printf("\n"); |
terencez | 14:ec9e195830ff | 175 | } |
terencez | 14:ec9e195830ff | 176 | printf("\n--------------------------\n"); |
terencez | 14:ec9e195830ff | 177 | } |
terencez | 1:3549d3c3967c | 178 | void test_tcp(EthernetInterface eth) |
terencez | 1:3549d3c3967c | 179 | { |
terencez | 1:3549d3c3967c | 180 | TCPSocket tcp; |
terencez | 1:3549d3c3967c | 181 | tcp.open(ð); |
terencez | 1:3549d3c3967c | 182 | tcp.connect("developer.mbed.org", 80); |
terencez | 1:3549d3c3967c | 183 | |
terencez | 1:3549d3c3967c | 184 | // Send a simple http request |
terencez | 1:3549d3c3967c | 185 | char sbuffer[] = "GET / HTTP/1.1\r\nHost: developer.mbed.org\r\n\r\n"; |
terencez | 1:3549d3c3967c | 186 | int scount = tcp.send(sbuffer, sizeof sbuffer); |
terencez | 1:3549d3c3967c | 187 | |
terencez | 1:3549d3c3967c | 188 | lcd.cls(); |
terencez | 1:3549d3c3967c | 189 | lcd.locate(0,0); |
terencez | 1:3549d3c3967c | 190 | lcd.printf("TCP TESTING: "); |
terencez | 1:3549d3c3967c | 191 | lcd.printf("SEND %d\n[%.*s]\n", scount, strstr(sbuffer, "\r\n")-sbuffer, sbuffer); |
terencez | 1:3549d3c3967c | 192 | wait(3.0); |
terencez | 1:3549d3c3967c | 193 | |
terencez | 1:3549d3c3967c | 194 | // Recieve a simple http response and print out the response line |
terencez | 1:3549d3c3967c | 195 | char rbuffer[64]; |
terencez | 1:3549d3c3967c | 196 | int rcount = tcp.recv(rbuffer, sizeof rbuffer); |
terencez | 1:3549d3c3967c | 197 | lcd.cls(); |
terencez | 1:3549d3c3967c | 198 | lcd.locate(0,0); |
terencez | 1:3549d3c3967c | 199 | lcd.printf("TCP TESTING: "); |
terencez | 1:3549d3c3967c | 200 | lcd.printf("RECV %d\n[%.*s]\n", rcount, strstr(rbuffer, "\r\n")-rbuffer, rbuffer); |
terencez | 1:3549d3c3967c | 201 | wait(3.0); |
terencez | 1:3549d3c3967c | 202 | lcd.cls(); |
terencez | 1:3549d3c3967c | 203 | // Close the socket to return its memory and bring down the network interface |
terencez | 1:3549d3c3967c | 204 | tcp.close(); |
terencez | 1:3549d3c3967c | 205 | } |
terencez | 1:3549d3c3967c | 206 | |
terencez | 0:f9d13e09cf11 | 207 | |
terencez | 14:ec9e195830ff | 208 | int init_network() |
terencez | 0:f9d13e09cf11 | 209 | { |
terencez | 0:f9d13e09cf11 | 210 | int ret = 0; |
terencez | 0:f9d13e09cf11 | 211 | |
terencez | 2:5a8853c481ad | 212 | //try to connect and get ip via DHCP. |
terencez | 0:f9d13e09cf11 | 213 | lcd.locate(0,10); |
terencez | 0:f9d13e09cf11 | 214 | lcd.printf("obtaining ip address...\n"); |
terencez | 0:f9d13e09cf11 | 215 | ret = eth.connect(); |
terencez | 0:f9d13e09cf11 | 216 | if(ret!=0){ |
terencez | 0:f9d13e09cf11 | 217 | lcd.printf("DHCP Error - No IP"); |
terencez | 0:f9d13e09cf11 | 218 | return ret; |
terencez | 0:f9d13e09cf11 | 219 | } |
terencez | 0:f9d13e09cf11 | 220 | lcd.printf("IP is %s\n", eth.get_ip_address()); |
terencez | 0:f9d13e09cf11 | 221 | //wait(2.0); |
terencez | 0:f9d13e09cf11 | 222 | |
terencez | 2:5a8853c481ad | 223 | //test code which only used to verify the connect functinon |
terencez | 1:3549d3c3967c | 224 | //test_tcp(eth); |
terencez | 1:3549d3c3967c | 225 | //test_udp(eth); |
terencez | 0:f9d13e09cf11 | 226 | |
terencez | 14:ec9e195830ff | 227 | udp.open(ð); |
terencez | 15:d0f20339c1ad | 228 | //udp.set_timeout(UDP_TIMEOUT); |
terencez | 14:ec9e195830ff | 229 | udp.bind(UDP_PORT); |
terencez | 0:f9d13e09cf11 | 230 | |
terencez | 0:f9d13e09cf11 | 231 | return ret; |
terencez | 0:f9d13e09cf11 | 232 | } |
terencez | 0:f9d13e09cf11 | 233 | |
terencez | 0:f9d13e09cf11 | 234 | int init_display() |
terencez | 0:f9d13e09cf11 | 235 | { |
terencez | 2:5a8853c481ad | 236 | int ret = 0; |
terencez | 2:5a8853c481ad | 237 | //Bootup and display initial information |
terencez | 0:f9d13e09cf11 | 238 | lcd.cls(); |
terencez | 0:f9d13e09cf11 | 239 | lcd.locate(0,0); |
terencez | 0:f9d13e09cf11 | 240 | lcd.printf("mbed-wakaama-example"); |
terencez | 0:f9d13e09cf11 | 241 | lcd.locate(0,10); |
terencez | 0:f9d13e09cf11 | 242 | lcd.printf("starting..."); |
terencez | 1:3549d3c3967c | 243 | //wait(2.0); |
terencez | 0:f9d13e09cf11 | 244 | |
terencez | 2:5a8853c481ad | 245 | return ret; |
terencez | 0:f9d13e09cf11 | 246 | } |
terencez | 0:f9d13e09cf11 | 247 | |
terencez | 0:f9d13e09cf11 | 248 | |
terencez | 14:ec9e195830ff | 249 | coap_status_t lwm2m_buffer_send(void * sessionH,uint8_t * buffer,size_t length,void * userdata) |
terencez | 0:f9d13e09cf11 | 250 | { |
terencez | 2:5a8853c481ad | 251 | int ret = 0; |
terencez | 2:5a8853c481ad | 252 | |
terencez | 0:f9d13e09cf11 | 253 | SocketAddress * addr = (SocketAddress*) sessionH; |
terencez | 0:f9d13e09cf11 | 254 | |
terencez | 1:3549d3c3967c | 255 | printf("Send packet to: %s of port %d, size: %d\n", addr->get_ip_address(), addr->get_port(),length); |
terencez | 2:5a8853c481ad | 256 | //debug_dump(buffer,length); |
terencez | 0:f9d13e09cf11 | 257 | |
terencez | 2:5a8853c481ad | 258 | ret = udp.sendto(addr->get_ip_address(), addr->get_port(), (void *)buffer, (int)length); |
terencez | 15:d0f20339c1ad | 259 | if(ret!=length) |
terencez | 0:f9d13e09cf11 | 260 | { |
terencez | 1:3549d3c3967c | 261 | return COAP_500_INTERNAL_SERVER_ERROR; |
terencez | 0:f9d13e09cf11 | 262 | } |
terencez | 14:ec9e195830ff | 263 | |
terencez | 0:f9d13e09cf11 | 264 | return COAP_NO_ERROR; |
terencez | 0:f9d13e09cf11 | 265 | } |
terencez | 0:f9d13e09cf11 | 266 | |
terencez | 16:31c387e94b6d | 267 | void get_temperature(float *temp) |
terencez | 16:31c387e94b6d | 268 | { |
terencez | 16:31c387e94b6d | 269 | *temp = sensor_temp.read(); |
terencez | 16:31c387e94b6d | 270 | printf("SYSTEM TEMP: %.3f",*temp); |
terencez | 16:31c387e94b6d | 271 | } |
terencez | 14:ec9e195830ff | 272 | |
terencez | 0:f9d13e09cf11 | 273 | int main() |
terencez | 0:f9d13e09cf11 | 274 | { |
terencez | 14:ec9e195830ff | 275 | int result = 0; |
terencez | 14:ec9e195830ff | 276 | uint8_t buffer[1024]; |
terencez | 2:5a8853c481ad | 277 | |
terencez | 14:ec9e195830ff | 278 | //Init the lwm2m structures |
terencez | 0:f9d13e09cf11 | 279 | lwm2m_context_t * lwm2mH = NULL; |
terencez | 14:ec9e195830ff | 280 | lwm2m_object_t * objArray[DEVICE_OBJ_NUM]; |
terencez | 0:f9d13e09cf11 | 281 | lwm2m_security_t security; |
terencez | 14:ec9e195830ff | 282 | client_data_t data; |
terencez | 14:ec9e195830ff | 283 | data.sock = udp; |
terencez | 14:ec9e195830ff | 284 | |
terencez | 2:5a8853c481ad | 285 | //Init the lwm2m server, set Leshan as default |
terencez | 0:f9d13e09cf11 | 286 | SocketAddress server(LESHAN_SERVER, LESHAN_PORT); |
terencez | 2:5a8853c481ad | 287 | SocketAddress client; |
terencez | 14:ec9e195830ff | 288 | |
terencez | 2:5a8853c481ad | 289 | //Init display modual via LCD |
terencez | 0:f9d13e09cf11 | 290 | init_display(); |
terencez | 14:ec9e195830ff | 291 | //Init the network modual via ethernet and udp socket |
terencez | 14:ec9e195830ff | 292 | init_network(); |
terencez | 0:f9d13e09cf11 | 293 | |
terencez | 14:ec9e195830ff | 294 | /* |
terencez | 14:ec9e195830ff | 295 | * Now the main function fill an array with each object, this list will be later passed to liblwm2m. |
terencez | 14:ec9e195830ff | 296 | * Those functions are located in their respective object file. |
terencez | 14:ec9e195830ff | 297 | */ |
terencez | 14:ec9e195830ff | 298 | objArray[0] = get_security_object(); |
terencez | 0:f9d13e09cf11 | 299 | if (NULL == objArray[0]) |
terencez | 0:f9d13e09cf11 | 300 | { |
terencez | 14:ec9e195830ff | 301 | fprintf(stderr, "Failed to create security object\r\n"); |
terencez | 14:ec9e195830ff | 302 | return -1; |
terencez | 14:ec9e195830ff | 303 | } |
terencez | 14:ec9e195830ff | 304 | data.securityObjP = objArray[0]; |
terencez | 14:ec9e195830ff | 305 | |
terencez | 14:ec9e195830ff | 306 | objArray[1] = get_server_object(); |
terencez | 14:ec9e195830ff | 307 | if (NULL == objArray[1]) |
terencez | 14:ec9e195830ff | 308 | { |
terencez | 14:ec9e195830ff | 309 | fprintf(stderr, "Failed to create server object\r\n"); |
terencez | 14:ec9e195830ff | 310 | return -1; |
terencez | 14:ec9e195830ff | 311 | } |
terencez | 14:ec9e195830ff | 312 | |
terencez | 14:ec9e195830ff | 313 | objArray[2] = get_object_device(); |
terencez | 14:ec9e195830ff | 314 | if (NULL == objArray[2]) |
terencez | 14:ec9e195830ff | 315 | { |
terencez | 0:f9d13e09cf11 | 316 | fprintf(stderr, "Failed to create Device object\r\n"); |
terencez | 0:f9d13e09cf11 | 317 | return -1; |
terencez | 0:f9d13e09cf11 | 318 | } |
terencez | 0:f9d13e09cf11 | 319 | |
terencez | 16:31c387e94b6d | 320 | |
terencez | 16:31c387e94b6d | 321 | objArray[3] = get_object_temperature(); |
terencez | 14:ec9e195830ff | 322 | if (NULL == objArray[3]) |
terencez | 14:ec9e195830ff | 323 | { |
terencez | 16:31c387e94b6d | 324 | fprintf(stderr, "Failed to create temperature object\r\n"); |
terencez | 14:ec9e195830ff | 325 | return -1; |
terencez | 14:ec9e195830ff | 326 | } |
terencez | 16:31c387e94b6d | 327 | |
terencez | 16:31c387e94b6d | 328 | #ifdef ENABLE_RGB_LED |
terencez | 16:31c387e94b6d | 329 | objArray[4] = get_object_rgb_led(); |
terencez | 16:31c387e94b6d | 330 | if (NULL == objArray[4]) |
terencez | 16:31c387e94b6d | 331 | { |
terencez | 16:31c387e94b6d | 332 | fprintf(stderr, "Failed to create RGB LED object\r\n"); |
terencez | 16:31c387e94b6d | 333 | return -1; |
terencez | 16:31c387e94b6d | 334 | } |
terencez | 16:31c387e94b6d | 335 | #endif |
terencez | 14:ec9e195830ff | 336 | /* |
terencez | 14:ec9e195830ff | 337 | * The liblwm2m library is now initialized with the functions that will be in |
terencez | 14:ec9e195830ff | 338 | * charge of communication |
terencez | 14:ec9e195830ff | 339 | */ |
terencez | 14:ec9e195830ff | 340 | |
terencez | 14:ec9e195830ff | 341 | lwm2mH = lwm2m_init(&data); |
terencez | 0:f9d13e09cf11 | 342 | if (NULL == lwm2mH) |
terencez | 0:f9d13e09cf11 | 343 | { |
terencez | 0:f9d13e09cf11 | 344 | fprintf(stderr, "lwm2m_init() failed\r\n"); |
terencez | 0:f9d13e09cf11 | 345 | return -1; |
terencez | 14:ec9e195830ff | 346 | } |
terencez | 14:ec9e195830ff | 347 | |
terencez | 14:ec9e195830ff | 348 | printf("ontextP->endpointName %d , contextP->objectList %d\n", lwm2mH->endpointName, lwm2mH->objectList); |
terencez | 14:ec9e195830ff | 349 | /* |
terencez | 14:ec9e195830ff | 350 | * We configure the liblwm2m library with the name of the client - which shall be unique for each client - |
terencez | 14:ec9e195830ff | 351 | * the number of objects we will be passing through and the objects array |
terencez | 14:ec9e195830ff | 352 | */ |
terencez | 14:ec9e195830ff | 353 | result = lwm2m_configure(lwm2mH, ENDPOINT_NAME, NULL, NULL, DEVICE_OBJ_NUM, objArray); |
terencez | 14:ec9e195830ff | 354 | if (result != 0) |
terencez | 14:ec9e195830ff | 355 | { |
terencez | 14:ec9e195830ff | 356 | fprintf(stderr, "lwm2m_configure() failed: 0x%X\r\n", result); |
terencez | 14:ec9e195830ff | 357 | return -1; |
terencez | 0:f9d13e09cf11 | 358 | } |
terencez | 0:f9d13e09cf11 | 359 | |
terencez | 0:f9d13e09cf11 | 360 | memset(&security, 0, sizeof(lwm2m_security_t)); |
terencez | 14:ec9e195830ff | 361 | result = lwm2m_add_server(lwm2mH, 123, 0, NULL, BINDING_U, (void *)&server, &security); |
terencez | 0:f9d13e09cf11 | 362 | if (result != 0) |
terencez | 0:f9d13e09cf11 | 363 | { |
terencez | 0:f9d13e09cf11 | 364 | fprintf(stderr, "lwm2m_add_server() failed: 0x%X\r\n", result); |
terencez | 0:f9d13e09cf11 | 365 | return -1; |
terencez | 14:ec9e195830ff | 366 | } |
terencez | 14:ec9e195830ff | 367 | |
terencez | 14:ec9e195830ff | 368 | |
terencez | 0:f9d13e09cf11 | 369 | while (true) { |
terencez | 14:ec9e195830ff | 370 | int numBytes = 0; |
terencez | 14:ec9e195830ff | 371 | struct timeval tv; |
terencez | 14:ec9e195830ff | 372 | tv.tv_sec = 60; |
terencez | 14:ec9e195830ff | 373 | tv.tv_usec = 0; |
terencez | 14:ec9e195830ff | 374 | printf("\n--------------------------------------\n"); |
terencez | 14:ec9e195830ff | 375 | printf("loop...\n"); |
terencez | 0:f9d13e09cf11 | 376 | |
terencez | 14:ec9e195830ff | 377 | print_state(lwm2mH); |
terencez | 0:f9d13e09cf11 | 378 | |
terencez | 14:ec9e195830ff | 379 | /* |
terencez | 14:ec9e195830ff | 380 | * This function does two things: |
terencez | 14:ec9e195830ff | 381 | * - first it does the work needed by liblwm2m (eg. (re)sending some packets). |
terencez | 14:ec9e195830ff | 382 | * - Secondly it adjusts the timeout value (default 60s) depending on the state of the transaction |
terencez | 14:ec9e195830ff | 383 | * (eg. retransmission) and the time before the next operation |
terencez | 14:ec9e195830ff | 384 | */ |
terencez | 14:ec9e195830ff | 385 | result = lwm2m_step(lwm2mH, &(tv.tv_sec)); |
terencez | 14:ec9e195830ff | 386 | if (result != 0) |
terencez | 14:ec9e195830ff | 387 | { |
terencez | 14:ec9e195830ff | 388 | printf("lwm2m_step() failed: 0x%x\r\n", result); |
terencez | 14:ec9e195830ff | 389 | return -1; |
terencez | 14:ec9e195830ff | 390 | } |
terencez | 0:f9d13e09cf11 | 391 | |
terencez | 15:d0f20339c1ad | 392 | numBytes = udp.recvfrom(&server, buffer, sizeof(buffer)); |
terencez | 14:ec9e195830ff | 393 | if(numBytes <=0){ |
terencez | 14:ec9e195830ff | 394 | printf("Error in recvfrom() - numBytes = 0\r\n"); |
terencez | 15:d0f20339c1ad | 395 | //return -1; |
terencez | 14:ec9e195830ff | 396 | } |
terencez | 14:ec9e195830ff | 397 | else |
terencez | 14:ec9e195830ff | 398 | { |
terencez | 15:d0f20339c1ad | 399 | printf("Received packet from: %s of size %d; session = 0x%x\n", server.get_ip_address(), numBytes, (int)(&server)); |
terencez | 14:ec9e195830ff | 400 | //debug_dump((uint8_t *)buffer,numBytes); |
terencez | 14:ec9e195830ff | 401 | |
terencez | 14:ec9e195830ff | 402 | //Let liblwm2m respond to the query depending on the context |
terencez | 15:d0f20339c1ad | 403 | lwm2m_handle_packet(lwm2mH, buffer, numBytes, (void*) &server); |
terencez | 0:f9d13e09cf11 | 404 | } |
terencez | 1:3549d3c3967c | 405 | }//while() |
terencez | 14:ec9e195830ff | 406 | |
terencez | 1:3549d3c3967c | 407 | }//main |
terencez | 16:31c387e94b6d | 408 | |
terencez | 16:31c387e94b6d | 409 |