Skip to content

Commit 8068cb2

Browse files
SeppoTakalofabiobaltieri
authored andcommitted
net: lwm2m: Add shell command for listing resources
Add shell command for listing multiple objects, resources or resource instances. Signed-off-by: Seppo Takalo <[email protected]>
1 parent 357427a commit 8068cb2

File tree

2 files changed

+125
-1
lines changed

2 files changed

+125
-1
lines changed

doc/connectivity/networking/api/lwm2m.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,9 @@ required actions from the server side.
789789
resume :LwM2M engine thread resume
790790
lock :Lock the LwM2M registry
791791
unlock :Unlock the LwM2M registry
792+
obs : List observations
793+
ls : ls [PATH]
794+
List objects, instances, resources
792795
793796
794797

subsys/net/lib/lwm2m/lwm2m_shell.c

Lines changed: 122 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
5656
#define LWM2M_HELP_OBSERV "List observations"
5757
#define LWM2M_HELP_CACHE "cache PATH NUM\nEnable data cache for resource\n" \
5858
"PATH is LwM2M path\n" \
59-
"NUM how many elements to cache\n" \
59+
"NUM how many elements to cache\n"
60+
#define LWM2M_HELP_LS "ls [PATH]\nList objects, instances, resources\n"
6061

6162
static void send_cb(enum lwm2m_send_status status)
6263
{
@@ -712,6 +713,125 @@ static int cmd_observations(const struct shell *sh, size_t argc, char **argv)
712713
return 0;
713714
}
714715

716+
static int print_object_instance(const struct shell *sh, struct lwm2m_engine_obj_inst *oi)
717+
{
718+
struct lwm2m_engine_obj *obj;
719+
720+
if (!oi) {
721+
return -ENOEXEC;
722+
}
723+
724+
obj = oi->obj;
725+
726+
for (int i = 0; i < oi->resource_count; i++) {
727+
struct lwm2m_engine_res *re = &oi->resources[i];
728+
729+
for (int j = 0; j < re->res_inst_count; j++) {
730+
struct lwm2m_engine_res_inst *ri = &re->res_instances[j];
731+
732+
if (ri->data_ptr && ri->data_len > 0 &&
733+
ri->res_inst_id != RES_INSTANCE_NOT_CREATED) {
734+
struct lwm2m_engine_obj_field *field =
735+
lwm2m_get_engine_obj_field(obj, re->res_id);
736+
char path[LWM2M_MAX_PATH_STR_SIZE];
737+
738+
if (re->multi_res_inst) {
739+
snprintf(path, sizeof(path), "%hu/%hu/%hu/%hu", obj->obj_id,
740+
oi->obj_inst_id, re->res_id, ri->res_inst_id);
741+
} else {
742+
snprintf(path, sizeof(path), "%hu/%hu/%hu", obj->obj_id,
743+
oi->obj_inst_id, re->res_id);
744+
}
745+
switch (field->data_type) {
746+
case LWM2M_RES_TYPE_STRING:
747+
shell_print(sh, "%s : %s", path, (char *)ri->data_ptr);
748+
break;
749+
case LWM2M_RES_TYPE_U8:
750+
case LWM2M_RES_TYPE_S8:
751+
case LWM2M_RES_TYPE_BOOL:
752+
shell_print(sh, "%s : %u", path, *(uint8_t *)ri->data_ptr);
753+
break;
754+
case LWM2M_RES_TYPE_U16:
755+
case LWM2M_RES_TYPE_S16:
756+
shell_print(sh, "%s : %u", path, *(uint16_t *)ri->data_ptr);
757+
break;
758+
case LWM2M_RES_TYPE_U32:
759+
case LWM2M_RES_TYPE_S32:
760+
shell_print(sh, "%s : %u", path, *(uint32_t *)ri->data_ptr);
761+
break;
762+
case LWM2M_RES_TYPE_S64:
763+
case LWM2M_RES_TYPE_TIME:
764+
shell_print(sh, "%s : %lld", path,
765+
*(int64_t *)ri->data_ptr);
766+
break;
767+
case LWM2M_RES_TYPE_FLOAT:
768+
shell_print(sh, "%s : %lf", path, *(double *)ri->data_ptr);
769+
break;
770+
case LWM2M_RES_TYPE_OPAQUE:
771+
shell_print(sh, "%s : OPAQUE(%hu/%hu)", path, ri->data_len,
772+
ri->max_data_len);
773+
break;
774+
}
775+
}
776+
}
777+
}
778+
return 0;
779+
}
780+
781+
static int print_object(const struct shell *sh, struct lwm2m_engine_obj *obj)
782+
{
783+
if (!obj) {
784+
return -ENOEXEC;
785+
}
786+
struct lwm2m_engine_obj_inst *oi = next_engine_obj_inst(obj->obj_id, -1);
787+
788+
for (int i = 0; i < obj->instance_count; i++) {
789+
print_object_instance(sh, oi);
790+
oi = next_engine_obj_inst(obj->obj_id, oi->obj_inst_id);
791+
}
792+
return 0;
793+
}
794+
795+
static int print_all_objs(const struct shell *sh)
796+
{
797+
struct lwm2m_engine_obj *obj;
798+
799+
SYS_SLIST_FOR_EACH_CONTAINER(lwm2m_engine_obj_list(), obj, node) {
800+
print_object(sh, obj);
801+
}
802+
return 0;
803+
}
804+
805+
static int cmd_ls(const struct shell *sh, size_t argc, char **argv)
806+
{
807+
struct lwm2m_obj_path path;
808+
int ret;
809+
810+
if (argc < 2) {
811+
return print_all_objs(sh);
812+
}
813+
814+
ret = lwm2m_string_to_path(argv[1], &path, '/');
815+
if (ret < 0) {
816+
return -ENOEXEC;
817+
}
818+
819+
if (path.level == LWM2M_PATH_LEVEL_NONE) {
820+
return print_all_objs(sh);
821+
} else if (path.level == LWM2M_PATH_LEVEL_OBJECT) {
822+
struct lwm2m_engine_obj *obj = lwm2m_engine_get_obj(&path);
823+
824+
return print_object(sh, obj);
825+
} else if (path.level == LWM2M_PATH_LEVEL_OBJECT_INST) {
826+
struct lwm2m_engine_obj_inst *oi = lwm2m_engine_get_obj_inst(&path);
827+
828+
return print_object_instance(sh, oi);
829+
} else if (path.level == LWM2M_PATH_LEVEL_RESOURCE) {
830+
return cmd_read(sh, argc, argv);
831+
}
832+
return -ENOEXEC;
833+
}
834+
715835
SHELL_STATIC_SUBCMD_SET_CREATE(
716836
sub_lwm2m,
717837
SHELL_COND_CMD_ARG(CONFIG_LWM2M_VERSION_1_1, send, NULL,
@@ -730,6 +850,7 @@ SHELL_STATIC_SUBCMD_SET_CREATE(
730850
SHELL_CMD_ARG(lock, NULL, LWM2M_HELP_LOCK, cmd_lock, 1, 0),
731851
SHELL_CMD_ARG(unlock, NULL, LWM2M_HELP_UNLOCK, cmd_unlock, 1, 0),
732852
SHELL_CMD_ARG(obs, NULL, LWM2M_HELP_OBSERV, cmd_observations, 1, 0),
853+
SHELL_CMD_ARG(ls, NULL, LWM2M_HELP_LS, cmd_ls, 1, 1),
733854
SHELL_SUBCMD_SET_END);
734855
SHELL_COND_CMD_ARG_REGISTER(CONFIG_LWM2M_SHELL, lwm2m, &sub_lwm2m,
735856
LWM2M_HELP_CMD, NULL, 1, 0);

0 commit comments

Comments
 (0)