Own fork of MbedSmartRestMain

Dependencies:   C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed

Fork of MbedSmartRestMain by Cumulocity Official

Committer:
xinlei
Date:
Mon Jun 01 13:01:11 2015 +0000
Revision:
126:871e6eb0fa76
Parent:
125:e1fcf720c63a
Child:
129:dc9e37d4bc05
polling: timeout for long polling set to 610 seconds

Who changed what in which revision?

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