wakaama的源代码分析之一
一、LWM2M
下图为lwm2m基础点:
1.1 LWM2M协议
LwM2M的全称是Lightweight Machine-To-Machine, LwM2M协议原则上是一种设备管理协议,但不限于设备管理,应该能够传输服务/应用程序数据,是适用于资源有限的终端设备管理的轻量级物联网协议。这个协议基于COAP协议,COAP协议基于UDP协议。它的名称里面包含了这么两个重要含义:
1)这个协议是轻量级的;
2)这个协议适用于物联网设备。
概括地说:LwM2M是适用于资源有限的终端设备管理的轻量级物联网协议。
LwM2M协议栈:
1.2 LWM2M协议功能
- 基于资源模型的简单对象
- 资源操作:创建/检索/更新/删除/属性配置
- 资源的观察/通知
- 支持的数据格式:TLV/JSON/Plain Text/Opaque
- 传输层协议:UDP/SMS
- 安全协议:DTLS
- NAT/防火墙应对方案: Queue模式
- 支持多LwM2M Server
- 基本的M2M功能:LwM2MServer,访问控制,设备,网络连接监测,固件更新,位置和定位服务,统计
1.3 通信接口定义
LWM2M引擎主要有两个组件:LwM2M服务器和LwM2M客户端。LwM2M标准为两个组件之间的交互设计了4种主要的接口,LwM2M的4种接口被分为上行操作和下行操作。
上行操作:LwM2M Client -> LwM2M Server
下行操作:LwM2M Server -> LwM2M Client
接口模型如下:
1.4 协议实现
LwM2M协议的主要开源实现有以下几个:
OMA LwM2M DevKit:提供可视化界面与LwM2M服务器交互。
OMA LwM2M DevKit:提供可视化界面与LwM2M服务器交互。
Eclipse Wakaama:基于C,提供了LwM2M服务器与LwM2M客户端的实现。
AVSystem Anjay:基于C,提供了LwM2M客户端的实现。
二、wakaama的源代码分析
wakaama的开源网址
https://github.com/eclipse/wakaama
2.1 wakaama的client分析
client的入口函数在lwm2mclient.c 中的main函数,其处理流程和server端的流程基本类似,都是建立一个socket,然后在一个死循环中监听socket通信,处理package有一点不同是在client的main函数中注册了很多object的处理函数。
下面主要叙述lwm2m客户端程序的创建流程、工作方式和基本操作,具体的实现可以参照wakaama的lightclient示例程序。注意,wakaama本身并不参与具体的底层通信的实现,也就是说,你需要自己去实现UDP通信或者其他通信。
**如何创建客户端程序:

2.2 添加一个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变量中