# CoAP

CoAP (acrónimo inglés de Constrained Application Protocol) es un protocolo de la capa de aplicación de internet para dispositivos con recursos restringidos. CoAP permite que dispositivos con pocos recursos se puedan comunicar con cualquier nodo de Internet. CoAP es un protocolo de capa de aplicación dirigido a la internet de las cosas.

## Propiedades

* El núcleo del protocolo está basado en la especificación internet RFC 7252 realizada por The Internet Engineering Task Force (IETF).
* La eficiencia de la comunicación es muy importante, por tanto CoAP utiliza el protocolo de transporte UDP. Los errores y reintentos de mensajes se gestionan desde la capa de aplicación.
* COAP es un protocolo que sigue el modelo cliente/servidor.
* Opcionalmente emplea la seguridad DTLS (Datagram Transport Layer Security) que es la implementación del protocolo SSL sobre el protocolo UDP.

## Implementaciones

| Nombre | Lenguaje de programación | Versión CoAP implementada | Cliente/Servidor | Funcionalidades CoAP implementadas | Licencia | Enlace |
| aiocoap | Python 3 | RFC 7252 | Client + Server | Blockwise Transfers, Observe (parcial) | MIT | https://pypi.python.org/pypi/aiocoap |
| Californium | Java | RFC 7252 | Client + Server | Observe, Blockwise Transfers, DTLS | EPL+EDL | https://www.eclipse.org/californium |
| cantcoap | C++/C | RFC 7252 | Client + Server | | BSD | https://github.com/staropram/cantcoap |
| Canopus | Go | RFC 7252 | Client + Server | Core | Apache License 2.0 | https://github.com/zubairhamed/canopus |
| CoAP implementation for Go | Go | RFC 7252 | Client + Server | Core + Draft Subscribe | MIT | https://github.com/dustin/go-coap |
| CoAP.NET | C# | RFC 7252, coap-13, coap-08, coap-03 | Client + Server | Core, Observe, Blockwise Transfers | 3-clause BSD | https://github.com/smeshlink/CoAP.NET |
| CoAPSharp | C#, .NET | RFC 7252 | Client + Server | Core, Observe, Block, RD | LGPL | http://www.coapsharp.com |
| CoAPthon | Python | RFC 7252 | Client + Server + Forward Proxy + Reverse Proxy | Observe, Multicast server discovery, CoRE Link Format parsing, Block-wise | MIT | https://github.com/Tanganelli/CoAPthon |
| Copper | JavaScript (Browser Plugin) | RFC 7252 | Client | Observe, Blockwise Transfers | 3-clause BSD | https://github.com/mkovatsc/Copper https://addons.mozilla.org/firefox/addon/copper-270430/ (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última). |
| eCoAP | C | RFC 7252 | Client + Server | Core | MIT | https://gitlab.com/jobol/ecoap |
| Erbium for Contiki | C | RFC 7252 | Client + Server | Observe, Blockwise Transfers | 3-clause BSD | http://www.contiki-os.org/ (er-rest-example) |
| iCoAP | Objective-C | RFC 7252 | Client | Core, Observe, Blockwise Transfers | MIT | https://github.com/stuffrabbit/iCoAP |
| jCoAP | Java | RFC 7252 | Client + Server | Observe, Blockwise Transfers | Apache License 2.0 | https://code.google.com/p/jcoap/ |
| libcoap | C | RFC 7252 | Client + Server | Observe, Blockwise Transfers, DTLS | BSD/GPL | http://sourceforge.net/projects/libcoap/develop |
| LibNyoci | C | RFC 7252 | Client + Server | Core, Observe, Block, DTLS | MIT | https://github.com/darconeous/libnyoci |
| lobaro-coap | C | RFC 7252 | Client + Server | Observe, Blockwise Transfers | MIT | http://www.lobaro.com/lobaro-coap |
| microcoap | C | RFC 7252 | Client + Server | | MIT | https://github.com/1248/microcoap |
| nCoap | Java | RFC 7252 | Client + Server | Observe, Blockwise Transfers, CoRE Link Format, Endpoint-ID-Draft | BSD | https://github.com/okleine/nCoAP |
| node-coap | Javascript | RFC 7252 | Client + Server | Core, Observe, Block | MIT | https://github.com/mcollina/node-coap |
| Ruby coap | Ruby | RFC 7252 | Client + Server (david) | Core, Observe, Block, RD | MIT, GPL | https://github.com/nning/coap https://github.com/nning/david |
| Sensinode C Device Library | C | RFC 7252 | Client + Server | Core, Observe, Block, RD | Comercial | https://silver.arm.com/browse/SEN00 |
| Sensinode Java Device Library | Java SE | RFC 7252 | Client + Server | Core, Observe, Block, RD | Comercial | https://silver.arm.com/browse/SEN00 |
| Sensinode NanoService Platform | Java SE | RFC 7252 | Cloud Server | Core, Observe, Block, RD | Comercial | https://silver.arm.com/browse/SEN00 |
| SwiftCoAP | Swift | RFC 7252 | Client + Server | Core, Observe, Blockwise Transfers | MIT | https://github.com/stuffrabbit/SwiftCoAP |
| TinyOS CoapBlip | nesC/C | coap-13 | Client + Server | Observe, Blockwise Transfers | BSD | http://docs.tinyos.net/tinywiki/index.php/CoAP Archivado el 12 de marzo de 2013 en Wayback Machine. |
| txThings | Python (Twisted) | RFC 7252 | Client + Server | Blockwise Transfers, Observe (partial) | MIT | https://github.com/mwasilak/txThings/ |
| FreeCoAP | C | RFC 7252 | Client + Server + HTTP/CoAP Proxy | Core, DTLS, Blockwise Transfers | BSD | http://www.freecoap.org Archivado el 24 de marzo de 2017 en Wayback Machine. |
| coap-rs | Rust | RFC 7252 | Client + Server | | MIT | https://github.com/Covertness/coap-rs |

## Comunicaciones en grupo con CoAP

En muchas aplicaciones CoAP es esencial tener la posibilidad de comunicarse con diferentes nodos al mismo tiempo (por ejemplo para apagar o encender todas las luces a la vez). CoAP solventa esta necesidad con unas extensiones definidas en la recomendación RFC 7390 que implementa una difusión múltiple (multicast) a todos los nodos del grupo.