CoAP — для тех у кого мало ресурсов

Продолжая тему протоколов интернета вещей в этот раз рассмотрим второй по распространённости после MQTT протокол — CoAP.

CoAP (Constrained Application Protocol) был разработан для решения задачи взаимодействия устройств с ограниченными ресурсами. Практически все конечные устройства интернета вещей можно отнести к этому определению. И именно такие устройства выполняют основную работ. Концепция CoAP значительно отличается от MQTT и ориентирован на взаимодействие точка-точка (клиент-сервер). Клиент обращается к серверу и посылает ему простые команды типа PUT, POST, GET, DELETE, смысл которых понятен из названия и аналогичен HTTP. С этой точки зрения можно сказать «с упрощениями», что COAP — это такой упрощённый HTTP у которого мало ресурсов. В результате стоит отметить лёгкую и простую интеграцию CoAP c HTTP. Обычный пользователь через браузер может интегрировать систему управления устройствами интернета вещей в обычное web-приложение и не замечать этого, а в некоторых случаях даже и не догадываться об этом. С этой точки зрения протокол соответствует требованиям RESTfull.

Рассмотрим работу с CoAP на практике. Одним из первых вопросов, которые возникают в процессе освоения CoAP является практически полное отсутствие графических инструментов для работы с ним. Существует достаточно много реализаций под различные языки программирования и платформы. Однако практически все они представляют решение в виде библиотек соответствующих стандарту RFC 7252. Среди инструментов стоит отметить плагин Copper для Firefox. Однако начиная с 56 версии и перехода на технологию WebExtension, он перестал работать. В качестве альтернативы можно назвать Cu4Cr (Correr4Chrome) предназначенный, как не трудно догадаться, для браузера от Google. Однако, его установка не так проста и очевидна, как была ранее для Firefox. Необходимо выполнить действия согласно инструкции. После этого можно будет взаимодействовать с CoAP-сервером прямо из браузера.

Cu4Cr

Рассмотрим работу по протоколу CoAP на Python. Будем использовать aiocoap, как наиболее современную и перспективную библиотеку. К сожалению стандартные примеры не запускаются, поэтому были немного доработаны.
В качестве основы взят демо-сервер из стартовой инструкции. Будем обращаться к нему через localhost (см. uri). Так как aiocoap реализован на базе asyncio, то он наследует от него принципы построения и все функции должны быть определены, как async. В дальнейшем всё достаточно просто — открываем контекст, отправляем сообщение с кодом команды, нагрузкой и адресом, в ответ ждём результат (который как раз приходит асинхронно).

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import asyncio
import logging
import aiocoap

logging.basicConfig(level=logging.INFO)

# CoAP message codes
Code = aiocoap.numbers.codes.Code

async def CoAP_request(code, uri, payload=None):
protocol = await aiocoap.Context.create_client_context()

if payload:
request = aiocoap.Message(code=code, uri=uri, payload=payload)
else:
request = aiocoap.Message(code=code, uri=uri)

try:
response = await protocol.request(request).response
except Exception as e:
print('Failed to fetch resource:')
print(e)
else:
print ("Result code:", response.code,"\n",
"Payload:", response.payload)

if __name__ == "__main__":
asyncio.get_event_loop().run_until_complete(CoAP_request(
code=Code.GET,
uri='coap://localhost/other/block'
))

asyncio.get_event_loop().run_until_complete(CoAP_request(
code=Code.PUT,
uri='coap://localhost/other/block',
payload = b"yyy yyy yyy\n" * 100
))

asyncio.get_event_loop().run_until_complete(CoAP_request(
code=Code.GET,
uri='coap://localhost/other/block',
))

asyncio.get_event_loop().run_until_complete(CoAP_request(
code=Code.PUT,
uri='coap://localhost/other/block',
payload = b"xxx xxx xxx\n" * 100
))

asyncio.get_event_loop().run_until_complete(CoAP_request(
code=Code.GET,
uri='coap://localhost/time',
))

В результате выполнения данного кода читаем (GET) значение по умолчанию, записываем (PUT) новое значение, ещё раз читаем (GET) обновленное значение и перезаписываем другим сообщением (PUT). 2.05 Content означет — корректный ответ с содержимым, 2.04 Changed — что значение было изменено. В результате вывод должен выгляд следующим образом:

Result code: 2.05 Content
Payload: b"This is the resource's default content. It is padded with numbers to be large enough to trigger blockwise transfer.\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n0123456789\n"
Result code: 2.04 Changed
Payload: b'yyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\n'
Result code: 2.05 Content
Payload: b'yyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\nyyy yyy yyy\n'
Result code: 2.04 Changed
Payload: b'xxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\nxxx xxx xxx\n'
Result code: 2.05 Content
Payload: b'2018-05-13 14:37'

В данной статье мы кратно рассмотрели протокол CoAP и работа с CoAP-сервером через Python. Можно отметить, что данный протокол нашёл широкое распространение в конечных устройствах интернета вещей из-за своей простоты и нетребовательности. А также то, что при помощи него можно легко интегрировать IoT устройство с большинством сервисов, так как он соответствует требованиям REST.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

w

Connecting to %s