LWM2M开源协议栈——wakaama源代码分析

WakaamaNode:嵌入式LwM2M轻量级实现框架 LwM2M(Lightweight M2M)是面向物联网终端设备的标准化管理协议,基于CoAP构建,专为资源受限MCU设计,支持设备注册、远程配置、固件升级与传感器数据上报。其核心原理依托UDP传输、DTLS安全通道及对象化资源模型(Object/Resource),通过精简TLV/JSON编解码与块传输机制平衡功能与开销。技术价值在于统一设备管理接口、降低协议栈集成门槛,并保障OMA规范兼容性。典型应用场景涵盖STM32、ESP32、nRF52等平台的智能表计、环境监测与工业传感终端。WakaamaNod 阅读详情

LWM2M开源协议栈——wakaama源代码分析

本文主要分析liblwm2m.h文件中非DEBUG状态下的代码,其他代码见后续文章

概述

wakaama呈现形式并不是一个C的库文件,而是以源代码的形式,直接和项目代码联合编译。编译模式分为:LWM2M_SERVER_MODE、LWM2M_CLIENT_MODE、LWM2M_BOOTSTRAP_SERVER_MODE三种,分别对应此次编译产生的是服务器、客户端还是启动服务器。

分析顺序遵循,lwm2m.h文件从上到下的顺序,按照功能划分对函数原型和功能进行分析。

若有特殊情况,如上下代码关联,必须一起介绍的情况,会有特殊说明

如何编译

wakaama项目采用cmake作为项目构建工具,如何引用项目的CMakeLists.txt,可以参照在/example下的各个项目的CMakeLists.txt是如何编写的。需要注意的是,为了不破坏原有的项目结构,推荐采用外部构建的方式,即:

# 在wakaama之外新建你自己的项目目录,假设为project
cd project
# 注意替换变量为wakaama项目的所在位置,以编译server为例
# 将会在project目录下生成中间文件
cmake ${wakaama_base_dir}/example/server
make
# 产生的二进制文件名,可以参看example/server/CMakeLists.txt的PROJECT指令的参数
./lwm2mserver

你自己的项目可以参看例子的写法。

内存管理类API

void * lwm2m_malloc(size_t s);
void * lwm2m_free(void * p);
char * lwm2m_strdup(const char * str);
int lwm2m_strncmp(const char * s1, const char * s2, size_t n);

没有需要特别说明的函数,跟UNIX标准函数工作方式类似。

第三个函数作用是产生一个能放入str的内存空间,并将str的内容复制(duplicate)其中。

时间类API

time_t lwm2m_gettime(void);

返回距离上一次调用该函数时所流逝(elapse)的时间。根据POSIX规范,time_t是一个有符号整数。错误时返回负数。

辅助功能类API

typedef struct _lwm2m_list_t
{
    struct _lwm2m_list_t * next;
    uint16_t    id;
} lwm2m_list_t;

lwm2m_list_t * lwm2m_list_add(lwm2m_list_t * head, lwm2m_list_t * node);
lwm2m_list_t * lwm2m_list_find(lwm2m_list_t * head, uint16_t id);
lwm2m_list_t * lwm2m_list_remove(lwm2m_list_t * head, uint16_t id, lwm2m_list_t ** nodeP);
uint16_t lwm2m_list_newId(lwm2m_list_t * head);
void lwm2m_list_free(lwm2m_list_t * head);

#define LWM2M_LIST_ADD(H,N) lwm2m_list_add((lwm2m_list_t *)H, (lwm2m_list_t *)N);
#define LWM2M_LIST_RM(H,I,N) lwm2m_list_remove((lwm2m_list_t *)H, I, (lwm2m_list_t **)N);
#define LWM2M_LIST_FIND(H,I) lwm2m_list_find((lwm2m_list_t *)H, I)
#define LWM2M_LIST_FREE(H) lwm2m_list_free((lwm2m_list_t *)H)

提供了链表操作及其简化写法的宏。链表操作使用方式顾名思义。

lwm2m_list_newId函数返回指定链表内未被使用的最小id。

lwm2m_list_free函数工作方式是:仅对每个节点调用lwm2m_free。

URI类API

LWM2M实体的抽象表示

对于LWM2M实体(比如一个支持LWM2M协议的设备),可访问服务被抽象为一个一个对象,每一个对象局有三种层次,分别是:Object,Object-Instance,Resource。举例来说,一个LWM2M实体上包含若干提供不同功能的对象(比如说若干种不同的传感器),而每一种功能有可能由多个对象实例提供(比如多个温度传感器,都提供温度读取的功能),这些对象实例实际所能完成的功能被称为资源。(比如温度传感器提供的数据,摄像机拍摄的影像等)。每一个层次在对应的层级上有着独立的ID,分别称为Object ID,Object Instance ID,Resource ID。OMA定义了一些标准的ID,例如:Object ID中的LWM2M_SECURITY_OBJECT_ID为0,这一对象用于为节点间的通信提供安全功能。 而security object对象中包含一些标准化的资源,比如,LWM2M_PUBLIC_KEY_ID标识了security object中的公钥资源。Object Instance ID主要用于唯一标识不同的对象实例,一般来说是在设备启动和对象实例化的时候,动态分配(依次从0增长,每一种对象有着不同的实例ID序列)的。

通过URI访问LWM2M实体

在LWM2M中,合法的URI应当像如下格式(注意,不能以/结尾):

/<object id>[/<object instance id>][/<resource id>]

# legal example
/0
/0/0
/0/1
/0/1/1

URI分别标识了访问资源的object id、object instance id、resource id,后两个id是可选的。

在源代码中体现

#define LWM2M_MAX_ID   ((uint16_t)0xFFFF)

#define LWM2M_URI_FLAG_OBJECT_ID    (uint8_t)0x04
#define LWM2M_URI_FLAG_INSTANCE_ID  (uint8_t)0x02
#define LWM2M_URI_FLAG_RESOURCE_ID  (uint8_t)0x01

#define LWM2M_URI_IS_SET_INSTANCE(uri) (((uri)->flag & LWM2M_URI_FLAG_INSTANCE_ID) != 0)
#define LWM2M_URI_IS_SET_RESOURCE(uri) (((uri)->flag & LWM2M_URI_FLAG_RESOURCE_ID) != 0)

typedef struct
{
    uint8_t     flag;           // indicates which segments are set
    uint16_t    objectId;
    uint16_t    instanceId;
    uint16_t    resourceId;
} lwm2m_uri_t;


#define LWM2M_STRING_ID_MAX_LEN 6

// Parse an URI in LWM2M format and fill the lwm2m_uri_t.
// Return the number of characters read from buffer or 0 in case of error.
// Valid URIs: /1, /1/, /1/2, /1/2/, /1/2/3
// Invalid URIs: /, //, //2, /1//, /1//3, /1/2/3/, /1/2/3/4
int lwm2m_stringToUri(const char * buffer, size_t buffer_len, lwm2m_uri_t * uriP);

lwm2m.h通过lwm2m_stringToUri函数,来将URI字符串转化为lwm2m_uri_t结构。我们可以通过两个预定义的宏LWM2M_URI_IS_SET_INSTANCE和LWM2M_URI_IS_SET_RESOURCE来判断URI中后两个ID是否被设置。

常量宏

常量宏定义大约在源代码的135行左右,定义了CoAP Error Code、标准对象ID、一部分标准资源的ID。

LWM2M数据类API

概述

LWM2M协议定义一种标准的数据类型lwm2m_data_t,用于存储各种协议中可能用到的数据。

数据结构和常量

typedef enum
{
    LWM2M_TYPE_UNDEFINED = 0,
    LWM2M_TYPE_OBJECT,
    LWM2M_TYPE_OBJECT_INSTANCE,
    LWM2M_TYPE_MULTIPLE_RESOURCE,

    LWM2M_TYPE_STRING,
    LWM2M_TYPE_OPAQUE,
    LWM2M_TYPE_INTEGER,
    LWM2M_TYPE_FLOAT,
    LWM2M_TYPE_BOOLEAN,

    LWM2M_TYPE_OBJECT_LINK
} lwm2m_data_type_t;

typedef struct _lwm2m_data_t lwm2m_da
wakaama:Eclipse Wakaama是开放移动联盟的LightWeight M2M协议(LWM2M)的C实现。 立即下载

相关推荐

LwM2M-client-to-RIOT:导入到RIOT的L2M2M(基于wakaama项目)客户端

LwM2M客户端到RIOT 导入RIOT的LwM2M客户端(基于wakaama项目)。 该项目的目标是将wakaama客户导入RIOT。 目前,它只能在Linux上的“本机”中运行(请参见makefile),但最终目标是使它在主板(如UDOO等)上也可以整体使用。 任何帮助表示赞赏。 编译中 使用终端进入目录并输入以下命令: 清理所有 制作闪光灯(仅当您不在“本机”中时) 跑步 进入目录并输入以下命令: 造词

LWM2M协议接入OneNet,使用C#语言编写,修改注释中相应位置即可使用

主要使用C#语言编写的窗体程序,点击接收数据按钮以后程序将先获取设备在线状况,如果设备在线再继续获取其数据,仅限OneNet平台中的nb设备,其他物联网平台没试过

物联网协议coap和例子endpoint

coap源码和例子,很不错的物联网例子 C语言编写 ./coap-client -v 100 -m get coap://127.0.0.1/.well-known/core ./coap-client -v 100 -m get coap://127.0.0.1/light ./coap-client -e "1" -m put coap://127.0.0.1/light ./coap-client -e "0" -m put coap://127.0.0.1/light

lualwm2m:liblwm2m wakaama库的Lua绑定(https

lualwm2m lualwm2m是客户端库的Lua绑定。 lualwm2m \ luasocket示例: local lwm2m = require ' lwm2m ' local socket = require ' socket ' local obj = require ' lwm2mobject ' -- Get script arguments. local args = { ... } local serverip = args[ 1 ] or " 127.0.0.1 " local serverport = args[ 2 ] or 5683 local deviceport = args[ 3 ] or 5682 -- Create UDP socket. local udp = socket. udp (); udp: setsockname ( ' * ' ,

NV 英伟达2022数字芯片笔试题

作者:数字IC打工人 链接:【开卷】第27期 NV 英伟达2022数字芯片笔试题_笔经面经_牛客网 来源:牛客网 1、Single Choice: Given thefollowing FIFO and rules, how deep does the FIFO need to be to preventunderflow or overflow? RULES: clk_A=25MHz; clk_B=100MHz; en_B is periodically asserted: period.

weixin_44072819的博客 6387

利用图层自动识别算法实现CAD到Revit BIM模型的高效转换 - VS2022与AutoCAD2024开发环境配置指南

本文详细介绍了如何配置VS2022与AutoCAD2024开发环境,并利用图层自动识别算法实现CAD图纸到Revit BIM模型的高效自动化转换。通过解析CAD图层的规律性,该算法能智能识别并分类墙、门、窗等构件,提取几何信息并驱动Revit自动创建三维模型,从而将传统繁琐的人工“翻模”工作转化为高效、准确的自动化流程,大幅提升BIM模型创建效率。

Apple的专栏 1126

聚宽策略实盘新路径:不开通QMT , 小资金自动化交易解决方案

聚宽策略实盘新路径:不开通QMT , 小资金自动化交易解决方案

u011111246的博客 1466

别再死磕V1了!手把手教你用WPS Web Office V3 SDK快速集成(附Java Demo避坑指南)

本文详细介绍了如何从WPS Web Office V1迁移到V3版本,重点讲解了V3在性能、安全性和扩展性上的优势,以及Java开发者如何快速集成V3 SDK。文章包含核心功能实现、高级功能适配(如Solon框架)和常见问题排查指南,帮助开发者高效完成迁移并避免常见陷阱。

weixin_27215337的博客 335

DataGridView 右键菜单复制(公共)

dataGridView1.CellMouseClick += new DataGridViewCellMouseEventHandler( (sender1, e1) => { if (e1.Button == MouseButtons.Right) {

沁心渃水 2832

成功解决raise Py4JError py4j.protocol.Py4JError: py4j.protocol.Py4JError: Could not find py4j jar at 

成功解决raise Py4JError("Could not find py4j jar at {0}".format(jarpath)) py4j.protocol.Py4JError: Could not find py4j jar at 目录 解决问题 解决思路 解决方法 1、第一步安装jdk 2、第二步安装或升级py4j 解决问题 raise Py4JError("Could not find py4j jar at {0...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 4624

手把手教你学Simulink--基于飞轮储能系统的场景实例:飞轮储能与锂电池混合储能系统的协同控制

本文详细介绍了基于Simulink的飞轮储能与锂电池混合储能系统协同控制建模方法。通过高通/低通滤波器实现功率分配,使飞轮处理高频波动(±100kW),锂电池承担削峰填谷(50kW)。仿真结果表明,该系统效率达88%,锂电池循环次数减少90%,投资成本比纯电池方案节省200万美元。文章包含完整的建模步骤、控制策略设计和多场景仿真分析,为构建高效、长寿、经济的智能储能系统提供了实用解决方案。

MHD0815的博客 342

二、CANdelaStudio入门-版本介绍

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的各个版本,欢迎各位朋友订阅、评论,可以提出宝贵意见,以持续输出更好的作品,同时会根据评论、私信不定期更新文章内容,以及专栏目录。订阅该专栏的朋友可私信小编免费答疑解惑(^U^)ノ~YOCANdelaStudio——诊断需求定义工具,诊断协议开发软件 ①用户以模板概念为导向

诊断协议那些事儿's blog 1308

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: LWM2M协议调研
下一篇: 为git配置代理
NekoQAQ
博客等级 码龄9年 18粉丝 5原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值