Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 | /*
* Copyright (c) 2017 Linaro Limited
* Copyright (c) 2017-2019 Foundries.io
*
* SPDX-License-Identifier: Apache-2.0
*/
/** @file lwm2m.h
*
* @defgroup lwm2m_api LwM2M high-level API
* @ingroup networking
* @{
* @brief LwM2M high-level API
*
* @details
* LwM2M high-level interface is defined in this header.
*
* @note The implementation assumes UDP module is enabled.
*
* @note LwM2M 1.0.x is currently the only supported version.
*/
#ifndef ZEPHYR_INCLUDE_NET_LWM2M_H_
#define ZEPHYR_INCLUDE_NET_LWM2M_H_
#include <kernel.h>
#include <net/coap.h>
/**
* @brief LwM2M Objects managed by OMA for LwM2M tech specification. Objects
* in this range have IDs from 0 to 1023.
* For more information refer to Technical Specification
* OMA-TS-LightweightM2M-V1_0_2-20180209-A
*/
#define LWM2M_OBJECT_SECURITY_ID 0
#define LWM2M_OBJECT_SERVER_ID 1
#define LWM2M_OBJECT_ACCESS_CONTROL_ID 2
#define LWM2M_OBJECT_DEVICE_ID 3
#define LWM2M_OBJECT_CONNECTIVITY_MONITORING_ID 4
#define LWM2M_OBJECT_FIRMWARE_ID 5
#define LWM2M_OBJECT_LOCATION_ID 6
#define LWM2M_OBJECT_CONNECTIVITY_STATISTICS_ID 7
/**
* @brief LwM2M Objects produced by 3rd party Standards Development
* Organizations. Objects in this range have IDs from 2048 to 10240
* Refer to the OMA LightweightM2M (LwM2M) Object and Resource Registry:
* http://www.openmobilealliance.org/wp/OMNA/LwM2M/LwM2MRegistry.html
*/
#define IPSO_OBJECT_TEMP_SENSOR_ID 3303
#define IPSO_OBJECT_LIGHT_CONTROL_ID 3311
#define IPSO_OBJECT_ACCELEROMETER_ID 3313
#define IPSO_OBJECT_BUZZER_ID 3338
#define IPSO_OBJECT_TIMER_ID 3340
#define IPSO_OBJECT_ONOFF_SWITCH_ID 3342
#define IPSO_OBJECT_PUSH_BUTTON_ID 3347
/**
* @brief LwM2M context structure to maintain information for a single
* LwM2M connection.
*/
struct lwm2m_ctx {
/** Destination address storage */
struct sockaddr remote_addr;
/** Private CoAP and networking structures */
struct coap_pending pendings[CONFIG_LWM2M_ENGINE_MAX_PENDING];
struct coap_reply replies[CONFIG_LWM2M_ENGINE_MAX_REPLIES];
struct k_delayed_work retransmit_work;
#if defined(CONFIG_LWM2M_DTLS_SUPPORT)
/** TLS tag is set by client as a reference used when the
* LwM2M engine calls tls_credential_(add|delete)
*/
int tls_tag;
/** Client can set load_credentials function as a way of overriding
* the default behavior of load_tls_credential() in lwm2m_engine.c
*/
int (*load_credentials)(struct lwm2m_ctx *client_ctx);
#endif
/** Flag to indicate if context should use DTLS.
* Enabled via the use of coaps:// protocol prefix in connection
* information.
* NOTE: requires CONFIG_LWM2M_DTLS_SUPPORT=y
*/
bool use_dtls;
/** Current index of Security Object used for server credentials */
int sec_obj_inst;
/** Flag to enable BOOTSTRAP interface. See Section 5.2
* "Bootstrap Interface" of LwM2M Technical Specification 1.0.2
* for more information.
*/
bool bootstrap_mode;
/** This flag enables the context to handle an initial ACK after
* requesting a block of data, but a follow-up packet will contain
* actual data block.
* NOTE: This is required for CoAP proxy use-case.
*/
bool handle_separate_response;
/** Socket File Descriptor */
int sock_fd;
};
/**
* @brief Asynchronous callback to get a resource buffer and length.
*
* Prior to accessing the data buffer of a resource, the engine can
* use this callback to get the buffer pointer and length instead
* of using the resource's data buffer.
*
* The client or LwM2M objects can register a function of this type via:
* lwm2m_engine_register_read_callback()
* lwm2m_engine_register_pre_write_callback()
*
* @param[in] obj_inst_id Object instance ID generating the callback.
* @param[in] res_id Resource ID generating the callback.
* @param[in] res_inst_id Resource instance ID generating the callback
* (typically 0 for non-multi instance resources).
* @param[out] data_len Length of the data buffer.
*
* @return Callback returns a pointer to the data buffer or NULL for failure.
*/
typedef void *(*lwm2m_engine_get_data_cb_t)(u16_t obj_inst_id,
u16_t res_id, u16_t res_inst_id,
size_t *data_len);
/**
* @brief Asynchronous callback when data has been set to a resource buffer.
*
* After changing the data of a resource buffer, the LwM2M engine can
* make use of this callback to pass the data back to the client or LwM2M
* objects.
*
* A function of this type can be registered via:
* lwm2m_engine_register_post_write_callback()
*
* @param[in] obj_inst_id Object instance ID generating the callback.
* @param[in] res_id Resource ID generating the callback.
* @param[in] res_inst_id Resource instance ID generating the callback
* (typically 0 for non-multi instance resources).
* @param[in] data Pointer to data.
* @param[in] data_len Length of the data.
* @param[in] last_block Flag used during block transfer to indicate the last
* block of data. For non-block transfers this is always
* false.
* @param[in] total_size Expected total size of data for a block transfer.
* For non-block transfers this is 0.
*
* @return Callback returns a negative error code (errno.h) indicating
* reason of failure or 0 for success.
*/
typedef int (*lwm2m_engine_set_data_cb_t)(u16_t obj_inst_id,
u16_t res_id, u16_t res_inst_id,
u8_t *data, u16_t data_len,
bool last_block, size_t total_size);
/**
* @brief Asynchronous event notification callback.
*
* Various object instance and resource-based events in the LwM2M engine
* can trigger a callback of this function type: object instance create,
* object instance delete and resource execute.
*
* Register a function of this type via:
* lwm2m_engine_register_exec_callback()
* lwm2m_engine_register_create_callback()
* lwm2m_engine_register_delete_callback()
*
* @param[in] obj_inst_id Object instance ID generating the callback.
*
* @return Callback returns a negative error code (errno.h) indicating
* reason of failure or 0 for success.
*/
typedef int (*lwm2m_engine_user_cb_t)(u16_t obj_inst_id);
/**
* @brief Power source types used for the "Available Power Sources" resource of
* the LwM2M Device object. An LwM2M client can use one of the following
* codes to register a power source using lwm2m_device_add_pwrsrc().
*/
#define LWM2M_DEVICE_PWR_SRC_TYPE_DC_POWER 0
#define LWM2M_DEVICE_PWR_SRC_TYPE_BAT_INT 1
#define LWM2M_DEVICE_PWR_SRC_TYPE_BAT_EXT 2
#define LWM2M_DEVICE_PWR_SRC_TYPE_UNUSED 3
#define LWM2M_DEVICE_PWR_SRC_TYPE_PWR_OVER_ETH 4
#define LWM2M_DEVICE_PWR_SRC_TYPE_USB 5
#define LWM2M_DEVICE_PWR_SRC_TYPE_AC_POWER 6
#define LWM2M_DEVICE_PWR_SRC_TYPE_SOLAR 7
#define LWM2M_DEVICE_PWR_SRC_TYPE_MAX 8
/**
* @brief Error codes used for the "Error Code" resource of the LwM2M Device
* object. An LwM2M client can register one of the following error codes via
* the lwm2m_device_add_err() function.
*/
#define LWM2M_DEVICE_ERROR_NONE 0
#define LWM2M_DEVICE_ERROR_LOW_POWER 1
#define LWM2M_DEVICE_ERROR_EXT_POWER_SUPPLY_OFF 2
#define LWM2M_DEVICE_ERROR_GPS_FAILURE 3
#define LWM2M_DEVICE_ERROR_LOW_SIGNAL_STRENGTH 4
#define LWM2M_DEVICE_ERROR_OUT_OF_MEMORY 5
#define LWM2M_DEVICE_ERROR_SMS_FAILURE 6
#define LWM2M_DEVICE_ERROR_NETWORK_FAILURE 7
#define LWM2M_DEVICE_ERROR_PERIPHERAL_FAILURE 8
/**
* @brief Battery status codes used for the "Battery Status" resource (3/0/20)
* of the LwM2M Device object. As the battery status changes, an LwM2M
* client can set one of the following codes via:
* lwm2m_engine_set_u8("3/0/20", [battery status])
*/
#define LWM2M_DEVICE_BATTERY_STATUS_NORMAL 0
#define LWM2M_DEVICE_BATTERY_STATUS_CHARGING 1
#define LWM2M_DEVICE_BATTERY_STATUS_CHARGE_COMP 2
#define LWM2M_DEVICE_BATTERY_STATUS_DAMAGED 3
#define LWM2M_DEVICE_BATTERY_STATUS_LOW 4
#define LWM2M_DEVICE_BATTERY_STATUS_NOT_INST 5
#define LWM2M_DEVICE_BATTERY_STATUS_UNKNOWN 6
/**
* @brief Register a power source with the LwM2M Device object.
*
* @param[in] pwr_src_type Power source type code.
*
* @return The newly added index of the power source. The index is used
* for removing the power source, setting voltage or setting current.
*/
__deprecated int lwm2m_device_add_pwrsrc(u8_t pwr_src_type);
/**
* @brief Remove power source previously registered in the LwM2M Device object.
*
* @param[in] index Index of the power source returned by
* lwm2m_device_add_pwrsrc().
*
* @return 0 for success or negative in case of error.
*/
__deprecated int lwm2m_device_remove_pwrsrc(int index);
/**
* @brief Set power source voltage (in millivolts).
*
* @param[in] index Index of the power source returned by
* lwm2m_device_add_pwrsrc().
* @param[in] voltage_mv New voltage in millivolts.
*
* @return 0 for success or negative in case of error.
*/
__deprecated int lwm2m_device_set_pwrsrc_voltage_mv(int index, int voltage_mv);
/**
* @brief Set power source current (in milliamps).
*
* @param[in] index Index of the power source returned by
* lwm2m_device_add_pwrsrc().
* @param[in] current_ma New current value milliamps.
*
* @return 0 for success or negative in case of error.
*/
__deprecated int lwm2m_device_set_pwrsrc_current_ma(int index, int current_ma);
/**
* @brief Register a new error code with LwM2M Device object.
*
* @param[in] error_code New error code.
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_device_add_err(u8_t error_code);
/**
* @brief LWM2M Firmware Update object states
*
* An LwM2M client or the LwM2M Firmware Update object use the following codes
* to represent the LwM2M Firmware Update state (5/0/3).
*/
#define STATE_IDLE 0
#define STATE_DOWNLOADING 1
#define STATE_DOWNLOADED 2
#define STATE_UPDATING 3
/**
* @brief LWM2M Firmware Update object result codes
*
* After processing a firmware update, the client sets the result via one of
* the following codes via lwm2m_engine_set_u8("5/0/5", [result code])
*/
#define RESULT_DEFAULT 0
#define RESULT_SUCCESS 1
#define RESULT_NO_STORAGE 2
#define RESULT_OUT_OF_MEM 3
#define RESULT_CONNECTION_LOST 4
#define RESULT_INTEGRITY_FAILED 5
#define RESULT_UNSUP_FW 6
#define RESULT_INVALID_URI 7
#define RESULT_UPDATE_FAILED 8
#define RESULT_UNSUP_PROTO 9
#if defined(CONFIG_LWM2M_FIRMWARE_UPDATE_OBJ_SUPPORT)
/**
* @brief Set data callback for firmware block transfer.
*
* LwM2M clients use this function to register a callback for receiving the
* block transfer data when performing a firmware update.
*
* @param[in] cb A callback function to receive the block transfer data
*/
void lwm2m_firmware_set_write_cb(lwm2m_engine_set_data_cb_t cb);
/**
* @brief Get the data callback for firmware block transfer writes.
*
* @return A registered callback function to receive the block transfer data
*/
lwm2m_engine_set_data_cb_t lwm2m_firmware_get_write_cb(void);
#if defined(CONFIG_LWM2M_FIRMWARE_UPDATE_PULL_SUPPORT)
/**
* @brief Set data callback to handle firmware update execute events.
*
* LwM2M clients use this function to register a callback for receiving the
* update resource "execute" operation on the LwM2M Firmware Update object.
*
* @param[in] cb A callback function to receive the execute event.
*/
void lwm2m_firmware_set_update_cb(lwm2m_engine_user_cb_t cb);
/**
* @brief Get the event callback for firmware update execute events.
*
* @return A registered callback function to receive the execute event.
*/
lwm2m_engine_user_cb_t lwm2m_firmware_get_update_cb(void);
#endif
#endif
/**
* @brief Data structure used to represent the LwM2M float type:
* val1 is the whole number portion of the decimal
* val2 is the decimal portion *1000000 for 32bit, *1000000000 for 64bit
* Example: 123.456 == val1: 123, val2:456000
* Example: 123.000456 = val1: 123, val2:456
*/
/**
* @brief Maximum precision value for 32-bit LwM2M float val2
*/
#define LWM2M_FLOAT32_DEC_MAX 1000000
/**
* @brief 32-bit variant of the LwM2M float structure
*/
typedef struct float32_value {
s32_t val1;
s32_t val2;
} float32_value_t;
/**
* @brief Maximum precision value for 64-bit LwM2M float val2
*/
#define LWM2M_FLOAT64_DEC_MAX 1000000000LL
/**
* @brief 32-bit variant of the LwM2M float structure
*/
typedef struct float64_value {
s64_t val1;
s64_t val2;
} float64_value_t;
/**
* @brief Create an LwM2M object instance.
*
* LwM2M clients use this function to create non-default LwM2M objects:
* Example to create first temperature sensor object:
* lwm2m_engine_create_obj_inst("3303/0");
*
* @param[in] pathstr LwM2M path string "obj/obj-inst"
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_create_obj_inst(char *pathstr);
/**
* @brief Set resource (instance) value (opaque buffer)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] data_ptr Data buffer
* @param[in] data_len Length of buffer
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_set_opaque(char *pathstr, char *data_ptr, u16_t data_len);
/**
* @brief Set resource (instance) value (string)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] data_ptr NULL terminated char buffer
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_set_string(char *pathstr, char *data_ptr);
/**
* @brief Set resource (instance) value (u8)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] value u8 value
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_set_u8(char *pathstr, u8_t value);
/**
* @brief Set resource (instance) value (u16)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] value u16 value
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_set_u16(char *pathstr, u16_t value);
/**
* @brief Set resource (instance) value (u32)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] value u32 value
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_set_u32(char *pathstr, u32_t value);
/**
* @brief Set resource (instance) value (u64)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] value u64 value
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_set_u64(char *pathstr, u64_t value);
/**
* @brief Set resource (instance) value (s8)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] value s8 value
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_set_s8(char *pathstr, s8_t value);
/**
* @brief Set resource (instance) value (s16)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] value s16 value
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_set_s16(char *pathstr, s16_t value);
/**
* @brief Set resource (instance) value (s32)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] value s32 value
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_set_s32(char *pathstr, s32_t value);
/**
* @brief Set resource (instance) value (s64)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] value s64 value
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_set_s64(char *pathstr, s64_t value);
/**
* @brief Set resource (instance) value (bool)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] value bool value
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_set_bool(char *pathstr, bool value);
/**
* @brief Set resource (instance) value (32-bit float structure)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] value 32-bit float value
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_set_float32(char *pathstr, float32_value_t *value);
/**
* @brief Set resource (instance) value (64-bit float structure)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] value 64-bit float value
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_set_float64(char *pathstr, float64_value_t *value);
/**
* @brief Get resource (instance) value (opaque buffer)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[out] buf Data buffer to copy data into
* @param[in] buflen Length of buffer
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_get_opaque(char *pathstr, void *buf, u16_t buflen);
/**
* @brief Get resource (instance) value (string)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[out] str String buffer to copy data into
* @param[in] strlen Length of buffer
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_get_string(char *pathstr, void *str, u16_t strlen);
/**
* @brief Get resource (instance) value (u8)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[out] value u8 buffer to copy data into
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_get_u8(char *pathstr, u8_t *value);
/**
* @brief Get resource (instance) value (u16)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[out] value u16 buffer to copy data into
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_get_u16(char *pathstr, u16_t *value);
/**
* @brief Get resource (instance) value (u32)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[out] value u32 buffer to copy data into
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_get_u32(char *pathstr, u32_t *value);
/**
* @brief Get resource (instance) value (u64)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[out] value u64 buffer to copy data into
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_get_u64(char *pathstr, u64_t *value);
/**
* @brief Get resource (instance) value (s8)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[out] value s8 buffer to copy data into
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_get_s8(char *pathstr, s8_t *value);
/**
* @brief Get resource (instance) value (s16)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[out] value s16 buffer to copy data into
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_get_s16(char *pathstr, s16_t *value);
/**
* @brief Get resource (instance) value (s32)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[out] value s32 buffer to copy data into
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_get_s32(char *pathstr, s32_t *value);
/**
* @brief Get resource (instance) value (s64)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[out] value s64 buffer to copy data into
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_get_s64(char *pathstr, s64_t *value);
/**
* @brief Get resource (instance) value (bool)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[out] value bool buffer to copy data into
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_get_bool(char *pathstr, bool *value);
/**
* @brief Get resource (instance) value (32-bit float structure)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[out] buf 32-bit float buffer to copy data into
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_get_float32(char *pathstr, float32_value_t *buf);
/**
* @brief Get resource (instance) value (64-bit float structure)
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[out] buf 64-bit float buffer to copy data into
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_get_float64(char *pathstr, float64_value_t *buf);
/**
* @brief Set resource (instance) read callback
*
* LwM2M clients can use this to set the callback function for resource reads.
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] cb Read resource callback
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_register_read_callback(char *pathstr,
lwm2m_engine_get_data_cb_t cb);
/**
* @brief Set resource (instance) pre-write callback
*
* This callback is triggered before setting the value of a resource. It
* can pass a special data buffer to the engine so that the actual resource
* value can be calculated later, etc.
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] cb Pre-write resource callback
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_register_pre_write_callback(char *pathstr,
lwm2m_engine_get_data_cb_t cb);
/**
* @brief Set resource (instance) post-write callback
*
* This callback is triggered after setting the value of a resource to the
* resource data buffer.
*
* It allows an LwM2M client or object to post-process the value of a resource
* or trigger other related resource calculations.
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] cb Post-write resource callback
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_register_post_write_callback(char *pathstr,
lwm2m_engine_set_data_cb_t cb);
/**
* @brief Set resource execute event callback
*
* This event is triggered when the execute method of a resource is enabled.
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res"
* @param[in] cb Execute resource callback
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_register_exec_callback(char *pathstr,
lwm2m_engine_user_cb_t cb);
/**
* @brief Set object instance create event callback
*
* This event is triggered when an object instance is created.
*
* @param[in] obj_id LwM2M object id
* @param[in] cb Create object instance callback
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_register_create_callback(u16_t obj_id,
lwm2m_engine_user_cb_t cb);
/**
* @brief Set object instance delete event callback
*
* This event is triggered when an object instance is deleted.
*
* @param[in] obj_id LwM2M object id
* @param[in] cb Delete object instance callback
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_register_delete_callback(u16_t obj_id,
lwm2m_engine_user_cb_t cb);
/**
* @brief Resource read-only value bit
*/
#define LWM2M_RES_DATA_READ_ONLY 0
/**
* @brief Resource read-only flag
*/
#define LWM2M_RES_DATA_FLAG_RO BIT(LWM2M_RES_DATA_READ_ONLY)
/**
* @brief Read resource flags helper macro
*/
#define LWM2M_HAS_RES_FLAG(res, f) ((res->data_flags & f) == f)
/**
* @brief Set data buffer for a resource
*
* Use this function to set the data buffer and flags for the specified LwM2M
* resource.
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[in] data_ptr Data buffer pointer
* @param[in] data_len Length of buffer
* @param[in] data_flags Data buffer flags (such as read-only, etc)
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_set_res_data(char *pathstr, void *data_ptr, u16_t data_len,
u8_t data_flags);
/**
* @brief Get data buffer for a resource
*
* Use this function to get the data buffer information for the specified LwM2M
* resource.
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)"
* @param[out] data_ptr Data buffer pointer
* @param[out] data_len Length of buffer
* @param[out] data_flags Data buffer flags (such as read-only, etc)
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_get_res_data(char *pathstr, void **data_ptr, u16_t *data_len,
u8_t *data_flags);
/**
* @brief Create a resource instance
*
* LwM2M clients use this function to create multi-resource instances:
* Example to create 0 instance of device available power sources:
* lwm2m_engine_create_res_inst("3/0/6/0");
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res/res-inst"
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_create_res_inst(char *pathstr);
/**
* @brief Delete a resource instance
*
* Use this function to remove an existing resource instance
*
* @param[in] pathstr LwM2M path string "obj/obj-inst/res/res-inst"
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_delete_res_inst(char *pathstr);
/**
* @brief Start the LwM2M engine
*
* LwM2M clients normally do not need to call this function as it is called
* by lwm2m_rd_client_start(). However, if the client does not use the RD
* client implementation, it will need to be called manually.
*
* @param[in] client_ctx LwM2M context
*
* @return 0 for success or negative in case of error.
*/
int lwm2m_engine_start(struct lwm2m_ctx *client_ctx);
/**
* @brief LwM2M RD client events
*
* LwM2M client events are passed back to the event_cb function in
* lwm2m_rd_client_start()
*/
enum lwm2m_rd_client_event {
LWM2M_RD_CLIENT_EVENT_NONE,
LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_REG_FAILURE,
LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_REG_COMPLETE,
LWM2M_RD_CLIENT_EVENT_BOOTSTRAP_TRANSFER_COMPLETE,
LWM2M_RD_CLIENT_EVENT_REGISTRATION_FAILURE,
LWM2M_RD_CLIENT_EVENT_REGISTRATION_COMPLETE,
LWM2M_RD_CLIENT_EVENT_REG_UPDATE_FAILURE,
LWM2M_RD_CLIENT_EVENT_REG_UPDATE_COMPLETE,
LWM2M_RD_CLIENT_EVENT_DEREGISTER_FAILURE,
LWM2M_RD_CLIENT_EVENT_DISCONNECT
};
/**
* @brief Asynchronous RD client event callback
*
* @param[in] ctx LwM2M context generating the event
* @param[in] event LwM2M RD client event code
*/
typedef void (*lwm2m_ctx_event_cb_t)(struct lwm2m_ctx *ctx,
enum lwm2m_rd_client_event event);
/**
* @brief Start the LwM2M RD (Registration / Discovery) Client
*
* The RD client sits just above the LwM2M engine and performs the necessary
* actions to implement the "Registration interface".
* For more information see Section 5.3 "Client Registration Interface" of the
* LwM2M Technical Specification.
*
* NOTE: lwm2m_engine_start() is called automatically by this function.
*
* @param[in] client_ctx LwM2M context
* @param[in] ep_name Registered endpoint name
* @param[in] event_cb Client event callback function
*
* @return 0 for success or negative in case of error.
*/
void lwm2m_rd_client_start(struct lwm2m_ctx *client_ctx, const char *ep_name,
lwm2m_ctx_event_cb_t event_cb);
/**
* @brief Stop the LwM2M RD (De-register) Client
*
* The RD client sits just above the LwM2M engine and performs the necessary
* actions to implement the "Registration interface".
* For more information see Section 5.3 "Client Registration Interface" of the
* LwM2M Technical Specification.
*
* @param[in] client_ctx LwM2M context
* @param[in] event_cb Client event callback function
*
* @return 0 for success or negative in case of error.
*/
void lwm2m_rd_client_stop(struct lwm2m_ctx *client_ctx,
lwm2m_ctx_event_cb_t event_cb);
#endif /* ZEPHYR_INCLUDE_NET_LWM2M_H_ */
/**@} */
|