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 13 12:12:55 2015 +0000
Revision:
107:fc5f25f0e0d5
Parent:
106:c61f0d62b625
Child:
108:f1ee3e1eb126
OperationSupport revamped

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