**پروتکل برنامه‌های محدودشده** (به انگلیسی: Constrained Application Protocol) یا به اختصار (**CoAP**) یک پروتکل نرم‌افزاری اینترنتی ویژه است که در RFC 7252 به‌طور دقیق تعریف شده؛ که قادر می‌سازد تعدادی دستگاه محدود را که در شبکه node نامیده می‌شوند به شبکه وسیع تری دست پیدا کنند که همگی از یک پروتکل استفاده می‌کنند. CoAP برای استفاده بین دستگاه‌ها در یک شبکه محدود، (به عنوان مثال شبکه‌های کم مصرف، شبکه‌های با اتلاف بالا) بین دستگاه‌ها و nodeهای اصلی در اینترنت، بین دستگاه‌ها در شبکه‌های محدود مختلف که به اینترنت متصل هستند، طراحی شده‌است.CoAP از طریق مکانیسم‌های دیگر مانند اس‌ام‌اس در موبایل، شبکه‌های مخابراتی و… نیز استفاده می‌شود.

CoAP یک پروتکل سرویس لایه است که برای استفاده از منابع محدود و دستگاه‌های اینترنتی در نظر گرفته شده‌است، مانند حسگر بی‌سیم شبکه. CoAP به گونه ای طراحی شده‌است به راحتی به HTTP ترجمه می‌شود. تا به سادگی وب سایت‌ها قرار گیرد، در عین حال با توجه به نیازهای تخصصی را پاسخ گو است که از قبیل :پشتیبانی از چندپخشی، کم بودن تداخلات و سادگی. چندبخشی بودن، تداخلات کم و سادگی، برای اینترنت اشیاء (IoT) و ارتباط ماشین به ماشین (M2M) بسیار مهم هستند چرا که تمایل به تعبیه عمیق در دستگاهایی با تغذیه و حافظه بسیار کمتر از دستگاه سنتی اینترنتی را دارند؛ بنابراین بهره‌وری بسیار مهم است. CoAP می‌تواند بر روی اکثر دستگاه‌هایی که پشتیبانی از بی‌سیم یا بی‌سیم آنالوگ اجرا شود.

(Internet Engineering Task Force (IETF محیط‌های کاری (RESTful (Representational state transfer توسط گروه (CoRE) انجام داده‌است عمده این استانداردسازی کار برای این پروتکل است. به منظور ایجاد پروتکل مناسب برای IoT و M2M برنامه‌های مختلف ویژگی‌های جدید اضافه شده‌اند. هسته اصلی این پروتکل، در RFC 7252 مشخص شده؛ الحاقات مهمی و در مراحل مختلف استانداردسازی این روند هستند.

ویژگی‌ها
--------

nodeها اغلب دارای میکروکنترلر ۸ بیتی با مقدار کمی از ROM و RAM هستند در حالی که شبکه‌های محدود مانند IPv6 بیش Low-Power Wireless Personal Area Networks (6LoWPANs) اغلب بسته با نرخ خطای بالا هستند. این پروتکل برای طراحی ماشین به ماشین (M2M) و برنامه‌های کاربردی مانند انرژی هوشمند و اتوماسیون ساختمان طراحی شده‌است. 

گروهCoAP , CoRE را با ویژگی‌های زیر طراحی کردند:

* Overhead and parsing complexity.
* URI and content-type support.
* Support for the discovery of resources provided by known CoAP services.
* Simple subscription for a resource, and resulting push notifications.
* Simple caching based on max-age.

طراحی CoAP با HTTP نیز تعریف شده، که اجازه می‌دهد پروکسی ای ساخته شود تا دسترسی به منابع CoAP از طریق HTTP را در یک راه ممکن سازد.

با معرفی ای از CoAP، شبکه کاملی از پروتکل قابل دسترس عموم قرار گرفت تا بتوان با استانداردهای مناسب دستگاه‌ها محدود کرد و محیط‌هایی را قابل دسترس کند.

از دیدگاه معماری، CoAP server در آخرین node نصب خواهد شد، که می‌تواند یک سنسور باشد. از سوی دیگر این CoAP client باید بر بر روی کنترلر نصب شده باشد، که چندین node پایانی را مدیریت کند.

Message formats
---------------

CoAP از دو نوع پیام استفاده می‌کند: درخواست و پاسخ(requests and responses)، با استفاده از یک روش ساده باینری با یک هِدر مشخص. هدر پایه ممکن است با گزینه‌هایی نوع-ارزش فرمت بهینه شده باشد.CoAP به‌طور پیش فرض محدود به UDP و به صورت اختیاری به DTLS ارتقا میابد تا سطح بالایی از ارتباطات ایمن را فراهم کند.

هر بایت بعد از این هدرها در این بسته حاوی پیام بدنه (پیام اصلی) است. طول پیام بدنه توسط نمودار داده‌ها تعیین می‌شود. زمانی که به UDPمحدود می‌شود، کل پیام باید نمودار داده(datagram) قرار داده شود. هنگامی که از 6LoWPAN استفاده می‌شود، همان‌طور که در RFC 4944 تعریف شده، پیام‌ها باید در یک قاب IEEE 802.15.4 قرار گیرند تا تقسیم‌بندی بسته‌ها را به حداقل برسانند.

### CoAP Request/Response Code

| بایت |
| --- |
| ۰ | ۱ | ۲ | ۳ | ۴ | ۵ | ۶ | ۷ |
| کلاس | کد |

و در اسناد و مدارک است که معمولاً مورد اشاره در این قالب `<class>`. `<کد>`

#### CoAP Registed Codes

شما می‌توانید تمام آخرین CoAP ثبت نام کد: 

\* Method: 0.XX

```
 - 0: EMPTY
```

```
 - 1: GET
```

```
 - 2: POST
```

```
 - 3: PUT
```

```
 - 4: DELETE
```

```
 - 5: FETCH
```

```
 - 6: PATCH
```

```
 - 7: iPATCH
```

\* Success: 2.XX

```
 - 1: Created
```

```
 - 2: Deleted
```

```
 - 3: Valid
```

```
 - 4: Changed
```

```
 - 5: Content
```

```
 - 31: Continue
```

\* Client Error: 4.XX

```
 - 0: Bad Request
```

```
 - 1: Unauthorized
```

```
 - 2: Bad Option
```

```
 - 3: Forbidden
```

```
 - 4: Not Found
```

```
 - 5: Method Not Allowed
```

```
 - 6: Not Acceptable
```

```
 - 8: Request Entity Incomplete
```

```
 - 9: Conflict
```

```
 - 12: Precondition Failed
```

```
 - 13: Request Entity Too Large
```

```
 - 15: Unsupported Content-Format
```

\* Server Error: 5.XX

```
 - 0: Internal Server Error
```

```
 - 1: Not Implemented
```

```
 - 2: Bad Gateway
```

```
 - 3: Service Unavailable
```

```
 - 4: Gateway Timeout
```

```
 - 5: Proxying Not Supported
```

\* Signaling Codes: 7.XX

```
 - 0: Unassigned
```

```
 - 1: CSM
```

```
 - 2: Ping
```

```
 - 3: Pong
```

```
 - 4: Release
```

```
 - 5: Abort
```

### CoAP ساختار پیام

CoAP ساختار پیام| بایت | بایت | بایت | بایت |
| --- | --- | --- | --- |
| ۰ | ۱ | ۲ | ۳ | ۴ | ۵ | ۶ | ۷ | ۰ | ۱ | ۲ | ۳ | ۴ | ۵ | ۶ | ۷ | ۰ | ۱ | ۲ | ۳ | ۴ | ۵ | ۶ | ۷ | ۰ | ۱ | ۲ | ۳ | ۴ | ۵ | ۶ | ۷ |
| VER | نوع | TKL (Token ظهر) | CoAP درخواست/کد پاسخ | پیام شناسه |
| رمز (در صورت وجود در TKL بایت) (حداکثر ۸ بایت) |
| گزینه (اگر در دسترس است) (گزینه شماره: https://www.iana.org/assignments/core-parameters/core-parameters.xhtml#option-numbers) |
| ۱ | ۱ | ۱ | ۱ | ۱ | ۱ | ۱ | ۱ | حمل بار (اگر در دسترس است) |

این CoAP هدر ثابت است ۴ بایت. این اجازه می‌دهد تا برای کوچکترین CoAP پیام به ۴ بایت طول دارد اگر حذف رمز و گزینه‌های حمل بار.

شما به راحتی می‌توانید استخراج اطلاعات از هدر ثابت در C از طریق این ماکروها:

```
#define COAP\_HEADER\_VERSION(data) ( (0xC0 & data[0])>>6 )
#define COAP\_HEADER\_TYPE(data) ( (0x30 & data[0])>>4 )
#define COAP\_HEADER\_TKL(data) ( (0x0F & data[0])>>0 )
#define COAP\_HEADER\_CLASS(data) ( ((data[1]>>5)&0x07) )
#define COAP\_HEADER\_CODE(data) ( ((data[1]>>0)&0x1F) )
#define COAP\_HEADER\_MID(data) ( (data[2]<<8)|(data[3]) )

```

پیاده‌سازی‌ها
-------------

| نام | زبان برنامه نویسی | Implemented CoAP version | Client/Server | Implemented CoAP features | License | Link |
| --- | --- | --- | --- | --- | --- | --- |
| aiocoap | Python 3 | RFC 7252 | Client + Server | Blockwise Transfers, Observe (partial) | MIT |  |
| Californium | Java | RFC 7252 | Client + Server | Observe, Blockwise Transfers, DTLS | EPL+EDL |  |
| cantcoap | C++/C | RFC 7252 | Client + Server | BSD |  |
| Canopus | Go | RFC 7252 | Client + Server | Core | Apache License 2.0 |  |
| CoAP implementation for Go | Go | RFC 7252 | Client + Server | Core + Draft Subscribe | MIT |  |
| CoAP.NET | C# | RFC 7252, coap-13, coap-08, coap-03 | Client + Server | Core, Observe, Blockwise Transfers | 3-clause BSD |  |
| CoAPSharp | C#, .NET | RFC 7252 | Client + Server | Core, Observe, Block, RD | LGPL |  |
| CoAPthon | Python | RFC 7252 | Client + Server + Forward Proxy + Reverse Proxy | Observe, Multicast server discovery, CoRE Link Format parsing, Block-wise | MIT |  |
| Copper | JavaScript (Browser Plugin) | RFC 7252 | Client | Observe, Blockwise Transfers | 3-clause BSD |  |
| eCoAP | C | RFC 7252 | Client + Server | Core | MIT |  |
| Erbium for Contiki | C | RFC 7252 | Client + Server | Observe, Blockwise Transfers | 3-clause BSD |  (er-rest-example) |
| iCoAP | Objective-C | RFC 7252 | Client | Core, Observe, Blockwise Transfers | MIT |  |
| jCoAP | Java | RFC 7252 | Client + Server | Observe, Blockwise Transfers | Apache License 2.0 |  |
| libcoap | C | RFC 7252 | Client + Server | Observe, Blockwise Transfers, DTLS | BSD/GPL |  |
| LibNyoci | C | RFC 7252 | Client + Server | Core, Observe, Block, DTLS | MIT |  |
| lobaro-coap | C | RFC 7252 | Client + Server | Observe, Blockwise Transfers | MIT |  |
| microcoap | C | RFC 7252 | Client + Server | MIT |  |
| nCoap | Java | RFC 7252 | Client + Server | Observe, Blockwise Transfers, CoRE Link Format, Endpoint-ID-Draft | BSD |  |
| node-coap | Javascript | RFC 7252 | Client + Server | Core, Observe, Block | MIT |  |
| Ruby coap | Ruby | RFC 7252 | Client + Server (david) | Core, Observe, Block, RD | MIT, GPL |  |
| Sensinode C Device Library | C | RFC 7252 | Client + Server | Core, Observe, Block, RD | Commercial |  |
| Sensinode Java Device Library | Java SE | RFC 7252 | Client + Server | Core, Observe, Block, RD | Commercial |  |
| Sensinode NanoService Platform | Java SE | RFC 7252 | Cloud Server | Core, Observe, Block, RD | Commercial |  |
| SwiftCoAP | Swift | RFC 7252 | Client + Server | Core, Observe, Blockwise Transfers | MIT |  |
| TinyOS CoapBlip | nesC/C | coap-13 | Client + Server | Observe, Blockwise Transfers | BSD |  |
| txThings | Python (Twisted) | RFC 7252 | Client + Server | Blockwise Transfers, Observe (partial) | MIT |  |
| FreeCoAP | C | RFC 7252 | Client + Server + HTTP/CoAP Proxy | Core, DTLS, Blockwise Transfers | BSD |  |
| coap-rs | Rust | RFC 7252 | Client + Server | MIT |  |
| YaCoAP | C | MIT |  |

Proxy implementations
---------------------

* Squid 3.1.9 with transparent HTTP-CoAP mapping module
* jcoap Proxy
* Californium cf-proxy
* CoAPthon
* FreeCoAP

جستارهای وابسته
---------------

* Internet of Things
* OMA Lightweight M2M
* Web of Things

منابع
-----

1. ↑  [rfc:7252 RFC 7252, Constrained Application Protocol (CoAP)]
2. ↑  "Integrating Wireless Sensor Networks with the Web بایگانی‌شده در ۳۰ اوت ۲۰۱۷ توسط Wayback Machine" , Walter, Colitti 2011
3. ↑  [rfc:8075 RFC 8075, Guidelines for Mapping Implementations: HTTP to the Constrained Application Protocol (CoAP)]
4. ↑  IETF Standardization in the Field of the Internet of Things (IoT): A Survey