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 Vincent Wochnik

Committer:
xinlei
Date:
Mon Jun 01 12:56:41 2015 +0000
Revision:
126:e1fcf720c63a
Parent:
125:979ab0d075de
Child:
127:871e6eb0fa76
added network traffic accounting

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xinlei 96:5dfdc8568e9f 1 #include <stdio.h>
xinlei 96:5dfdc8568e9f 2 #include <ctype.h>
xinlei 96:5dfdc8568e9f 3 #include "PollThread.h"
xinlei 96:5dfdc8568e9f 4 #include "logging.h"
xinlei 96:5dfdc8568e9f 5
xinlei 126:e1fcf720c63a 6 static size_t _volSend = 0;
xinlei 126:e1fcf720c63a 7 static size_t _volRecv = 0;
xinlei 126:e1fcf720c63a 8
xinlei 96:5dfdc8568e9f 9 bool PollThread::handshake()
xinlei 96:5dfdc8568e9f 10 {
xinlei 106:c61f0d62b625 11 int l = snprintf(buf2, sizeof(buf2), "%s", "80\r\n");
xinlei 106:c61f0d62b625 12 l = snprintf(buf, sizeof(buf), fmtSmartRest, uri, l, buf2);
xinlei 106:c61f0d62b625 13 sock.setBlocking(3000);
xinlei 126:e1fcf720c63a 14 _volSend += l;
xinlei 106:c61f0d62b625 15 l = sock.sendAndReceive(buf, l, sizeof(buf));
xinlei 125:979ab0d075de 16 if (l <= 0) return false;
xinlei 126:e1fcf720c63a 17 _volRecv += l;
xinlei 125:979ab0d075de 18 const char* p = skipHTTPHeader(buf);
xinlei 125:979ab0d075de 19 if (p == NULL) return false;
xinlei 96:5dfdc8568e9f 20 size_t i = 0;
xinlei 125:979ab0d075de 21 for (; isalnum(*p); ++p, ++i) {
xinlei 96:5dfdc8568e9f 22 bayeuxId[i] = *p;
xinlei 96:5dfdc8568e9f 23 }
xinlei 117:5de54f09f754 24 bayeuxId[i] = 0;
xinlei 96:5dfdc8568e9f 25 return bayeuxId[0];
xinlei 96:5dfdc8568e9f 26 }
xinlei 96:5dfdc8568e9f 27
xinlei 96:5dfdc8568e9f 28 bool PollThread::subscribe()
xinlei 96:5dfdc8568e9f 29 {
xinlei 106:c61f0d62b625 30 int l = snprintf(buf2, sizeof(buf2), "81,%s,%s\r\n", bayeuxId, chn);
xinlei 106:c61f0d62b625 31 l = snprintf(buf, sizeof(buf), fmtSmartRest, uri, l, buf2);
xinlei 106:c61f0d62b625 32 sock.setBlocking(3000);
xinlei 126:e1fcf720c63a 33 _volSend += l;
xinlei 123:3e4a1ed4bad5 34 l = sock.sendAndReceive(buf, l, sizeof(buf));
xinlei 123:3e4a1ed4bad5 35 if (l <= 0) return false;
xinlei 126:e1fcf720c63a 36 _volRecv += l;
xinlei 123:3e4a1ed4bad5 37 const char *p = skipHTTPHeader(buf);
xinlei 123:3e4a1ed4bad5 38 if (p == NULL) return false;
xinlei 123:3e4a1ed4bad5 39 for (; *p && !isgraph(*p); ++p);
xinlei 123:3e4a1ed4bad5 40 return *p == 0;
xinlei 96:5dfdc8568e9f 41 }
xinlei 96:5dfdc8568e9f 42
xinlei 96:5dfdc8568e9f 43 bool PollThread::connect()
xinlei 96:5dfdc8568e9f 44 {
xinlei 106:c61f0d62b625 45 int l = snprintf(buf2, sizeof(buf2), "83,%s\r\n", bayeuxId);
xinlei 106:c61f0d62b625 46 l = snprintf(buf, sizeof(buf), fmtSmartRest, uri, l, buf2);
xinlei 124:311fa85af2b3 47 sock.setBlocking(300000); // Timeout after 5 minutes
xinlei 126:e1fcf720c63a 48 _volSend += l;
xinlei 126:e1fcf720c63a 49 aInfo("[SEND] poll: %d\n", _volSend);
xinlei 106:c61f0d62b625 50 l = sock.sendAndReceive(buf, l, sizeof(buf));
xinlei 126:e1fcf720c63a 51 _volRecv += l;
xinlei 126:e1fcf720c63a 52 aInfo("[RECV] poll: %d\n", _volRecv);
xinlei 123:3e4a1ed4bad5 53 return l>0;
xinlei 96:5dfdc8568e9f 54 }
xinlei 96:5dfdc8568e9f 55
xinlei 96:5dfdc8568e9f 56 void PollThread::threadFunc()
xinlei 96:5dfdc8568e9f 57 {
xinlei 99:e369fc75c000 58 unsigned short state = 1;
xinlei 96:5dfdc8568e9f 59 while (true) {
xinlei 96:5dfdc8568e9f 60 switch (state) {
xinlei 96:5dfdc8568e9f 61 case 1: if (!handshake()) {
xinlei 96:5dfdc8568e9f 62 aCritical("Poll: handshake fail!\n");
xinlei 96:5dfdc8568e9f 63 break;
xinlei 96:5dfdc8568e9f 64 }
xinlei 96:5dfdc8568e9f 65 case 2: if(!subscribe()) {
xinlei 96:5dfdc8568e9f 66 aCritical("Poll: subscribe fail!\n");
xinlei 96:5dfdc8568e9f 67 state = 1;
xinlei 96:5dfdc8568e9f 68 break;
xinlei 96:5dfdc8568e9f 69 }
xinlei 96:5dfdc8568e9f 70 case 3: if(!connect()) {
xinlei 96:5dfdc8568e9f 71 aCritical("Poll: connect fail!\n");
xinlei 96:5dfdc8568e9f 72 state = 1;
xinlei 96:5dfdc8568e9f 73 break;
xinlei 96:5dfdc8568e9f 74 }
xinlei 99:e369fc75c000 75 default: parser.parse(buf);
xinlei 96:5dfdc8568e9f 76 if (parser.getBayeuxAdvice() == BA_HANDSHAKE)
xinlei 96:5dfdc8568e9f 77 state = 1;
xinlei 96:5dfdc8568e9f 78 else
xinlei 96:5dfdc8568e9f 79 state = 3;
xinlei 96:5dfdc8568e9f 80 }
xinlei 96:5dfdc8568e9f 81 }
xinlei 96:5dfdc8568e9f 82 }