Skip to content

Commit 71e2b5f

Browse files
author
Zachary Crockett
committed
Merge pull request #10 from spark/feature/ack-server-pings
Ack server pings for faster closure of half-open sockets
2 parents ab713dd + 64ae668 commit 71e2b5f

File tree

3 files changed

+47
-6
lines changed

3 files changed

+47
-6
lines changed

src/coap.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,15 @@ CoAPCode::Enum CoAP::code(const unsigned char *message)
3535
default: return CoAPCode::ERROR;
3636
}
3737
}
38+
39+
CoAPType::Enum CoAP::type(const unsigned char *message)
40+
{
41+
switch (message[0] & 0x30)
42+
{
43+
case 0x00: return CoAPType::CON;
44+
case 0x10: return CoAPType::NON;
45+
default:
46+
case 0x20: return CoAPType::ACK;
47+
case 0x30: return CoAPType::RESET;
48+
}
49+
}

src/coap.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ namespace CoAPMessageType {
3434
KEY_CHANGE,
3535
SIGNAL_START,
3636
SIGNAL_STOP,
37-
EMPTY,
37+
EMPTY_ACK,
38+
PING,
3839
ERROR
3940
};
4041
}
@@ -49,8 +50,18 @@ namespace CoAPCode {
4950
};
5051
}
5152

53+
namespace CoAPType {
54+
enum Enum {
55+
CON,
56+
NON,
57+
ACK,
58+
RESET
59+
};
60+
}
61+
5262
class CoAP
5363
{
5464
public:
5565
static CoAPCode::Enum code(const unsigned char *message);
66+
static CoAPType::Enum type(const unsigned char *message);
5667
};

src/spark_protocol.cpp

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ CoAPMessageType::Enum
287287
case 'u': return CoAPMessageType::UPDATE_BEGIN;
288288
case 'c': return CoAPMessageType::CHUNK;
289289
default: break;
290-
} break;
290+
} break;
291291
case CoAPCode::PUT:
292292
switch (path)
293293
{
@@ -297,10 +297,13 @@ CoAPMessageType::Enum
297297
if (buf[8]) return CoAPMessageType::SIGNAL_START;
298298
else return CoAPMessageType::SIGNAL_STOP;
299299
default: break;
300-
} break;
300+
} break;
301301
case CoAPCode::EMPTY:
302-
return CoAPMessageType::EMPTY;
303-
break;
302+
switch (CoAP::type(buf))
303+
{
304+
case CoAPType::CON: return CoAPMessageType::PING;
305+
default: return CoAPMessageType::EMPTY_ACK;
306+
} break;
304307
default:
305308
break;
306309
}
@@ -449,7 +452,10 @@ int SparkProtocol::variable_value(unsigned char *buf,
449452
bool SparkProtocol::send_event(const char *event_name, const char *data,
450453
int ttl, EventType::Enum event_type)
451454
{
452-
static system_tick_t recent_event_ticks[5] = { -1000, -1000, -1000, -1000, -1000 };
455+
static system_tick_t recent_event_ticks[5] = {
456+
(system_tick_t) -1000, (system_tick_t) -1000,
457+
(system_tick_t) -1000, (system_tick_t) -1000,
458+
(system_tick_t) -1000 };
453459
static int evt_tick_idx = 0;
454460

455461
system_tick_t now = recent_event_ticks[evt_tick_idx] = callback_millis();
@@ -953,6 +959,18 @@ bool SparkProtocol::handle_received_message(void)
953959
descriptor.ota_upgrade_status_sent();
954960
break;
955961

962+
case CoAPMessageType::PING:
963+
*msg_to_send = 0;
964+
*(msg_to_send + 1) = 16;
965+
empty_ack(msg_to_send + 2, queue[2], queue[3]);
966+
if (0 > blocking_send(msg_to_send, 18))
967+
{
968+
// error
969+
return false;
970+
}
971+
break;
972+
973+
case CoAPMessageType::EMPTY_ACK:
956974
case CoAPMessageType::ERROR:
957975
default:
958976
; // drop it on the floor

0 commit comments

Comments
 (0)