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
- Committer:
- terencez
- Date:
- 2017-05-07
- Revision:
- 15:d0f20339c1ad
- Parent:
- 14:ec9e195830ff
- Child:
- 16:31c387e94b6d
File content as of revision 15:d0f20339c1ad:
#include "mbed.h" #include "C12832.h" #include "LM75B.h" #include "EthernetInterface.h" extern "C" { #include "liblwm2m.h" //External API #if 0 /* * object_server.c */ lwm2m_object_t * get_server_object(int serverId, const char* binding, int lifetime, bool storing); void clean_server_object(lwm2m_object_t * object); void display_server_object(lwm2m_object_t * objectP); void copy_server_object(lwm2m_object_t * objectDest, lwm2m_object_t * objectSrc); /* * object_device.c */ lwm2m_object_t * get_object_device(void); void free_object_device(lwm2m_object_t * objectP); uint8_t device_change(lwm2m_data_t * dataArray, lwm2m_object_t * objectP); void display_device_object(lwm2m_object_t * objectP); /* * object_security.c */ lwm2m_object_t * get_security_object(int serverId, const char* serverUri, char * bsPskId, char * psk, uint16_t pskLen, bool isBootstrap); void clean_security_object(lwm2m_object_t * objectP); char * get_server_uri(lwm2m_object_t * objectP, uint16_t secObjInstID); void display_security_object(lwm2m_object_t * objectP); void copy_security_object(lwm2m_object_t * objectDest, lwm2m_object_t * objectSrc); /* * object_test.c */ #define TEST_OBJECT_ID 1024 lwm2m_object_t * get_test_object(void); void free_test_object(lwm2m_object_t * object); void display_test_object(lwm2m_object_t * objectP); #else extern lwm2m_object_t * get_object_device(void); extern void free_object_device(lwm2m_object_t * objectP); extern lwm2m_object_t * get_server_object(void); extern void free_server_object(lwm2m_object_t * object); extern lwm2m_object_t * get_security_object(void); extern void free_security_object(lwm2m_object_t * objectP); extern char * get_server_uri(lwm2m_object_t * objectP, uint16_t secObjInstID); extern lwm2m_object_t * get_test_object(void); extern void free_test_object(lwm2m_object_t * object); #endif } //Global definitions #define ENDPOINT_NAME "MBED-OS-EXAMPLE-WAKAAMA" //Connect to the Leshan test server as default: http://leshan.eclipse.org #define LESHAN_SERVER "5.39.83.206" #define LESHAN_PORT 5683 #define UDP_TIMEOUT 60000 #define UDP_PORT 5683 #define DEVICE_OBJ_NUM 4 #define LOCAL_PORT 5683 // LCD 128X32 C12832 lcd(p5, p7, p6, p8, p11); // Sensor of temperature LM75B sensor_temp(p28,p27); // Network interface EthernetInterface eth; // UDP Socket UDPSocket udp; typedef struct { lwm2m_object_t * securityObjP; UDPSocket sock; /*connection_t * connList;*/ } client_data_t; //Functions void print_state(lwm2m_context_t * lwm2mH) { lwm2m_server_t * targetP; fprintf(stderr, "State: "); switch(lwm2mH->state) { case STATE_INITIAL: fprintf(stderr, "STATE_INITIAL"); break; case STATE_BOOTSTRAP_REQUIRED: fprintf(stderr, "STATE_BOOTSTRAP_REQUIRED"); break; case STATE_BOOTSTRAPPING: fprintf(stderr, "STATE_BOOTSTRAPPING"); break; case STATE_REGISTER_REQUIRED: fprintf(stderr, "STATE_REGISTER_REQUIRED"); break; case STATE_REGISTERING: fprintf(stderr, "STATE_REGISTERING"); break; case STATE_READY: fprintf(stderr, "STATE_READY"); break; default: fprintf(stderr, "Unknown !"); break; } fprintf(stderr, "\r\n"); targetP = lwm2mH->bootstrapServerList; if (lwm2mH->bootstrapServerList == NULL) { fprintf(stderr, "No Bootstrap Server.\r\n"); } else { fprintf(stderr, "Bootstrap Servers:\r\n"); for (targetP = lwm2mH->bootstrapServerList ; targetP != NULL ; targetP = targetP->next) { fprintf(stderr, " - Security Object ID %d", targetP->secObjInstID); fprintf(stderr, "\tHold Off Time: %lu s", (unsigned long)targetP->lifetime); fprintf(stderr, "\tstatus: "); switch(targetP->status) { case STATE_DEREGISTERED: fprintf(stderr, "DEREGISTERED\r\n"); break; case STATE_BS_HOLD_OFF: fprintf(stderr, "CLIENT HOLD OFF\r\n"); break; case STATE_BS_INITIATED: fprintf(stderr, "BOOTSTRAP INITIATED\r\n"); break; case STATE_BS_PENDING: fprintf(stderr, "BOOTSTRAP PENDING\r\n"); break; case STATE_BS_FINISHED: fprintf(stderr, "BOOTSTRAP FINISHED\r\n"); break; case STATE_BS_FAILED: fprintf(stderr, "BOOTSTRAP FAILED\r\n"); break; default: fprintf(stderr, "INVALID (%d)\r\n", (int)targetP->status); } fprintf(stderr, "\r\n"); } } if (lwm2mH->serverList == NULL) { fprintf(stderr, "No LWM2M Server.\r\n"); } else { fprintf(stderr, "LWM2M Servers:\r\n"); for (targetP = lwm2mH->serverList ; targetP != NULL ; targetP = targetP->next) { fprintf(stderr, " - Server ID %d", targetP->shortID); fprintf(stderr, "\tstatus: "); switch(targetP->status) { case STATE_DEREGISTERED: fprintf(stderr, "DEREGISTERED\r\n"); break; case STATE_REG_PENDING: fprintf(stderr, "REGISTRATION PENDING\r\n"); break; case STATE_REGISTERED: fprintf(stderr, "REGISTERED\tlocation: \"%s\"\tLifetime: %lus\r\n", targetP->location, (unsigned long)targetP->lifetime); break; case STATE_REG_UPDATE_PENDING: fprintf(stderr, "REGISTRATION UPDATE PENDING\r\n"); break; case STATE_REG_UPDATE_NEEDED: fprintf(stderr, "REGISTRATION UPDATE REQUIRED\r\n"); break; case STATE_DEREG_PENDING: fprintf(stderr, "DEREGISTRATION PENDING\r\n"); break; case STATE_REG_FAILED: fprintf(stderr, "REGISTRATION FAILED\r\n"); break; default: fprintf(stderr, "INVALID (%d)\r\n", (int)targetP->status); } fprintf(stderr, "\r\n"); } } } void debug_dump(uint8_t * buffer, size_t length) { int i; printf("\n--------------------------\n"); for(i=0;i<length;i++){ printf("0x%2x ",buffer[i]); if(i%16==15)printf("\n"); } printf("\n--------------------------\n"); } void test_udp(EthernetInterface eth) { //TBD } void test_tcp(EthernetInterface eth) { TCPSocket tcp; tcp.open(ð); tcp.connect("developer.mbed.org", 80); // Send a simple http request char sbuffer[] = "GET / HTTP/1.1\r\nHost: developer.mbed.org\r\n\r\n"; int scount = tcp.send(sbuffer, sizeof sbuffer); lcd.cls(); lcd.locate(0,0); lcd.printf("TCP TESTING: "); lcd.printf("SEND %d\n[%.*s]\n", scount, strstr(sbuffer, "\r\n")-sbuffer, sbuffer); wait(3.0); // Recieve a simple http response and print out the response line char rbuffer[64]; int rcount = tcp.recv(rbuffer, sizeof rbuffer); lcd.cls(); lcd.locate(0,0); lcd.printf("TCP TESTING: "); lcd.printf("RECV %d\n[%.*s]\n", rcount, strstr(rbuffer, "\r\n")-rbuffer, rbuffer); wait(3.0); lcd.cls(); // Close the socket to return its memory and bring down the network interface tcp.close(); } int init_network() { int ret = 0; //try to connect and get ip via DHCP. lcd.locate(0,10); lcd.printf("obtaining ip address...\n"); ret = eth.connect(); if(ret!=0){ lcd.printf("DHCP Error - No IP"); return ret; } lcd.printf("IP is %s\n", eth.get_ip_address()); //wait(2.0); //test code which only used to verify the connect functinon //test_tcp(eth); //test_udp(eth); udp.open(ð); //udp.set_timeout(UDP_TIMEOUT); udp.bind(UDP_PORT); return ret; } int init_display() { int ret = 0; //Bootup and display initial information lcd.cls(); lcd.locate(0,0); lcd.printf("mbed-wakaama-example"); lcd.locate(0,10); lcd.printf("starting..."); //wait(2.0); return ret; } coap_status_t lwm2m_buffer_send(void * sessionH,uint8_t * buffer,size_t length,void * userdata) { int ret = 0; SocketAddress * addr = (SocketAddress*) sessionH; printf("Send packet to: %s of port %d, size: %d\n", addr->get_ip_address(), addr->get_port(),length); //debug_dump(buffer,length); ret = udp.sendto(addr->get_ip_address(), addr->get_port(), (void *)buffer, (int)length); if(ret!=length) { return COAP_500_INTERNAL_SERVER_ERROR; } return COAP_NO_ERROR; } int main() { int result = 0; uint8_t buffer[1024]; //Init the lwm2m structures lwm2m_context_t * lwm2mH = NULL; lwm2m_object_t * objArray[DEVICE_OBJ_NUM]; lwm2m_security_t security; client_data_t data; data.sock = udp; //Init the lwm2m server, set Leshan as default SocketAddress server(LESHAN_SERVER, LESHAN_PORT); SocketAddress client; //Init display modual via LCD init_display(); //Init the network modual via ethernet and udp socket init_network(); /* * Now the main function fill an array with each object, this list will be later passed to liblwm2m. * Those functions are located in their respective object file. */ objArray[0] = get_security_object(); if (NULL == objArray[0]) { fprintf(stderr, "Failed to create security object\r\n"); return -1; } data.securityObjP = objArray[0]; objArray[1] = get_server_object(); if (NULL == objArray[1]) { fprintf(stderr, "Failed to create server object\r\n"); return -1; } objArray[2] = get_object_device(); if (NULL == objArray[2]) { fprintf(stderr, "Failed to create Device object\r\n"); return -1; } objArray[3] = get_test_object(); if (NULL == objArray[3]) { fprintf(stderr, "Failed to create Test object\r\n"); return -1; } /* * The liblwm2m library is now initialized with the functions that will be in * charge of communication */ lwm2mH = lwm2m_init(&data); if (NULL == lwm2mH) { fprintf(stderr, "lwm2m_init() failed\r\n"); return -1; } printf("ontextP->endpointName %d , contextP->objectList %d\n", lwm2mH->endpointName, lwm2mH->objectList); /* * We configure the liblwm2m library with the name of the client - which shall be unique for each client - * the number of objects we will be passing through and the objects array */ result = lwm2m_configure(lwm2mH, ENDPOINT_NAME, NULL, NULL, DEVICE_OBJ_NUM, objArray); if (result != 0) { fprintf(stderr, "lwm2m_configure() failed: 0x%X\r\n", result); return -1; } memset(&security, 0, sizeof(lwm2m_security_t)); result = lwm2m_add_server(lwm2mH, 123, 0, NULL, BINDING_U, (void *)&server, &security); if (result != 0) { fprintf(stderr, "lwm2m_add_server() failed: 0x%X\r\n", result); return -1; } while (true) { int numBytes = 0; struct timeval tv; tv.tv_sec = 60; tv.tv_usec = 0; printf("\n--------------------------------------\n"); printf("loop...\n"); print_state(lwm2mH); /* * This function does two things: * - first it does the work needed by liblwm2m (eg. (re)sending some packets). * - Secondly it adjusts the timeout value (default 60s) depending on the state of the transaction * (eg. retransmission) and the time before the next operation */ result = lwm2m_step(lwm2mH, &(tv.tv_sec)); if (result != 0) { printf("lwm2m_step() failed: 0x%x\r\n", result); return -1; } numBytes = udp.recvfrom(&server, buffer, sizeof(buffer)); if(numBytes <=0){ printf("Error in recvfrom() - numBytes = 0\r\n"); //return -1; } else { printf("Received packet from: %s of size %d; session = 0x%x\n", server.get_ip_address(), numBytes, (int)(&server)); //debug_dump((uint8_t *)buffer,numBytes); //Let liblwm2m respond to the query depending on the context lwm2m_handle_packet(lwm2mH, buffer, numBytes, (void*) &server); } }//while() }//main