Revised Erbium observing.

This commit is contained in:
Matthias Kovatsch 2012-02-01 03:24:49 +01:00
parent 4a02790c76
commit dc6142fa0b
8 changed files with 79 additions and 76 deletions

View file

@ -58,7 +58,7 @@ LIST(observers_list);
/*-----------------------------------------------------------------------------------*/
coap_observer_t *
coap_add_observer(const char *url, uip_ipaddr_t *addr, uint16_t port, const uint8_t *token, size_t token_len)
coap_add_observer(uip_ipaddr_t *addr, uint16_t port, const uint8_t *token, size_t token_len, const char *url)
{
coap_observer_t *o = memb_alloc(&observers_memb);
@ -173,7 +173,7 @@ coap_observe_handler(resource_t *resource, void *request, void *response)
{
if (IS_OPTION((coap_packet_t *)request, COAP_OPTION_TOKEN))
{
if (coap_add_observer(resource->url, &UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport, ((coap_packet_t *)request)->token, ((coap_packet_t *)request)->token_len))
if (coap_add_observer(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport, ((coap_packet_t *)request)->token, ((coap_packet_t *)request)->token_len, resource->url))
{
coap_set_header_observe(response, 0);
coap_set_payload(response, (uint8_t *)content, snprintf(content, sizeof(content), "Added as observer %u/%u", list_length(observers_list), COAP_MAX_OBSERVERS));

View file

@ -65,7 +65,7 @@ typedef struct coap_observer {
} coap_observer_t;
list_t coap_get_observers(void);
coap_observer_t *coap_add_observer(const char *url, uip_ipaddr_t *addr, uint16_t port, const uint8_t *token, size_t token_len);
coap_observer_t *coap_add_observer(uip_ipaddr_t *addr, uint16_t port, const uint8_t *token, size_t token_len, const char *url);
void coap_remove_observer(coap_observer_t *o);
int coap_remove_observer_by_client(uip_ipaddr_t *addr, uint16_t port);
int coap_remove_observer_by_token(uip_ipaddr_t *addr, uint16_t port, uint8_t *token, size_t token_len);

View file

@ -745,7 +745,7 @@ coap_set_header_uri_query(void *packet, const char *query)
/*- PAYLOAD -------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------*/
int
coap_get_payload(void *packet, const uint8_t **payload)
coap_get_payload(void *packet, uint8_t **payload)
{
if (((coap_packet_t *)packet)->payload) {
*payload = ((coap_packet_t *)packet)->payload;
@ -757,11 +757,11 @@ coap_get_payload(void *packet, const uint8_t **payload)
}
int
coap_set_payload(void *packet, uint8_t *payload, size_t length)
coap_set_payload(void *packet, const void *payload, size_t length)
{
PRINTF("setting payload (%u/%u)\n", length, REST_MAX_CHUNK_SIZE);
((coap_packet_t *)packet)->payload = payload;
((coap_packet_t *)packet)->payload = (uint8_t *) payload;
((coap_packet_t *)packet)->payload_len = MIN(REST_MAX_CHUNK_SIZE, length);
return ((coap_packet_t *)packet)->payload_len;

View file

@ -278,7 +278,7 @@ int coap_set_header_block(void *packet, uint32_t num, uint8_t more, uint16_t siz
int coap_get_header_uri_query(void *packet, const char **query); /*CAUTION in-place string might not be 0-terminated */
int coap_set_header_uri_query(void *packet, const char *query);
int coap_get_payload(void *packet, const uint8_t **payload);
int coap_set_payload(void *packet, uint8_t *payload, size_t length);
int coap_get_payload(void *packet, uint8_t **payload);
int coap_set_payload(void *packet, const void *payload, size_t length);
#endif /* COAP_03_H_ */

View file

@ -225,8 +225,8 @@ handle_incoming_data(void)
/* Cancel possible subscriptions. */
if (IS_OPTION(message, COAP_OPTION_TOKEN))
{
PRINTF(" Token 0x%02X%02X\n", message->token[0], message->token[1]);
coap_remove_observer_by_token(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport, message->token, message->token_len);
/* RST must be empty, so it is a full client reset. */
coap_remove_observer_by_client(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport);
}
}

View file

@ -58,7 +58,7 @@ LIST(observers_list);
/*-----------------------------------------------------------------------------------*/
coap_observer_t *
coap_add_observer(const char *url, uip_ipaddr_t *addr, uint16_t port, const uint8_t *token, size_t token_len)
coap_add_observer(uip_ipaddr_t *addr, uint16_t port, const uint8_t *token, size_t token_len, const char *url)
{
coap_observer_t *o = memb_alloc(&observers_memb);
@ -125,7 +125,7 @@ coap_remove_observer_by_token(uip_ipaddr_t *addr, uint16_t port, uint8_t *token,
return removed;
}
int
coap_remove_observer_by_url(const char *url)
coap_remove_observer_by_url(uip_ipaddr_t *addr, uint16_t port, const char *url)
{
int removed = 0;
coap_observer_t* obs = NULL;
@ -133,7 +133,7 @@ coap_remove_observer_by_url(const char *url)
for (obs = (coap_observer_t*)list_head(observers_list); obs; obs = obs->next)
{
PRINTF("Remove check URL %p\n", url);
if (obs->url==url || memcmp(obs->url, url, strlen(obs->url))==0)
if (uip_ipaddr_cmp(&obs->addr, addr) && obs->port==port && (obs->url==url || memcmp(obs->url, url, strlen(obs->url))==0))
{
coap_remove_observer(obs);
removed++;
@ -189,17 +189,21 @@ coap_observe_handler(resource_t *resource, void *request, void *response)
coap_packet_t *const coap_req = (coap_packet_t *) request;
coap_packet_t *const coap_res = (coap_packet_t *) response;
static char content[26];
static char content[16];
if (coap_req->code==COAP_GET && coap_res && coap_res->code<128) /* GET request and response without error code */
if (coap_req->code==COAP_GET && coap_res->code<128) /* GET request and response without error code */
{
if (IS_OPTION(coap_req, COAP_OPTION_OBSERVE))
{
if (coap_add_observer(resource->url, &UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport, coap_req->token, coap_req->token_len))
if (coap_add_observer(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport, coap_req->token, coap_req->token_len, resource->url))
{
coap_set_header_observe(coap_res, 0);
coap_set_payload(coap_res, content, snprintf(content, sizeof(content), "Added as observer %u/%u", list_length(observers_list), COAP_MAX_OBSERVERS));
/*
* For demonstration purposes only. A subscription should return the same representation as a normal GET.
* TODO: Comment the following line for any real application.
*/
coap_set_payload(coap_res, content, snprintf(content, sizeof(content), "Added %u/%u", list_length(observers_list), COAP_MAX_OBSERVERS));
}
else
{
@ -210,7 +214,7 @@ coap_observe_handler(resource_t *resource, void *request, void *response)
else /* if (observe) */
{
/* Remove client if it is currently observing. */
coap_remove_observer_by_client(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport);
coap_remove_observer_by_url(&UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport, resource->url);
} /* if (observe) */
}
}

View file

@ -66,12 +66,12 @@ typedef struct coap_observer {
list_t coap_get_observers(void);
coap_observer_t *coap_add_observer(const char *url, uip_ipaddr_t *addr, uint16_t port, const uint8_t *token, size_t token_len);
void coap_remove_observer(coap_observer_t *o);
coap_observer_t *coap_add_observer(uip_ipaddr_t *addr, uint16_t port, const uint8_t *token, size_t token_len, const char *url);
void coap_remove_observer(coap_observer_t *o);
int coap_remove_observer_by_client(uip_ipaddr_t *addr, uint16_t port);
int coap_remove_observer_by_token(uip_ipaddr_t *addr, uint16_t port, uint8_t *token, size_t token_len);
int coap_remove_observer_by_url(const char *url);
int coap_remove_observer_by_url(uip_ipaddr_t *addr, uint16_t port, const char *url);
void coap_notify_observers(const char *url, int type, uint32_t observe, uint8_t *payload, size_t payload_len);