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:
Thu May 07 09:57:55 2015 +0000
Revision:
99:e369fc75c000
Parent:
96:5dfdc8568e9f
Child:
101:dbcd3bc51758
prepare for v2.1rc3.

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 96:5dfdc8568e9f 9 int l = snprintf(buf2, SMARRESTBODY_SIZE, "%s", "80\r\n");
xinlei 99:e369fc75c000 10 l = snprintf(buf, SMARTREST_SIZE, fmtSmartRest, uri, l, buf2);
xinlei 99:e369fc75c000 11 sock.set_blocking(false);
xinlei 96:5dfdc8568e9f 12 l = sock.sendAndReceive(buf, l, SMARTREST_SIZE);
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 96:5dfdc8568e9f 25 int l = snprintf(buf2, SMARRESTBODY_SIZE, "81,%s,/%s\r\n", bayeuxId, chn);
xinlei 99:e369fc75c000 26 l = snprintf(buf, SMARTREST_SIZE, fmtSmartRest, uri, l, buf2);
xinlei 99:e369fc75c000 27 sock.set_blocking(false);
xinlei 99:e369fc75c000 28 l = sock.sendOnly(buf, l, SMARTREST_SIZE);
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 96:5dfdc8568e9f 34 int l = snprintf(buf2, SMARRESTBODY_SIZE, "83,%s\r\n", bayeuxId);
xinlei 99:e369fc75c000 35 l = snprintf(buf, SMARTREST_SIZE, fmtSmartRest, uri, l, buf2);
xinlei 99:e369fc75c000 36 sock.set_blocking(true);
xinlei 96:5dfdc8568e9f 37 l = sock.sendAndReceive(buf, l, SMARTREST_SIZE);
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 aInfo("Poll thread: %p\n", Thread::gettid());
xinlei 96:5dfdc8568e9f 45 while (true) {
xinlei 96:5dfdc8568e9f 46 switch (state) {
xinlei 96:5dfdc8568e9f 47 case 1: if (!handshake()) {
xinlei 96:5dfdc8568e9f 48 aCritical("Poll: handshake fail!\n");
xinlei 96:5dfdc8568e9f 49 break;
xinlei 96:5dfdc8568e9f 50 }
xinlei 96:5dfdc8568e9f 51 case 2: if(!subscribe()) {
xinlei 96:5dfdc8568e9f 52 aCritical("Poll: subscribe fail!\n");
xinlei 96:5dfdc8568e9f 53 state = 1;
xinlei 96:5dfdc8568e9f 54 break;
xinlei 96:5dfdc8568e9f 55 }
xinlei 96:5dfdc8568e9f 56 case 3: if(!connect()) {
xinlei 96:5dfdc8568e9f 57 aCritical("Poll: connect fail!\n");
xinlei 96:5dfdc8568e9f 58 state = 1;
xinlei 96:5dfdc8568e9f 59 break;
xinlei 96:5dfdc8568e9f 60 }
xinlei 99:e369fc75c000 61 default: parser.parse(buf);
xinlei 96:5dfdc8568e9f 62 if (parser.getBayeuxAdvice() == BA_HANDSHAKE)
xinlei 96:5dfdc8568e9f 63 state = 1;
xinlei 96:5dfdc8568e9f 64 else
xinlei 96:5dfdc8568e9f 65 state = 3;
xinlei 96:5dfdc8568e9f 66 }
xinlei 96:5dfdc8568e9f 67 }
xinlei 96:5dfdc8568e9f 68 }