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:
Wed May 27 09:22:24 2015 +0000
Revision:
123:3e4a1ed4bad5
Parent:
117:5de54f09f754
Child:
124:311fa85af2b3
Temporary work-around for long polling when server not properly close connection.

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 96:5dfdc8568e9f 6 bool PollThread::handshake()
xinlei 96:5dfdc8568e9f 7 {
xinlei 106:c61f0d62b625 8 int l = snprintf(buf2, sizeof(buf2), "%s", "80\r\n");
xinlei 106:c61f0d62b625 9 l = snprintf(buf, sizeof(buf), fmtSmartRest, uri, l, buf2);
xinlei 106:c61f0d62b625 10 sock.setBlocking(3000);
xinlei 106:c61f0d62b625 11 l = sock.sendAndReceive(buf, l, sizeof(buf));
xinlei 123:3e4a1ed4bad5 12 if (l <= 0)
xinlei 96:5dfdc8568e9f 13 return false;
xinlei 96:5dfdc8568e9f 14 size_t i = 0;
xinlei 96:5dfdc8568e9f 15 for (const char* p = skipHTTPHeader(buf); isalnum(*p); ++p, ++i) {
xinlei 96:5dfdc8568e9f 16 bayeuxId[i] = *p;
xinlei 96:5dfdc8568e9f 17 }
xinlei 117:5de54f09f754 18 bayeuxId[i] = 0;
xinlei 96:5dfdc8568e9f 19 return bayeuxId[0];
xinlei 96:5dfdc8568e9f 20 }
xinlei 96:5dfdc8568e9f 21
xinlei 96:5dfdc8568e9f 22 bool PollThread::subscribe()
xinlei 96:5dfdc8568e9f 23 {
xinlei 106:c61f0d62b625 24 int l = snprintf(buf2, sizeof(buf2), "81,%s,%s\r\n", bayeuxId, chn);
xinlei 106:c61f0d62b625 25 l = snprintf(buf, sizeof(buf), fmtSmartRest, uri, l, buf2);
xinlei 106:c61f0d62b625 26 sock.setBlocking(3000);
xinlei 123:3e4a1ed4bad5 27 l = sock.sendAndReceive(buf, l, sizeof(buf));
xinlei 123:3e4a1ed4bad5 28 if (l <= 0) return false;
xinlei 123:3e4a1ed4bad5 29 const char *p = skipHTTPHeader(buf);
xinlei 123:3e4a1ed4bad5 30 if (p == NULL) return false;
xinlei 123:3e4a1ed4bad5 31 for (; *p && !isgraph(*p); ++p);
xinlei 123:3e4a1ed4bad5 32 return *p == 0;
xinlei 96:5dfdc8568e9f 33 }
xinlei 96:5dfdc8568e9f 34
xinlei 96:5dfdc8568e9f 35 bool PollThread::connect()
xinlei 96:5dfdc8568e9f 36 {
xinlei 106:c61f0d62b625 37 int l = snprintf(buf2, sizeof(buf2), "83,%s\r\n", bayeuxId);
xinlei 106:c61f0d62b625 38 l = snprintf(buf, sizeof(buf), fmtSmartRest, uri, l, buf2);
xinlei 123:3e4a1ed4bad5 39 sock.setBlocking(300000); // Timeout after an hour
xinlei 106:c61f0d62b625 40 l = sock.sendAndReceive(buf, l, sizeof(buf));
xinlei 123:3e4a1ed4bad5 41 return l>0;
xinlei 96:5dfdc8568e9f 42 }
xinlei 96:5dfdc8568e9f 43
xinlei 96:5dfdc8568e9f 44 void PollThread::threadFunc()
xinlei 96:5dfdc8568e9f 45 {
xinlei 99:e369fc75c000 46 unsigned short state = 1;
xinlei 96:5dfdc8568e9f 47 while (true) {
xinlei 96:5dfdc8568e9f 48 switch (state) {
xinlei 96:5dfdc8568e9f 49 case 1: if (!handshake()) {
xinlei 96:5dfdc8568e9f 50 aCritical("Poll: handshake fail!\n");
xinlei 96:5dfdc8568e9f 51 break;
xinlei 96:5dfdc8568e9f 52 }
xinlei 96:5dfdc8568e9f 53 case 2: if(!subscribe()) {
xinlei 96:5dfdc8568e9f 54 aCritical("Poll: subscribe fail!\n");
xinlei 96:5dfdc8568e9f 55 state = 1;
xinlei 96:5dfdc8568e9f 56 break;
xinlei 96:5dfdc8568e9f 57 }
xinlei 96:5dfdc8568e9f 58 case 3: if(!connect()) {
xinlei 96:5dfdc8568e9f 59 aCritical("Poll: connect fail!\n");
xinlei 96:5dfdc8568e9f 60 state = 1;
xinlei 96:5dfdc8568e9f 61 break;
xinlei 96:5dfdc8568e9f 62 }
xinlei 99:e369fc75c000 63 default: parser.parse(buf);
xinlei 96:5dfdc8568e9f 64 if (parser.getBayeuxAdvice() == BA_HANDSHAKE)
xinlei 96:5dfdc8568e9f 65 state = 1;
xinlei 96:5dfdc8568e9f 66 else
xinlei 96:5dfdc8568e9f 67 state = 3;
xinlei 96:5dfdc8568e9f 68 }
xinlei 96:5dfdc8568e9f 69 }
xinlei 96:5dfdc8568e9f 70 }