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.

Committer:
Patrick Barrett
Date:
Wed Jan 07 14:20:56 2015 -0600
Revision:
29:004c318e63fa
Parent:
7:f9df43829cea
added retry on network error

Who changed what in which revision?

UserRevisionLine numberNew 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