lwm2m协议
开源代码: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资源类
class Resource {
Resource(URI u);
Response get();
Response post(Request r);
Response put(Request r);
Response delete();
}
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
typedef struct
{
char * name; //cmd name
char * shortDesc; //description
char * longDesc; //long description
command_handler_t callback;
void * userData;
} command_desc_t;
这个结构体的功能是处理命令行的操作。当命令行输入命令时,callback被调用。命令和功能根据个人需求添加修改。最终这些信息都会保存到lwm2m_context_t结构体中
typedef struct
{
#ifdef LWM2M_CLIENT_MODE
lwm2m_client_state_t state;
char * endpointName;
char * msisdn;
char * altPath;
lwm2m_server_t * bootstrapServerList;
lwm2m_server_t * serverList;
lwm2m_object_t * objectList;
lwm2m_observed_t * observedList;
#endif
#ifdef LWM2M_SERVER_MODE
lwm2m_client_t * clientList;
lwm2m_result_callback_t monitorCallback;
void * monitor;
#endif
#ifdef LWM2M_BOOTSTRAP_SERVER_MODE
lwm2m_bootstrap_callback_t bootstrapCallback;
void * bootstrap;
#endif
uint16_t nextMID;
lwm2m_transaction_t * transactionList;
void * userData;
} 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
struct _lwm2m_object_t
{
struct _lwm2m_object_t * next; // for internal use only.
uint16_t objID;
lwm2m_list_t * instanceList;
lwm2m_read_callback_t readFunc;
lwm2m_write_callback_t writeFunc;
lwm2m_execute_callback_t executeFunc;
lwm2m_create_callback_t createFunc;
lwm2m_delete_callback_t deleteFunc;
lwm2m_discover_callback_t discoverFunc;
void * userData;
};
userData:object相关数据
这些object通过lwm2m_configure函数添加到objectList中,这些callback是当object改变时触发
lwm2m_step
不管是文件描述符状态变化,还是有命令行操作,或者是超时时间到了。都会导致while循环走到这里,每次必然要做如下操作:
- 当前维护时间更新
- 代理服务器状态更新
- 服务器状态更新
- Resource监视的状态更新
lwm2m_handle_packet
客户端收到的包,在这里做进一步处理
coap_parse_message
解析出coap消息。这和标准的coap消息还是有区别的
typedef struct {
uint8_t *buffer; /* pointer to CoAP header / incoming packet buffer / memory to serialize packet */
uint8_t version;
coap_message_type_t type;
uint8_t code;
uint16_t mid;
uint8_t options[COAP_OPTION_PROXY_URI / OPTION_MAP_SIZE + 1]; /* Bitmap to check if option is set */
coap_content_type_t content_type; /* Parse options once and store; allows setting options in random order */
uint32_t max_age;
size_t proxy_uri_len;
const uint8_t *proxy_uri;
uint8_t etag_len;
uint8_t etag[COAP_ETAG_LEN];
size_t uri_host_len;
const uint8_t *uri_host;
multi_option_t *location_path;
uint16_t uri_port;
size_t location_query_len;
uint8_t *location_query;
multi_option_t *uri_path;
uint32_t observe;
uint8_t token_len;
uint8_t token[COAP_TOKEN_LEN];
uint8_t accept_num;
uint16_t accept[COAP_MAX_ACCEPT_NUM];
uint8_t if_match_len;
uint8_t if_match[COAP_ETAG_LEN];
uint32_t block2_num;
uint8_t block2_more;
uint16_t block2_size;
uint32_t block2_offset;
uint32_t block1_num;
uint8_t block1_more;
uint16_t block1_size;
uint32_t block1_offset;
uint32_t size;
multi_option_t *uri_query;
uint8_t if_none_match;
uint16_t payload_len;
uint8_t *payload;
} coap_packet_t;
handle_request
typedef struct
{
uint8_t flag; // indicates which segments are set
uint16_t objectId;
uint16_t instanceId;
uint16_t resourceId;
} lwm2m_uri_t;
根据lwm2m消息管理模式”Object/Instance/Resource”,把uri_path解析到lwm2m_uri_t中
根据flag做相应的操作
dm_handleRequest
请求消息中code有如下四种类型(类似于上面提到的HTTP资源类),object根据类型做相应的操作,刚刚在object中注册的回调将在这里被触发
/* CoAP request method codes */
typedef enum {
COAP_GET = 1,
COAP_POST,
COAP_PUT,
COAP_DELETE
} coap_method_t;
lwm2m_data_serialize
当object回调完成了,需要处理的也在callback处理完了。如果response消息有payload数据。payload封装方式有很多种,lwm2m默认采用的JSON。lwm2m中JSON的数据格式详见internals.h
typedef enum
{
LWM2M_CONTENT_TEXT = 0, // Also used as undefined
LWM2M_CONTENT_LINK = 40,
LWM2M_CONTENT_OPAQUE = 42,
LWM2M_CONTENT_TLV_OLD = 1542, // Keep old value for backward-compatibility
LWM2M_CONTENT_TLV = 11542,
LWM2M_CONTENT_JSON_OLD = 1543, // Keep old value for backward-compatibility
LWM2M_CONTENT_JSON = 11543
} lwm2m_media_type_t;
JSON详见:http://blog.csdn.net/zhangxuechao_/article/details/70227888
9. 添加一个object流程
应用lwm2m协议完成你个人的需求,实际就是添加一个object,实际就是完善read/write/execute/create/delete/discover回调函数
- 添加object_objectname.c文件,根据源码风格
- 添加objectname_data_t结构体到.c
- 添加prv_res2tlv函数.c
- 添加prv_objectname_read/write/execute/create/delete/discover函数到.c,供server回调使用(根据个人需求)
- 添加display_object_objectname函数,供打印使用
- 添加get_object_objectname函数,供userData初始化
设置一个LWM2M_objectname_OBJECT_ID宏,每个object唯一的ID(REST架构思想) - 添加free_object_objectname函数,供userData释放
- 添加objArray[LWM2M_objectname_OBJECT_ID]到main函数
- 添加free_object_objectname函数到main函数
- 添加display_object_objectname函数到prv_display_objects函数
- 添加函数声明到lwm2mclient.h中
- 添加object_objectname.c到CMakeLists SOURCES变量中
lwm2m协议的更多相关文章
- lwm2m 协议
1.DTLS介绍 1.1 DTLS的作用 互联网先驱们最开始在设计互联网协议时主要考虑的是可用性,安全性是没有考虑在其中的,所以传输层的TCP.UDP协议本身都不具备安全性.SSL/TLS协议是基于T ...
- IoT协议LwM2M MQTT与CoAP
IoT协议LwM2M MQTT与CoAP 一.MQTT 1.概述: MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议, ...
- LWM2M简介-学习记录
1. Lightweight M2M 基础,谁搞出来的 OMA是一家国际组织,因为物联网的兴起, OMA在传统的OMA-DM协议基础之上,提出了LWM2M协议.这个协议基于COAP协议,COAP协议基 ...
- 物联网协议CoAP协议学习
CoAP:Constrained Application Protocol协议是为物联网中资源受限的设备制定的应用层协议,即简化版的基于UDP的HTTP协议.其核心内容为资源抽象.REST式交互可扩展 ...
- NB-IOT模组指令AT+NMSTATUS和AT+CGPADDR对比
1. AT+NMSTATUS,这个指令是用来查询模块在IOT平台的注册情况.注册指的是lwm2m协议里面的注册机制,详细可以参考lwm2m协议. 2. AT+MREGSWT,设置重启之后,自动启动注册 ...
- 利尔达NB-IOT模块对接移动onenet平台步骤
1. 首先登陆浙江移动onenet网站,http://openiot.zj.chinamobile.com/,进入右上角的开发者中心,然后才能看到创建产品 2. 填写产品的信息,其他信息按照个人实际填 ...
- 中移物联网onenet入门学习笔记2:中移物联的通信格式
中移物联网硬件接入协议:LWM2M协议,EDP协议,MQTT协议,HTTP协议,TCP透传,MODBUS协议,JT/T808协议,RCMP协议 8种通信协议的区别在哪? 详细比较 EDP:OneNET ...
- 【我的物联网成长记6】由浅入深了解NB-IoT【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 【我的物联网成长记6】由浅入深了解NB-IoT
[摘要] 什么是NB-IoT?NB-IoT有什么优势?NB-IoT能做什么?本文将会从NB-IoT技术的发展历程,技术特点,通信协议,应用场景等方面为您全方面解读NB-IoT技术,了解NB-IoT的独 ...
随机推荐
- 001——Angular环境搭建、运行项目、搭建项目
1.安装node.js 和cnpm 2.cnpm install -g @angular/cli 安装angular脚手架: 3.ng new angulardemo cd angulardemo ...
- 0.9.0.RELEASE版本的spring cloud alibaba sentinel+gateway网关实例
sentinel除了让服务提供方.消费方用之外,网关也能用它来限流.我们基于上次整的网关(参见0.9.0.RELEASE版本的spring cloud alibaba nacos+gateway网关实 ...
- Qt编写气体安全管理系统23-类型设置
一.前言 类型设置这个功能模块大大拓展了整个系统的灵活性,将整个系统中所有用到的控制器型号.探测器数量.探测器型号.气体种类.气体符号都存储到数据库表中,用户在类型设置中可以自由添加删除和修改,这样后 ...
- Qt编写自定义控件64-垂直时间轴
一.前言 垂直时间轴控件,主要用来描述企业发展历程大事件,或者软件版本迭代历史等,通过时间节点和事件描述来直观的展示发展的过程,一般在web网页或者app中经常看到此类控件,尤其是公司的官网关于公司部 ...
- oraagent.bin High Memory Usage as Dependent Listener was Removed/Renamed
Grid Infrastructure oraagent.bin process using huge amount of memory and forking huge number of thr ...
- [ jenkins ] 基础安装及权限管理
1. 安装 jenkins 在安装 jenkins 之前需要 java 的支持 (1)安装 jdk1.8 [root@192.168.118.17 ~]#tar xf jdk-8u77-linux-x ...
- 查看cpu核的相关信息
查看CPU信息(型号) cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 80 Intel(R) Xeon(R) CPU E7-4820 v3 ...
- htm5手机端实现拖动图片
htm5手机端实现拖动图片 <pre> <!doctype html><html><head> <title>Mobile Cookbook ...
- ubuntu下安装chrome浏览器和flash插件
chrome浏览器可在Ubuntu软件中心里搜索并安装 falsh插件首先去官网下载合适的包然后,按照readme安装,执行sudo cp -r usr/* /usr 和sudo cp libflas ...
- LeetCode 112. 路径总和(Path Sum) 10
112. 路径总和 112. Path Sum 题目描述 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节 ...