Сначала я объясню настройку;
Установка: у меня есть плата микроконтроллера, на которой запущен сервер Coap rest (с использованием ОС Contiki) с наблюдаемым ресурсом и клиент (с использованием библиотеки Coapthon - python для Coap), наблюдающий за этим ресурсом, работающим на SOM Linux. Я успешно могу наблюдать небольшое количество данных (64 байта) с сервера (микроконтроллер) на клиент (Linux SOM). Я добавлю код в конце после описания всего.
Вопрос: Мне нужна помощь в отправке большого количества данных (предположительно 1024 байта) с сервера Coap клиентскому наблюдателю. Как я могу это сделать (заранее спасибо за любую помощь, буду признателен за любую помощь, которую я могу получить по этому поводу)?
Я публикую код наблюдаемого ресурса Contiki и код клиента coapthon (я пишукод, который не отправляет большие данные). Код Contiki:
char * temp_payload = "Behold empty data";
PERIODIC_RESOURCE(res_periodic_ext_temp_data,
"title=\"Temperature\";rt=\"Temperature\";obs",
res_get_handler_of_periodic_ext_temp_data,
NULL,
NULL,
res_delete_handler_ext_temp_data,
(15*CLOCK_SECOND),
res_periodic_handler_of_ext_temp_data);
static void
res_get_handler_of_periodic_ext_temp_data(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
{
/*
* For minimal complexity, request query and options should be ignored for GET on observable resources.
* Otherwise the requests must be stored with the observer list and passed by REST.notify_subscribers().
* This would be a TODO in the corresponding files in contiki/apps/erbium/!
*/
/* Check the offset for boundaries of the resource data. */
if(*offset >= 1024) {
REST.set_response_status(response, REST.status.BAD_OPTION);
/* A block error message should not exceed the minimum block size (16). */
const char *error_msg = "BlockOutOfScope";
REST.set_response_payload(response, error_msg, strlen(error_msg));
return;
}
REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
REST.set_response_payload(response,(temp_payload + *offset), MIN( (int32_t)strlen(temp_payload) - *offset, preferred_size));
REST.set_response_status(response, REST.status.OK);
/* IMPORTANT for chunk-wise resources: Signal chunk awareness to REST engine. */
*offset += preferred_size;
/* Signal end of resource representation. */
if(*offset >= (int32_t)strlen( temp_payload) + 1) {
*offset = -1;
}
REST.set_header_max_age(response, MAX_AGE);
}
Я не добавляю код для периодического обработчика, обработчик get получает уведомления от периодического обработчика периодически. Код Coapthon:
def ext_temp_data_callback_observe(response):
print response.pretty_print()
def observe_ext_temp_data(host, callback):
client = HelperClient(server=(host, port))
request = Request()
request.code = defines.Codes.GET.number
request.type = defines.Types["CON"]
request.destination = (host, port)
request.uri_path = "data/res_periodic_ext_temp_data"
request.content_type = defines.Content_types["text/plain"]
request.observe = 0
request.block2 = (0, 0, 64)
try:
response = client.send_request(request, callback)
print response.pretty_print()
except Empty as e:
print("listener_post_observer_rate_of_change({0}) timed out". format(host))
Опять же, мне нужна помощь во внедрении наблюдателя с параллельной передачей coap block (https://tools.ietf.org/html/rfc7959#page-26).