开源代码:wakaama

1. LWM2M for IoT

LWM2M(Light Weight Machine-to-Machine)轻量型的通信协议

IoT(Internet of Things)物联网。装置与互联网形成的网络

LWM2M是专门为物联网设备之间提供的轻量型通信协议

2. 特点

  • C/S结构
  • REST架构
  • CoAP协议

3. REST

主要用于web服务,使设计更简洁

REST是设计风格而不是标准

宗旨是所有的事物都有唯一的标识

但是物联网中的很多设备都是资源受限型的,即只有少量的内存空间和有限的计算能力,所以传统的HTTP协议应用在物联网上就显得过于庞大而不适用。所以有了基于REST架构的CoAP协议

4. CoAP

CoAP(Constrained Application Protocol)

CoAP是6LowPAN协议栈中的应用层协议

CoAP是超轻量型协议

CoAP的默认UDP端口号为5683

CoAP详见http://blog.csdn.net/zhangxuechao_/article/details/70331928

5. HTTP资源类

  1. class Resource {
  2. Resource(URI u);
  3. Response get();
  4. Response post(Request r);
  5. Response put(Request r);
  6. Response delete();
  7. }

GET方法检索一个资源的描述

PUT更新资源数据,如果资源不存在的话,则根据此URI创建一个新的资源

DELETE删除资源(包括不存在的)

POST创建一个新资源

6. 数据管理

Object/Instance/Resource

7. object

描述

S.No Resource ID Description Type Access
1 5851 Dimmer Integer 0 -100 R,W
2 5850 On/Off Boolean R,W

举例

8. lwm2m

lwm2m应用了CoAP协议的思想,并且做了一些修改。下面对代码一些介绍



command_desc_t

  1. typedef struct
  2. {
  3. char * name; //cmd name
  4. char * shortDesc; //description
  5. char * longDesc; //long description
  6. command_handler_t callback;
  7. void * userData;
  8. } command_desc_t;

这个结构体的功能是处理命令行的操作。当命令行输入命令时,callback被调用。命令和功能根据个人需求添加修改。最终这些信息都会保存到lwm2m_context_t结构体中

  1. typedef struct
  2. {
  3. #ifdef LWM2M_CLIENT_MODE
  4. lwm2m_client_state_t state;
  5. char * endpointName;
  6. char * msisdn;
  7. char * altPath;
  8. lwm2m_server_t * bootstrapServerList;
  9. lwm2m_server_t * serverList;
  10. lwm2m_object_t * objectList;
  11. lwm2m_observed_t * observedList;
  12. #endif
  13. #ifdef LWM2M_SERVER_MODE
  14. lwm2m_client_t * clientList;
  15. lwm2m_result_callback_t monitorCallback;
  16. void * monitor;
  17. #endif
  18. #ifdef LWM2M_BOOTSTRAP_SERVER_MODE
  19. lwm2m_bootstrap_callback_t bootstrapCallback;
  20. void * bootstrap;
  21. #endif
  22. uint16_t nextMID;
  23. lwm2m_transaction_t * transactionList;
  24. void * userData;
  25. } lwm2m_context_t;

bootstrapServerList:当前代理服务器列表

serverList:当前连接服务器列表

objectList:当前object列表,所有管理数据

observedList:当前observed列表

clientList:所有连接客户端列表

monitorCallback:打印当前状态

monitor:指向lwm2m_context_t

nextMID:监视Resource用

transactionList:代理服务器用到

observed

observed本身是一种状态。当server开启observed,client会开启定时上报功能。如果object数据有更新,client就会主动上报给sever

observed内还有time属性。如果time属性设置了,object更新会在设置时间内上报给server,上报间隔不会大于超时时间



objArray

main函数会默认添加一些object

  1. struct _lwm2m_object_t
  2. {
  3. struct _lwm2m_object_t * next; // for internal use only.
  4. uint16_t objID;
  5. lwm2m_list_t * instanceList;
  6. lwm2m_read_callback_t readFunc;
  7. lwm2m_write_callback_t writeFunc;
  8. lwm2m_execute_callback_t executeFunc;
  9. lwm2m_create_callback_t createFunc;
  10. lwm2m_delete_callback_t deleteFunc;
  11. lwm2m_discover_callback_t discoverFunc;
  12. void * userData;
  13. };

userData:object相关数据

这些object通过lwm2m_configure函数添加到objectList中,这些callback是当object改变时触发

lwm2m_step

不管是文件描述符状态变化,还是有命令行操作,或者是超时时间到了。都会导致while循环走到这里,每次必然要做如下操作:

  • 当前维护时间更新
  • 代理服务器状态更新
  • 服务器状态更新
  • Resource监视的状态更新

lwm2m_handle_packet

客户端收到的包,在这里做进一步处理

coap_parse_message

解析出coap消息。这和标准的coap消息还是有区别的

  1. typedef struct {
  2. uint8_t *buffer; /* pointer to CoAP header / incoming packet buffer / memory to serialize packet */
  3. uint8_t version;
  4. coap_message_type_t type;
  5. uint8_t code;
  6. uint16_t mid;
  7. uint8_t options[COAP_OPTION_PROXY_URI / OPTION_MAP_SIZE + 1]; /* Bitmap to check if option is set */
  8. coap_content_type_t content_type; /* Parse options once and store; allows setting options in random order */
  9. uint32_t max_age;
  10. size_t proxy_uri_len;
  11. const uint8_t *proxy_uri;
  12. uint8_t etag_len;
  13. uint8_t etag[COAP_ETAG_LEN];
  14. size_t uri_host_len;
  15. const uint8_t *uri_host;
  16. multi_option_t *location_path;
  17. uint16_t uri_port;
  18. size_t location_query_len;
  19. uint8_t *location_query;
  20. multi_option_t *uri_path;
  21. uint32_t observe;
  22. uint8_t token_len;
  23. uint8_t token[COAP_TOKEN_LEN];
  24. uint8_t accept_num;
  25. uint16_t accept[COAP_MAX_ACCEPT_NUM];
  26. uint8_t if_match_len;
  27. uint8_t if_match[COAP_ETAG_LEN];
  28. uint32_t block2_num;
  29. uint8_t block2_more;
  30. uint16_t block2_size;
  31. uint32_t block2_offset;
  32. uint32_t block1_num;
  33. uint8_t block1_more;
  34. uint16_t block1_size;
  35. uint32_t block1_offset;
  36. uint32_t size;
  37. multi_option_t *uri_query;
  38. uint8_t if_none_match;
  39. uint16_t payload_len;
  40. uint8_t *payload;
  41. } coap_packet_t;

handle_request

  1. typedef struct
  2. {
  3. uint8_t flag; // indicates which segments are set
  4. uint16_t objectId;
  5. uint16_t instanceId;
  6. uint16_t resourceId;
  7. } lwm2m_uri_t;

根据lwm2m消息管理模式”Object/Instance/Resource”,把uri_path解析到lwm2m_uri_t中

根据flag做相应的操作

dm_handleRequest

请求消息中code有如下四种类型(类似于上面提到的HTTP资源类),object根据类型做相应的操作,刚刚在object中注册的回调将在这里被触发

  1. /* CoAP request method codes */
  2. typedef enum {
  3. COAP_GET = 1,
  4. COAP_POST,
  5. COAP_PUT,
  6. COAP_DELETE
  7. } coap_method_t;

lwm2m_data_serialize

当object回调完成了,需要处理的也在callback处理完了。如果response消息有payload数据。payload封装方式有很多种,lwm2m默认采用的JSON。lwm2m中JSON的数据格式详见internals.h

  1. typedef enum
  2. {
  3. LWM2M_CONTENT_TEXT = 0, // Also used as undefined
  4. LWM2M_CONTENT_LINK = 40,
  5. LWM2M_CONTENT_OPAQUE = 42,
  6. LWM2M_CONTENT_TLV_OLD = 1542, // Keep old value for backward-compatibility
  7. LWM2M_CONTENT_TLV = 11542,
  8. LWM2M_CONTENT_JSON_OLD = 1543, // Keep old value for backward-compatibility
  9. LWM2M_CONTENT_JSON = 11543
  10. } lwm2m_media_type_t;

JSON详见http://blog.csdn.net/zhangxuechao_/article/details/70227888

9. 添加一个object流程

应用lwm2m协议完成你个人的需求,实际就是添加一个object,实际就是完善read/write/execute/create/delete/discover回调函数

  1. 添加object_objectname.c文件,根据源码风格
  2. 添加objectname_data_t结构体到.c
  3. 添加prv_res2tlv函数.c
  4. 添加prv_objectname_read/write/execute/create/delete/discover函数到.c,供server回调使用(根据个人需求)
  5. 添加display_object_objectname函数,供打印使用
  6. 添加get_object_objectname函数,供userData初始化

    设置一个LWM2M_objectname_OBJECT_ID宏,每个object唯一的ID(REST架构思想)
  7. 添加free_object_objectname函数,供userData释放
  8. 添加objArray[LWM2M_objectname_OBJECT_ID]到main函数
  9. 添加free_object_objectname函数到main函数
  10. 添加display_object_objectname函数到prv_display_objects函数
  11. 添加函数声明到lwm2mclient.h中
  12. 添加object_objectname.c到CMakeLists SOURCES变量中

lwm2m协议的更多相关文章

  1. lwm2m 协议

    1.DTLS介绍 1.1 DTLS的作用 互联网先驱们最开始在设计互联网协议时主要考虑的是可用性,安全性是没有考虑在其中的,所以传输层的TCP.UDP协议本身都不具备安全性.SSL/TLS协议是基于T ...

  2. IoT协议LwM2M MQTT与CoAP

    IoT协议LwM2M MQTT与CoAP 一.MQTT 1.概述: MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议, ...

  3. LWM2M简介-学习记录

    1. Lightweight M2M 基础,谁搞出来的 OMA是一家国际组织,因为物联网的兴起, OMA在传统的OMA-DM协议基础之上,提出了LWM2M协议.这个协议基于COAP协议,COAP协议基 ...

  4. 物联网协议CoAP协议学习

    CoAP:Constrained Application Protocol协议是为物联网中资源受限的设备制定的应用层协议,即简化版的基于UDP的HTTP协议.其核心内容为资源抽象.REST式交互可扩展 ...

  5. NB-IOT模组指令AT+NMSTATUS和AT+CGPADDR对比

    1. AT+NMSTATUS,这个指令是用来查询模块在IOT平台的注册情况.注册指的是lwm2m协议里面的注册机制,详细可以参考lwm2m协议. 2. AT+MREGSWT,设置重启之后,自动启动注册 ...

  6. 利尔达NB-IOT模块对接移动onenet平台步骤

    1. 首先登陆浙江移动onenet网站,http://openiot.zj.chinamobile.com/,进入右上角的开发者中心,然后才能看到创建产品 2. 填写产品的信息,其他信息按照个人实际填 ...

  7. 中移物联网onenet入门学习笔记2:中移物联的通信格式

    中移物联网硬件接入协议:LWM2M协议,EDP协议,MQTT协议,HTTP协议,TCP透传,MODBUS协议,JT/T808协议,RCMP协议 8种通信协议的区别在哪? 详细比较 EDP:OneNET ...

  8. 【我的物联网成长记6】由浅入深了解NB-IoT【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  9. 【我的物联网成长记6】由浅入深了解NB-IoT

    [摘要] 什么是NB-IoT?NB-IoT有什么优势?NB-IoT能做什么?本文将会从NB-IoT技术的发展历程,技术特点,通信协议,应用场景等方面为您全方面解读NB-IoT技术,了解NB-IoT的独 ...

随机推荐

  1. html两端对齐的代码

    html语言两端对齐的代码为: <p style="text-align:justify; text-justify:inter-ideograph;"> 文字,需要对 ...

  2. Windows下MariaDB数据库安装图文教程

    MariaDB是基于MySQL的开源数据库,兼容MySQL,现有的MySQL数据库可以迁移到MariaDB中使用   说明: MariaDB是基于MySQL的开源数据库,兼容MySQL,现有的MySQ ...

  3. SQL Server 2014 清除用户名和密码

    网上找来找去都是SQL Server 2008版本或者以前版本的... 后来:http://stackoverflow.com/questions/349668/removing-the-rememb ...

  4. golang 学习 (八)协程

    一: 进程.线程 和 协程 之间概念的区别:        对于 进程.线程,都是有内核进行调度,有 CPU 时间片的概念,进行 抢占式调度(有多种调度算法)    (补充: 抢占式调度与非抢占(轮询 ...

  5. Hive 企业调优

    9.企业级调优 9.1 Fetch 抓取 Fetch 抓取:Hive 中对某些情况的查询可以不必使用 MapReduce 计算: hive.fetch.task.conversion:more 9.2 ...

  6. [转帖]时序数据库技术体系(二):初识InfluxDB

    时序数据库技术体系(二):初识InfluxDB https://sq.163yun.com/blog/article/169866295296581632 把生命浪费在美好事物上2018-06-26 ...

  7. [Asp.Net Core] - 使用 ViewComponents 实现分页控件

    分页控件(定义分页参数) ~/ViewComponents/PaginationViewComponent.cs using HelloWorld.DataContext; using Microso ...

  8. linux服务器安装svn并上传项目

    一.安装svn (1)安装svn服务器: yum install subversion (2)查看版本(随自己意愿): svnserve --version 二.创建svn仓库并配置 (1)创建svn ...

  9. Python字典dict的基本使用

    可以将字典看作是特殊的列表,将下标0.1.2,表示成name,age,job. 程序列出了基本的增删改查,其余方法自行测试. 1.程序测试 #!/usr/bin/python # -*- coding ...

  10. 题解 Luogu P1110 【[ZJOI2007]报表统计】

    感谢 @cmy962085349 提供的hack数据,已经改对了. 先声明,我好像是题解里写双$fhq$ $treap$里唯一能过的...(最后两个点啊) 思路:首先看题目,$MIN_GAP_SORT ...