Official reference client implementation for Cumulocity SmartREST on u-blox C027.
Dependencies: C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed
Fork of MbedSmartRestMain by
util/SmartRestSocket.cpp@97:ea056f6be2e8, 2015-04-27 (annotated)
- Committer:
- xinlei
- Date:
- Mon Apr 27 13:02:50 2015 +0000
- Revision:
- 97:ea056f6be2e8
- Parent:
- 94:61d44636f020
- Child:
- 99:e369fc75c000
MDMSerial now singleton
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
xinlei | 94:61d44636f020 | 1 | #include <string.h> |
xinlei | 94:61d44636f020 | 2 | #include "SmartRestSocket.h" |
xinlei | 94:61d44636f020 | 3 | #include "SmartRestConf.h" |
xinlei | 94:61d44636f020 | 4 | |
xinlei | 94:61d44636f020 | 5 | //memset((void*)SmartRestSocket::cachedIP, 0, sizeof(SmartRestSocket::cachedIP)); |
xinlei | 94:61d44636f020 | 6 | char SmartRestSocket::cachedIP[16] = {0}; |
xinlei | 94:61d44636f020 | 7 | |
xinlei | 94:61d44636f020 | 8 | int SmartRestSocket::connect() |
xinlei | 94:61d44636f020 | 9 | { |
xinlei | 97:ea056f6be2e8 | 10 | extern MDMSerial *pMdm; |
xinlei | 94:61d44636f020 | 11 | int n = -1; |
xinlei | 94:61d44636f020 | 12 | ipLock.lock(); |
xinlei | 94:61d44636f020 | 13 | for (size_t i = 0; i < 3; ++i) { |
xinlei | 94:61d44636f020 | 14 | if (cachedIP[0] == '\0') { |
xinlei | 97:ea056f6be2e8 | 15 | MDMParser::IP ip = pMdm->gethostbyname(getHost()); |
xinlei | 94:61d44636f020 | 16 | if (ip == NOIP) |
xinlei | 94:61d44636f020 | 17 | continue; |
xinlei | 94:61d44636f020 | 18 | const unsigned char *c = (const unsigned char*)&ip; |
xinlei | 94:61d44636f020 | 19 | snprintf(cachedIP, sizeof(cachedIP), "%u.%u.%u.%u", c[3], c[2], c[1], c[0]); |
xinlei | 94:61d44636f020 | 20 | } |
xinlei | 94:61d44636f020 | 21 | n = TCPSocketConnection::connect(cachedIP, getPort()); |
xinlei | 94:61d44636f020 | 22 | if (n >= 0) { |
xinlei | 94:61d44636f020 | 23 | break; |
xinlei | 94:61d44636f020 | 24 | } else { |
xinlei | 94:61d44636f020 | 25 | cachedIP[0] = '\0'; |
xinlei | 94:61d44636f020 | 26 | } |
xinlei | 94:61d44636f020 | 27 | } |
xinlei | 94:61d44636f020 | 28 | ipLock.unlock(); |
xinlei | 94:61d44636f020 | 29 | return n; |
xinlei | 94:61d44636f020 | 30 | } |
xinlei | 94:61d44636f020 | 31 | |
xinlei | 94:61d44636f020 | 32 | int SmartRestSocket::sendOnly(char *buf, int size) |
xinlei | 94:61d44636f020 | 33 | { |
xinlei | 94:61d44636f020 | 34 | int l = connect(); |
xinlei | 94:61d44636f020 | 35 | if (l < 0) |
xinlei | 94:61d44636f020 | 36 | return -3; |
xinlei | 94:61d44636f020 | 37 | l = send(buf, size); |
xinlei | 94:61d44636f020 | 38 | close(); |
xinlei | 94:61d44636f020 | 39 | if (l < 0) { |
xinlei | 94:61d44636f020 | 40 | return -2; |
xinlei | 94:61d44636f020 | 41 | } else { |
xinlei | 94:61d44636f020 | 42 | return l; |
xinlei | 94:61d44636f020 | 43 | } |
xinlei | 94:61d44636f020 | 44 | } |
xinlei | 94:61d44636f020 | 45 | |
xinlei | 94:61d44636f020 | 46 | int SmartRestSocket::sendAndReceive(char *buf, int size, int maxSize) |
xinlei | 94:61d44636f020 | 47 | { |
xinlei | 94:61d44636f020 | 48 | int l = connect(); |
xinlei | 94:61d44636f020 | 49 | if (l < 0) |
xinlei | 94:61d44636f020 | 50 | return -3; |
xinlei | 94:61d44636f020 | 51 | l = send(buf, size); |
xinlei | 94:61d44636f020 | 52 | if (l < 0) { |
xinlei | 94:61d44636f020 | 53 | close(); |
xinlei | 94:61d44636f020 | 54 | return -2; |
xinlei | 94:61d44636f020 | 55 | } else { |
xinlei | 94:61d44636f020 | 56 | l = receive(buf, maxSize); |
xinlei | 94:61d44636f020 | 57 | close(); |
xinlei | 94:61d44636f020 | 58 | return l; |
xinlei | 94:61d44636f020 | 59 | } |
xinlei | 94:61d44636f020 | 60 | } |