The (alpha of the) official Exosite library, CoAP version.
NOTE: This mirror repository may be out of date, check the main repo for changes. If there are any remind me to update this mirror.
This is an unstable alpha of the Official Exosite library, there are known issues with the port to this platform. You probably shouldn't use this library yet if you just want to get things done.
This version uses CoAP for the application protocol.
picocoap/src/coap.h@7:f9df43829cea, 2014-12-19 (annotated)
- Committer:
- Patrick Barrett
- Date:
- Fri Dec 19 15:43:03 2014 -0600
- Revision:
- 7:f9df43829cea
make picocoap a subtree instead of submodule
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Patrick Barrett |
7:f9df43829cea | 1 | /// |
Patrick Barrett |
7:f9df43829cea | 2 | /// @file coap.h |
Patrick Barrett |
7:f9df43829cea | 3 | /// @author Patrick Barrett <patrickbarrett@exosite.com> |
Patrick Barrett |
7:f9df43829cea | 4 | /// @date 2014-07-10 |
Patrick Barrett |
7:f9df43829cea | 5 | /// @brief CoAP Message Parsing |
Patrick Barrett |
7:f9df43829cea | 6 | /// |
Patrick Barrett |
7:f9df43829cea | 7 | /// @details This file provides functions for parsing and building CoAP message packets |
Patrick Barrett |
7:f9df43829cea | 8 | /// using only the actual binary of the message, not needing additional memory |
Patrick Barrett |
7:f9df43829cea | 9 | /// for secondary data structures. |
Patrick Barrett |
7:f9df43829cea | 10 | /// |
Patrick Barrett |
7:f9df43829cea | 11 | |
Patrick Barrett |
7:f9df43829cea | 12 | #ifndef _COAP_H_ |
Patrick Barrett |
7:f9df43829cea | 13 | #define _COAP_H_ |
Patrick Barrett |
7:f9df43829cea | 14 | |
Patrick Barrett |
7:f9df43829cea | 15 | #ifdef __cplusplus |
Patrick Barrett |
7:f9df43829cea | 16 | extern "C" { |
Patrick Barrett |
7:f9df43829cea | 17 | #endif |
Patrick Barrett |
7:f9df43829cea | 18 | |
Patrick Barrett |
7:f9df43829cea | 19 | #include <stdint.h> |
Patrick Barrett |
7:f9df43829cea | 20 | |
Patrick Barrett |
7:f9df43829cea | 21 | |
Patrick Barrett |
7:f9df43829cea | 22 | /// |
Patrick Barrett |
7:f9df43829cea | 23 | /// CoAP Defined Parameters |
Patrick Barrett |
7:f9df43829cea | 24 | /// |
Patrick Barrett |
7:f9df43829cea | 25 | #define COAP_ACK_TIMEOUT 2 |
Patrick Barrett |
7:f9df43829cea | 26 | #define COAP_ACK_RANDOM_FACTOR 1.5 |
Patrick Barrett |
7:f9df43829cea | 27 | #define COAP_MAX_RETRANSMIT 4 |
Patrick Barrett |
7:f9df43829cea | 28 | #define COAP_NSTART 1 |
Patrick Barrett |
7:f9df43829cea | 29 | #define COAP_DEFAULT_LEISURE 5 |
Patrick Barrett |
7:f9df43829cea | 30 | #define COAP_PROBING_RATE 1 |
Patrick Barrett |
7:f9df43829cea | 31 | |
Patrick Barrett |
7:f9df43829cea | 32 | #define COAP_MAX_TRANSMIT_SPAN 45 |
Patrick Barrett |
7:f9df43829cea | 33 | #define COAP_MAX_TRANSMIT_WAIT 93 |
Patrick Barrett |
7:f9df43829cea | 34 | #define COAP_MAX_LATENCY 100 |
Patrick Barrett |
7:f9df43829cea | 35 | #define COAP_PROCESSING_DELAY 2 |
Patrick Barrett |
7:f9df43829cea | 36 | #define COAP_MAX_RTT 202 |
Patrick Barrett |
7:f9df43829cea | 37 | #define COAP_EXCHANGE_LIFETIME 247 |
Patrick Barrett |
7:f9df43829cea | 38 | #define COAP_NON_LIFETIME 145 |
Patrick Barrett |
7:f9df43829cea | 39 | |
Patrick Barrett |
7:f9df43829cea | 40 | |
Patrick Barrett |
7:f9df43829cea | 41 | /// |
Patrick Barrett |
7:f9df43829cea | 42 | /// Status Codes |
Patrick Barrett |
7:f9df43829cea | 43 | /// |
Patrick Barrett |
7:f9df43829cea | 44 | /// These codes represent the possible errors that functions in this library can |
Patrick Barrett |
7:f9df43829cea | 45 | /// return. |
Patrick Barrett |
7:f9df43829cea | 46 | /// |
Patrick Barrett |
7:f9df43829cea | 47 | typedef enum coap_error { |
Patrick Barrett |
7:f9df43829cea | 48 | CE_NONE = 0, |
Patrick Barrett |
7:f9df43829cea | 49 | CE_INVALID_PACKET, |
Patrick Barrett |
7:f9df43829cea | 50 | CE_BAD_VERSION, |
Patrick Barrett |
7:f9df43829cea | 51 | CE_TOKEN_LENGTH_OUT_OF_RANGE, |
Patrick Barrett |
7:f9df43829cea | 52 | CE_UNKNOWN_CODE, |
Patrick Barrett |
7:f9df43829cea | 53 | CE_TOO_MANY_OPTIONS, |
Patrick Barrett |
7:f9df43829cea | 54 | CE_OUT_OF_ORDER_OPTIONS_LIST, |
Patrick Barrett |
7:f9df43829cea | 55 | CE_INSUFFICIENT_BUFFER, |
Patrick Barrett |
7:f9df43829cea | 56 | CE_FOUND_PAYLOAD_MARKER, |
Patrick Barrett |
7:f9df43829cea | 57 | CE_END_OF_PACKET |
Patrick Barrett |
7:f9df43829cea | 58 | } coap_error; |
Patrick Barrett |
7:f9df43829cea | 59 | |
Patrick Barrett |
7:f9df43829cea | 60 | /// |
Patrick Barrett |
7:f9df43829cea | 61 | /// Protocol Versions |
Patrick Barrett |
7:f9df43829cea | 62 | /// |
Patrick Barrett |
7:f9df43829cea | 63 | /// All known version of the protocol. |
Patrick Barrett |
7:f9df43829cea | 64 | /// |
Patrick Barrett |
7:f9df43829cea | 65 | typedef enum coap_version { |
Patrick Barrett |
7:f9df43829cea | 66 | COAP_V1 = 1 |
Patrick Barrett |
7:f9df43829cea | 67 | } coap_version; |
Patrick Barrett |
7:f9df43829cea | 68 | |
Patrick Barrett |
7:f9df43829cea | 69 | /// |
Patrick Barrett |
7:f9df43829cea | 70 | /// Message Types |
Patrick Barrett |
7:f9df43829cea | 71 | /// |
Patrick Barrett |
7:f9df43829cea | 72 | /// The four types of messages possible. |
Patrick Barrett |
7:f9df43829cea | 73 | /// |
Patrick Barrett |
7:f9df43829cea | 74 | typedef enum coap_type { |
Patrick Barrett |
7:f9df43829cea | 75 | CT_CON = 0, |
Patrick Barrett |
7:f9df43829cea | 76 | CT_NON = 1, |
Patrick Barrett |
7:f9df43829cea | 77 | CT_ACK = 2, |
Patrick Barrett |
7:f9df43829cea | 78 | CT_RST = 3 |
Patrick Barrett |
7:f9df43829cea | 79 | } coap_type; |
Patrick Barrett |
7:f9df43829cea | 80 | |
Patrick Barrett |
7:f9df43829cea | 81 | /// |
Patrick Barrett |
7:f9df43829cea | 82 | /// Message Codes |
Patrick Barrett |
7:f9df43829cea | 83 | /// |
Patrick Barrett |
7:f9df43829cea | 84 | /// All known message request/response codes. |
Patrick Barrett |
7:f9df43829cea | 85 | /// |
Patrick Barrett |
7:f9df43829cea | 86 | typedef enum coap_code { |
Patrick Barrett |
7:f9df43829cea | 87 | CC_EMPTY = 0, |
Patrick Barrett |
7:f9df43829cea | 88 | CC_GET = 1, |
Patrick Barrett |
7:f9df43829cea | 89 | CC_POST = 2, |
Patrick Barrett |
7:f9df43829cea | 90 | CC_PUT = 3, |
Patrick Barrett |
7:f9df43829cea | 91 | CC_DELETE = 4, |
Patrick Barrett |
7:f9df43829cea | 92 | CC_CREATED = 65, |
Patrick Barrett |
7:f9df43829cea | 93 | CC_DELETED = 66, |
Patrick Barrett |
7:f9df43829cea | 94 | CC_VALID = 67, |
Patrick Barrett |
7:f9df43829cea | 95 | CC_CHANGED = 68, |
Patrick Barrett |
7:f9df43829cea | 96 | CC_CONTENT = 69, |
Patrick Barrett |
7:f9df43829cea | 97 | CC_CONTINUE = 95, |
Patrick Barrett |
7:f9df43829cea | 98 | CC_BAD_REQUEST = 128, |
Patrick Barrett |
7:f9df43829cea | 99 | CC_UNAUTHORIZED = 129, |
Patrick Barrett |
7:f9df43829cea | 100 | CC_BAD_OPTION = 130, |
Patrick Barrett |
7:f9df43829cea | 101 | CC_FORBIDDEN = 131, |
Patrick Barrett |
7:f9df43829cea | 102 | CC_NOT_FOUND = 132, |
Patrick Barrett |
7:f9df43829cea | 103 | CC_METHOD_NOT_ALLOWED = 133, |
Patrick Barrett |
7:f9df43829cea | 104 | CC_NOT_ACCEPTABLE = 134, |
Patrick Barrett |
7:f9df43829cea | 105 | CC_REQUEST_ENTITY_INCOMPLETE = 136, |
Patrick Barrett |
7:f9df43829cea | 106 | CC_PRECONDITION_FAILED = 140, |
Patrick Barrett |
7:f9df43829cea | 107 | CC_REQUEST_ENTITY_TOO_LARGE = 141, |
Patrick Barrett |
7:f9df43829cea | 108 | CC_UNSUPPORTED_CONTENT = 143, |
Patrick Barrett |
7:f9df43829cea | 109 | CC_INTERNAL_SERVER_ERROR = 160, |
Patrick Barrett |
7:f9df43829cea | 110 | CC_NOT_IMPLEMENTED = 161, |
Patrick Barrett |
7:f9df43829cea | 111 | CC_BAD_GATEWAY = 162, |
Patrick Barrett |
7:f9df43829cea | 112 | CC_SERVICE_UNAVAILABLE = 163, |
Patrick Barrett |
7:f9df43829cea | 113 | CC_GATEWAY_TIMEOUT = 164, |
Patrick Barrett |
7:f9df43829cea | 114 | CC_PROXYING_NOT_SUPPORTED = 165 |
Patrick Barrett |
7:f9df43829cea | 115 | } coap_code; |
Patrick Barrett |
7:f9df43829cea | 116 | |
Patrick Barrett |
7:f9df43829cea | 117 | /// |
Patrick Barrett |
7:f9df43829cea | 118 | /// Option Numbers |
Patrick Barrett |
7:f9df43829cea | 119 | /// |
Patrick Barrett |
7:f9df43829cea | 120 | /// All known option numbers. |
Patrick Barrett |
7:f9df43829cea | 121 | /// |
Patrick Barrett |
7:f9df43829cea | 122 | typedef enum coap_option_number { |
Patrick Barrett |
7:f9df43829cea | 123 | CON_IF_MATCH = 1, |
Patrick Barrett |
7:f9df43829cea | 124 | CON_URI_HOST = 3, |
Patrick Barrett |
7:f9df43829cea | 125 | CON_ETAG = 4, |
Patrick Barrett |
7:f9df43829cea | 126 | CON_IF_NONE_MATCH = 5, |
Patrick Barrett |
7:f9df43829cea | 127 | CON_OBSERVE = 6, |
Patrick Barrett |
7:f9df43829cea | 128 | CON_URI_PORT = 7, |
Patrick Barrett |
7:f9df43829cea | 129 | CON_LOCATION_PATH = 8, |
Patrick Barrett |
7:f9df43829cea | 130 | CON_URI_PATH = 11, |
Patrick Barrett |
7:f9df43829cea | 131 | CON_CONTENT_FORMATt = 12, |
Patrick Barrett |
7:f9df43829cea | 132 | CON_MAX_AGE = 14, |
Patrick Barrett |
7:f9df43829cea | 133 | CON_URI_QUERY = 15, |
Patrick Barrett |
7:f9df43829cea | 134 | CON_ACCEPT = 17, |
Patrick Barrett |
7:f9df43829cea | 135 | CON_LOCATION_QUERY = 20, |
Patrick Barrett |
7:f9df43829cea | 136 | CON_PROXY_URI = 35, |
Patrick Barrett |
7:f9df43829cea | 137 | CON_PROXY_SCHEME = 39, |
Patrick Barrett |
7:f9df43829cea | 138 | CON_SIZE1 = 60 |
Patrick Barrett |
7:f9df43829cea | 139 | } coap_option_number; |
Patrick Barrett |
7:f9df43829cea | 140 | |
Patrick Barrett |
7:f9df43829cea | 141 | /// |
Patrick Barrett |
7:f9df43829cea | 142 | /// Packet Data Unit |
Patrick Barrett |
7:f9df43829cea | 143 | /// |
Patrick Barrett |
7:f9df43829cea | 144 | /// This contains all information about the message buffer. |
Patrick Barrett |
7:f9df43829cea | 145 | /// |
Patrick Barrett |
7:f9df43829cea | 146 | typedef struct coap_pdu { |
Patrick Barrett |
7:f9df43829cea | 147 | uint8_t *buf; /// pointer to buffer |
Patrick Barrett |
7:f9df43829cea | 148 | size_t len; /// length of current message |
Patrick Barrett |
7:f9df43829cea | 149 | size_t max; /// size of buffer |
Patrick Barrett |
7:f9df43829cea | 150 | uint8_t *opt_ptr; /// Internal Pointer for Option Iterator |
Patrick Barrett |
7:f9df43829cea | 151 | } coap_pdu; |
Patrick Barrett |
7:f9df43829cea | 152 | |
Patrick Barrett |
7:f9df43829cea | 153 | /// |
Patrick Barrett |
7:f9df43829cea | 154 | /// CoAP Option |
Patrick Barrett |
7:f9df43829cea | 155 | /// |
Patrick Barrett |
7:f9df43829cea | 156 | /// One option in a CoAP message. |
Patrick Barrett |
7:f9df43829cea | 157 | /// |
Patrick Barrett |
7:f9df43829cea | 158 | typedef struct coap_option { |
Patrick Barrett |
7:f9df43829cea | 159 | uint16_t num; /// size of buffer |
Patrick Barrett |
7:f9df43829cea | 160 | size_t len; /// length of the value |
Patrick Barrett |
7:f9df43829cea | 161 | uint8_t *val; /// pointer value |
Patrick Barrett |
7:f9df43829cea | 162 | } coap_option; |
Patrick Barrett |
7:f9df43829cea | 163 | |
Patrick Barrett |
7:f9df43829cea | 164 | /// |
Patrick Barrett |
7:f9df43829cea | 165 | /// CoAP Payload |
Patrick Barrett |
7:f9df43829cea | 166 | /// |
Patrick Barrett |
7:f9df43829cea | 167 | /// Payload container. |
Patrick Barrett |
7:f9df43829cea | 168 | /// |
Patrick Barrett |
7:f9df43829cea | 169 | typedef struct coap_payload { |
Patrick Barrett |
7:f9df43829cea | 170 | size_t len; /// length of current message |
Patrick Barrett |
7:f9df43829cea | 171 | uint8_t *val; /// pointer to buffer |
Patrick Barrett |
7:f9df43829cea | 172 | } coap_payload; |
Patrick Barrett |
7:f9df43829cea | 173 | |
Patrick Barrett |
7:f9df43829cea | 174 | |
Patrick Barrett |
7:f9df43829cea | 175 | /// |
Patrick Barrett |
7:f9df43829cea | 176 | /// Validate Packet |
Patrick Barrett |
7:f9df43829cea | 177 | /// |
Patrick Barrett |
7:f9df43829cea | 178 | /// Parses the given packet to check if it is a valid CoAP message. |
Patrick Barrett |
7:f9df43829cea | 179 | /// This function (or coap_init_pdu for creating new packets) must be |
Patrick Barrett |
7:f9df43829cea | 180 | /// called and must return CE_NONE before you can use any of the |
Patrick Barrett |
7:f9df43829cea | 181 | /// getters or setter. |
Patrick Barrett |
7:f9df43829cea | 182 | /// @param [in] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 183 | /// @return error code (CE_NONE == 0 == no error). |
Patrick Barrett |
7:f9df43829cea | 184 | /// @see coap_error |
Patrick Barrett |
7:f9df43829cea | 185 | /// @see coap_init_pdu |
Patrick Barrett |
7:f9df43829cea | 186 | /// |
Patrick Barrett |
7:f9df43829cea | 187 | coap_error coap_validate_pkt(coap_pdu *pdu); |
Patrick Barrett |
7:f9df43829cea | 188 | |
Patrick Barrett |
7:f9df43829cea | 189 | // |
Patrick Barrett |
7:f9df43829cea | 190 | // Getters |
Patrick Barrett |
7:f9df43829cea | 191 | // |
Patrick Barrett |
7:f9df43829cea | 192 | |
Patrick Barrett |
7:f9df43829cea | 193 | /// |
Patrick Barrett |
7:f9df43829cea | 194 | /// Get Version |
Patrick Barrett |
7:f9df43829cea | 195 | /// |
Patrick Barrett |
7:f9df43829cea | 196 | /// Extracts the CoAP version from the given message. |
Patrick Barrett |
7:f9df43829cea | 197 | /// @param [in] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 198 | /// @return version. |
Patrick Barrett |
7:f9df43829cea | 199 | /// @see coap_version |
Patrick Barrett |
7:f9df43829cea | 200 | /// |
Patrick Barrett |
7:f9df43829cea | 201 | static inline coap_version coap_get_version(coap_pdu *pdu) { return pdu->buf[0] >> 6; } |
Patrick Barrett |
7:f9df43829cea | 202 | |
Patrick Barrett |
7:f9df43829cea | 203 | /// |
Patrick Barrett |
7:f9df43829cea | 204 | /// Get Message Type |
Patrick Barrett |
7:f9df43829cea | 205 | /// |
Patrick Barrett |
7:f9df43829cea | 206 | /// Extracts the message type from the given message. |
Patrick Barrett |
7:f9df43829cea | 207 | /// @param [in] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 208 | /// @return type. |
Patrick Barrett |
7:f9df43829cea | 209 | /// @see coap_type |
Patrick Barrett |
7:f9df43829cea | 210 | /// |
Patrick Barrett |
7:f9df43829cea | 211 | static inline coap_type coap_get_type(coap_pdu *pdu) { return (pdu->buf[0] >> 4) & 0x03; } |
Patrick Barrett |
7:f9df43829cea | 212 | |
Patrick Barrett |
7:f9df43829cea | 213 | /// |
Patrick Barrett |
7:f9df43829cea | 214 | /// Get Token Length |
Patrick Barrett |
7:f9df43829cea | 215 | /// |
Patrick Barrett |
7:f9df43829cea | 216 | /// Extracts the token length from the given message. |
Patrick Barrett |
7:f9df43829cea | 217 | /// @param [in] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 218 | /// @return length. |
Patrick Barrett |
7:f9df43829cea | 219 | /// @see coap_type |
Patrick Barrett |
7:f9df43829cea | 220 | /// |
Patrick Barrett |
7:f9df43829cea | 221 | static inline uint8_t coap_get_tkl(coap_pdu *pdu) { return pdu->buf[0] & 0x0F; } |
Patrick Barrett |
7:f9df43829cea | 222 | |
Patrick Barrett |
7:f9df43829cea | 223 | /// |
Patrick Barrett |
7:f9df43829cea | 224 | /// Get Message Code |
Patrick Barrett |
7:f9df43829cea | 225 | /// |
Patrick Barrett |
7:f9df43829cea | 226 | /// Extracts the message code from the given message. |
Patrick Barrett |
7:f9df43829cea | 227 | /// @param [in] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 228 | /// @return code. |
Patrick Barrett |
7:f9df43829cea | 229 | /// @see coap_code |
Patrick Barrett |
7:f9df43829cea | 230 | /// |
Patrick Barrett |
7:f9df43829cea | 231 | static inline coap_code coap_get_code(coap_pdu *pdu) { return pdu->buf[1]; } |
Patrick Barrett |
7:f9df43829cea | 232 | |
Patrick Barrett |
7:f9df43829cea | 233 | /// |
Patrick Barrett |
7:f9df43829cea | 234 | /// Get Message Code Class |
Patrick Barrett |
7:f9df43829cea | 235 | /// |
Patrick Barrett |
7:f9df43829cea | 236 | /// Gets the class portion of the message code. |
Patrick Barrett |
7:f9df43829cea | 237 | /// @param [in] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 238 | /// @see coap_get_code |
Patrick Barrett |
7:f9df43829cea | 239 | /// |
Patrick Barrett |
7:f9df43829cea | 240 | static inline uint8_t coap_get_code_class(coap_pdu *pdu) { return coap_get_code(pdu) >> 5; } |
Patrick Barrett |
7:f9df43829cea | 241 | |
Patrick Barrett |
7:f9df43829cea | 242 | /// |
Patrick Barrett |
7:f9df43829cea | 243 | /// Get Message Code Detail |
Patrick Barrett |
7:f9df43829cea | 244 | /// |
Patrick Barrett |
7:f9df43829cea | 245 | /// Gets the detail portion of the message code. |
Patrick Barrett |
7:f9df43829cea | 246 | /// @param [in] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 247 | /// @see coap_get_code |
Patrick Barrett |
7:f9df43829cea | 248 | /// |
Patrick Barrett |
7:f9df43829cea | 249 | static inline uint8_t coap_get_code_detail(coap_pdu *pdu) { return coap_get_code(pdu) & 0x1F; } |
Patrick Barrett |
7:f9df43829cea | 250 | |
Patrick Barrett |
7:f9df43829cea | 251 | /// |
Patrick Barrett |
7:f9df43829cea | 252 | /// Get Message ID |
Patrick Barrett |
7:f9df43829cea | 253 | /// |
Patrick Barrett |
7:f9df43829cea | 254 | /// Extracts the message ID from the given message. |
Patrick Barrett |
7:f9df43829cea | 255 | /// @param [in] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 256 | /// @return mid. |
Patrick Barrett |
7:f9df43829cea | 257 | /// |
Patrick Barrett |
7:f9df43829cea | 258 | static inline uint16_t coap_get_mid(coap_pdu *pdu) { return (pdu->buf[2] << 8) | pdu->buf[3]; } |
Patrick Barrett |
7:f9df43829cea | 259 | |
Patrick Barrett |
7:f9df43829cea | 260 | /// |
Patrick Barrett |
7:f9df43829cea | 261 | /// Get Message Token |
Patrick Barrett |
7:f9df43829cea | 262 | /// |
Patrick Barrett |
7:f9df43829cea | 263 | /// Extracts the token from the given message. |
Patrick Barrett |
7:f9df43829cea | 264 | /// @param [in] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 265 | /// @return token. |
Patrick Barrett |
7:f9df43829cea | 266 | /// |
Patrick Barrett |
7:f9df43829cea | 267 | uint64_t coap_get_token(coap_pdu *pdu); |
Patrick Barrett |
7:f9df43829cea | 268 | |
Patrick Barrett |
7:f9df43829cea | 269 | /// |
Patrick Barrett |
7:f9df43829cea | 270 | /// Get Option |
Patrick Barrett |
7:f9df43829cea | 271 | /// |
Patrick Barrett |
7:f9df43829cea | 272 | /// Iterates over the options in the given message. |
Patrick Barrett |
7:f9df43829cea | 273 | /// @param [in] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 274 | /// @param [in, out] pointer to the last/next option, pass |
Patrick Barrett |
7:f9df43829cea | 275 | /// 0 for the first option. |
Patrick Barrett |
7:f9df43829cea | 276 | /// @return coap_option |
Patrick Barrett |
7:f9df43829cea | 277 | /// |
Patrick Barrett |
7:f9df43829cea | 278 | coap_option coap_get_option(coap_pdu *pdu, coap_option *last); |
Patrick Barrett |
7:f9df43829cea | 279 | |
Patrick Barrett |
7:f9df43829cea | 280 | /// |
Patrick Barrett |
7:f9df43829cea | 281 | /// Get Option by Option Number |
Patrick Barrett |
7:f9df43829cea | 282 | /// |
Patrick Barrett |
7:f9df43829cea | 283 | /// Gets a single specified by the option number and index of which occurrence |
Patrick Barrett |
7:f9df43829cea | 284 | /// of that option number you'd like. |
Patrick Barrett |
7:f9df43829cea | 285 | /// @param [in] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 286 | /// @param [in] num option number to get. |
Patrick Barrett |
7:f9df43829cea | 287 | /// @param [in] occ occurrence of to get (0th, 1st, 2nd, etc) |
Patrick Barrett |
7:f9df43829cea | 288 | /// 0 for the first option. |
Patrick Barrett |
7:f9df43829cea | 289 | /// @return coap_option |
Patrick Barrett |
7:f9df43829cea | 290 | /// |
Patrick Barrett |
7:f9df43829cea | 291 | coap_option coap_get_option_by_num(coap_pdu *pdu, coap_option_number num, uint8_t occ); |
Patrick Barrett |
7:f9df43829cea | 292 | |
Patrick Barrett |
7:f9df43829cea | 293 | /// |
Patrick Barrett |
7:f9df43829cea | 294 | /// Get Option |
Patrick Barrett |
7:f9df43829cea | 295 | /// |
Patrick Barrett |
7:f9df43829cea | 296 | /// Extracts the option with the given index in the given message. |
Patrick Barrett |
7:f9df43829cea | 297 | /// @param [in] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 298 | /// @return coap_payload |
Patrick Barrett |
7:f9df43829cea | 299 | /// |
Patrick Barrett |
7:f9df43829cea | 300 | coap_payload coap_get_payload(coap_pdu *pdu); |
Patrick Barrett |
7:f9df43829cea | 301 | |
Patrick Barrett |
7:f9df43829cea | 302 | /// |
Patrick Barrett |
7:f9df43829cea | 303 | /// Internal Method |
Patrick Barrett |
7:f9df43829cea | 304 | /// |
Patrick Barrett |
7:f9df43829cea | 305 | coap_error coap_decode_option(uint8_t *pkt_ptr, size_t pkt_len, |
Patrick Barrett |
7:f9df43829cea | 306 | uint16_t *option_number, size_t *option_length, uint8_t **value); |
Patrick Barrett |
7:f9df43829cea | 307 | |
Patrick Barrett |
7:f9df43829cea | 308 | // |
Patrick Barrett |
7:f9df43829cea | 309 | // Setters |
Patrick Barrett |
7:f9df43829cea | 310 | // |
Patrick Barrett |
7:f9df43829cea | 311 | |
Patrick Barrett |
7:f9df43829cea | 312 | /// |
Patrick Barrett |
7:f9df43829cea | 313 | /// Initialize Packet |
Patrick Barrett |
7:f9df43829cea | 314 | /// |
Patrick Barrett |
7:f9df43829cea | 315 | /// Initializes on an empty buffer for creating new CoAP packets. |
Patrick Barrett |
7:f9df43829cea | 316 | /// This function (or coap_validate for parsing packets) must be |
Patrick Barrett |
7:f9df43829cea | 317 | /// called and must return CE_NONE before you can use any of the |
Patrick Barrett |
7:f9df43829cea | 318 | /// getters or setter. The packet is initialized to a CoAP Ping. |
Patrick Barrett |
7:f9df43829cea | 319 | /// @param [in, out] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 320 | /// @return coap_error (0 == no error) |
Patrick Barrett |
7:f9df43829cea | 321 | /// |
Patrick Barrett |
7:f9df43829cea | 322 | coap_error coap_init_pdu(coap_pdu *pdu); |
Patrick Barrett |
7:f9df43829cea | 323 | |
Patrick Barrett |
7:f9df43829cea | 324 | /// |
Patrick Barrett |
7:f9df43829cea | 325 | /// Set Version |
Patrick Barrett |
7:f9df43829cea | 326 | /// |
Patrick Barrett |
7:f9df43829cea | 327 | /// Sets the version number header field. |
Patrick Barrett |
7:f9df43829cea | 328 | /// @param [in, out] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 329 | /// @param [in] ver version to set. Must be COAP_V1. |
Patrick Barrett |
7:f9df43829cea | 330 | /// @return coap_error (0 == no error) |
Patrick Barrett |
7:f9df43829cea | 331 | /// @see coap_version |
Patrick Barrett |
7:f9df43829cea | 332 | /// |
Patrick Barrett |
7:f9df43829cea | 333 | coap_error coap_set_version(coap_pdu *pdu, coap_version ver); |
Patrick Barrett |
7:f9df43829cea | 334 | |
Patrick Barrett |
7:f9df43829cea | 335 | /// |
Patrick Barrett |
7:f9df43829cea | 336 | /// Set Message Type |
Patrick Barrett |
7:f9df43829cea | 337 | /// |
Patrick Barrett |
7:f9df43829cea | 338 | /// Sets the message type header field. |
Patrick Barrett |
7:f9df43829cea | 339 | /// @param [in, out] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 340 | /// @param [in] mtype type to set. |
Patrick Barrett |
7:f9df43829cea | 341 | /// @return coap_error (0 == no error) |
Patrick Barrett |
7:f9df43829cea | 342 | /// @see coap_type |
Patrick Barrett |
7:f9df43829cea | 343 | /// |
Patrick Barrett |
7:f9df43829cea | 344 | coap_error coap_set_type(coap_pdu *pdu, coap_type mtype); |
Patrick Barrett |
7:f9df43829cea | 345 | |
Patrick Barrett |
7:f9df43829cea | 346 | /// |
Patrick Barrett |
7:f9df43829cea | 347 | /// Set Message Code |
Patrick Barrett |
7:f9df43829cea | 348 | /// |
Patrick Barrett |
7:f9df43829cea | 349 | /// Sets the message type header field. |
Patrick Barrett |
7:f9df43829cea | 350 | /// @param [in, out] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 351 | /// @param [in] code code to set. |
Patrick Barrett |
7:f9df43829cea | 352 | /// @return coap_error (0 == no error) |
Patrick Barrett |
7:f9df43829cea | 353 | /// @see coap_code |
Patrick Barrett |
7:f9df43829cea | 354 | /// |
Patrick Barrett |
7:f9df43829cea | 355 | coap_error coap_set_code(coap_pdu *pdu, coap_code code); |
Patrick Barrett |
7:f9df43829cea | 356 | |
Patrick Barrett |
7:f9df43829cea | 357 | /// |
Patrick Barrett |
7:f9df43829cea | 358 | /// Set Message ID |
Patrick Barrett |
7:f9df43829cea | 359 | /// |
Patrick Barrett |
7:f9df43829cea | 360 | /// Sets the message ID header field. |
Patrick Barrett |
7:f9df43829cea | 361 | /// @param [in, out] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 362 | /// @param [in] mid message ID to set. |
Patrick Barrett |
7:f9df43829cea | 363 | /// @return coap_error (0 == no error) |
Patrick Barrett |
7:f9df43829cea | 364 | /// |
Patrick Barrett |
7:f9df43829cea | 365 | coap_error coap_set_mid(coap_pdu *pdu, uint16_t mid); |
Patrick Barrett |
7:f9df43829cea | 366 | |
Patrick Barrett |
7:f9df43829cea | 367 | /// |
Patrick Barrett |
7:f9df43829cea | 368 | /// Set Message Token |
Patrick Barrett |
7:f9df43829cea | 369 | /// |
Patrick Barrett |
7:f9df43829cea | 370 | /// Sets the message token header field. |
Patrick Barrett |
7:f9df43829cea | 371 | /// @param [in, out] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 372 | /// @param [in] token token value to set. |
Patrick Barrett |
7:f9df43829cea | 373 | /// @return coap_error (0 == no error) |
Patrick Barrett |
7:f9df43829cea | 374 | /// |
Patrick Barrett |
7:f9df43829cea | 375 | coap_error coap_set_token(coap_pdu *pdu, uint64_t token, uint8_t tkl); |
Patrick Barrett |
7:f9df43829cea | 376 | |
Patrick Barrett |
7:f9df43829cea | 377 | /// |
Patrick Barrett |
7:f9df43829cea | 378 | /// Add Message Option |
Patrick Barrett |
7:f9df43829cea | 379 | /// |
Patrick Barrett |
7:f9df43829cea | 380 | /// Adds an option to the existing message. Options SHOULD be added in order of |
Patrick Barrett |
7:f9df43829cea | 381 | /// option number. In the case of multiple options of the same type, they are |
Patrick Barrett |
7:f9df43829cea | 382 | /// sorted in the order that they are added. |
Patrick Barrett |
7:f9df43829cea | 383 | /// @param [in, out] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 384 | /// @param [in] opt option container. |
Patrick Barrett |
7:f9df43829cea | 385 | /// @return coap_error (0 == no error) |
Patrick Barrett |
7:f9df43829cea | 386 | /// |
Patrick Barrett |
7:f9df43829cea | 387 | coap_error coap_add_option(coap_pdu *pdu, int32_t opt_num, uint8_t* value, uint16_t opt_len); |
Patrick Barrett |
7:f9df43829cea | 388 | |
Patrick Barrett |
7:f9df43829cea | 389 | /// |
Patrick Barrett |
7:f9df43829cea | 390 | /// Add Message Option |
Patrick Barrett |
7:f9df43829cea | 391 | /// |
Patrick Barrett |
7:f9df43829cea | 392 | /// Sets the payload of the given message to the value in `payload`. |
Patrick Barrett |
7:f9df43829cea | 393 | /// @param [in, out] pdu pointer to the coap message struct. |
Patrick Barrett |
7:f9df43829cea | 394 | /// @param [in] pl payload container. |
Patrick Barrett |
7:f9df43829cea | 395 | /// @return coap_error (0 == no error) |
Patrick Barrett |
7:f9df43829cea | 396 | /// |
Patrick Barrett |
7:f9df43829cea | 397 | coap_error coap_set_payload(coap_pdu *pdu, uint8_t *payload, size_t payload_len); |
Patrick Barrett |
7:f9df43829cea | 398 | |
Patrick Barrett |
7:f9df43829cea | 399 | /// |
Patrick Barrett |
7:f9df43829cea | 400 | /// Build Message Code from Class and Detail |
Patrick Barrett |
7:f9df43829cea | 401 | /// |
Patrick Barrett |
7:f9df43829cea | 402 | /// Gets the class portion of the message code. |
Patrick Barrett |
7:f9df43829cea | 403 | /// @param [in] class the code class. |
Patrick Barrett |
7:f9df43829cea | 404 | /// @param [in] detail the code detail. |
Patrick Barrett |
7:f9df43829cea | 405 | /// @see coap_get_code |
Patrick Barrett |
7:f9df43829cea | 406 | /// |
Patrick Barrett |
7:f9df43829cea | 407 | static inline uint8_t coap_build_code(uint8_t _class, uint8_t detail) { return (_class << 5) | detail; } |
Patrick Barrett |
7:f9df43829cea | 408 | |
Patrick Barrett |
7:f9df43829cea | 409 | // |
Patrick Barrett |
7:f9df43829cea | 410 | // Internal |
Patrick Barrett |
7:f9df43829cea | 411 | // |
Patrick Barrett |
7:f9df43829cea | 412 | |
Patrick Barrett |
7:f9df43829cea | 413 | /// |
Patrick Barrett |
7:f9df43829cea | 414 | /// Internal Method |
Patrick Barrett |
7:f9df43829cea | 415 | /// |
Patrick Barrett |
7:f9df43829cea | 416 | coap_error coap_adjust_option_deltas(uint8_t *opts, size_t *opts_len, size_t max_len, int32_t offset); |
Patrick Barrett |
7:f9df43829cea | 417 | |
Patrick Barrett |
7:f9df43829cea | 418 | /// |
Patrick Barrett |
7:f9df43829cea | 419 | /// Internal Method |
Patrick Barrett |
7:f9df43829cea | 420 | /// |
Patrick Barrett |
7:f9df43829cea | 421 | int8_t coap_build_option_header(uint8_t *buf, size_t max_len, int32_t opt_delta, int32_t opt_len); |
Patrick Barrett |
7:f9df43829cea | 422 | |
Patrick Barrett |
7:f9df43829cea | 423 | /// |
Patrick Barrett |
7:f9df43829cea | 424 | /// Internal Method |
Patrick Barrett |
7:f9df43829cea | 425 | /// |
Patrick Barrett |
7:f9df43829cea | 426 | int8_t coap_compute_option_header_len(int32_t opt_delta, int32_t opt_len); |
Patrick Barrett |
7:f9df43829cea | 427 | |
Patrick Barrett |
7:f9df43829cea | 428 | #ifdef __cplusplus |
Patrick Barrett |
7:f9df43829cea | 429 | } |
Patrick Barrett |
7:f9df43829cea | 430 | #endif |
Patrick Barrett |
7:f9df43829cea | 431 | |
Patrick Barrett |
7:f9df43829cea | 432 | #endif /*_COAP_H_*/ |
Patrick Barrett |
7:f9df43829cea | 433 |