Как реализовать coap обозреватель с block2 в ОС Contiki - PullRequest
0 голосов
/ 06 ноября 2019

Сначала я объясню настройку;

Установка: у меня есть плата микроконтроллера, на которой запущен сервер 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).

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Для «начальной загрузки» вашей разработки вы можете использовать Eclipse / Californium . Простой клиент в demo-apps / cf-helloworld-client требует некоторых изменений для наблюдения. Если вам нужна помощь, просто откройте проблему в github.

Имея двухлетний опыт работы с этой функцией, позвольте мне упомянуть, что, если ваши данные изменяются быстрее, чем ваша «пропускная способность» может передавать (включаярассмотренный RTT для блоков), вы можете отправить много блоков напрасно. Если данные изменяются чуть быстрее, чем может быть отправлен ваш последний блок, это делает недействительной полную передачу. Некоторые начинают тогда разрабатывать свое решение, но с этого ты на очень тонком льду :-).

0 голосов
/ 06 ноября 2019

Я не могу много рассказать о конкретных системах, которые вы используете, но в целом комбинация блочной передачи и наблюдений работает в том смысле, что сервер отправляет только первый блок обновленного ресурса. Затем клиент должен запросить оставшиеся блоки и убедиться, что их параметры ETag совпадают.

Код contiki выглядит так, как будто его должно быть достаточно, поскольку он устанавливает смещение -1, что, вероятно, устанавливаетбит «больше данных» в заголовке блока.

На стороне coapython может потребоваться выполнить повторную сборку вручную или попросить, чтобы coapython выполнял повторную сборку автоматически (его код не означает, что он будет поддерживатьсочетание блочных и наблюдать, по крайней мере, не с первого взгляда).

...