diff --git a/apps/emqx_lwm2m/etc/emqx_lwm2m.conf b/apps/emqx_lwm2m/etc/emqx_lwm2m.conf index c9baf6feb..83111c956 100644 --- a/apps/emqx_lwm2m/etc/emqx_lwm2m.conf +++ b/apps/emqx_lwm2m/etc/emqx_lwm2m.conf @@ -41,6 +41,15 @@ lwm2m.topics.register = up/resp # The topic to which the lwm2m client's update message is published lwm2m.topics.update = up/resp +# When publish the update message. +# +# Can be one of: +# - object_list_changed: only if the object list is changed +# - always: always publish the update message +# +# Defaults to object_list_changed +#lwm2m.publish_update_when = object_list_changed + # Dir where the object definition files can be found lwm2m.xml_dir = {{ platform_etc_dir }}/lwm2m_xml diff --git a/apps/emqx_lwm2m/priv/emqx_lwm2m.schema b/apps/emqx_lwm2m/priv/emqx_lwm2m.schema index 1cd89824e..f15269833 100644 --- a/apps/emqx_lwm2m/priv/emqx_lwm2m.schema +++ b/apps/emqx_lwm2m/priv/emqx_lwm2m.schema @@ -112,6 +112,11 @@ end}. {default, "lwm2m/%e/up/resp"} ]}. +{mapping, "lwm2m.publish_update_when", "emqx_lwm2m.publish_update_when", [ + {datatype, {enum, [object_list_changed, always]}}, + {default, object_list_changed} +]}. + {translation, "emqx_lwm2m.topics", fun(Conf) -> Topics = cuttlefish_variable:filter_by_prefix("lwm2m.topics", Conf), Opts = lists:map(fun({[_,_, Key], Value}) -> diff --git a/apps/emqx_lwm2m/src/emqx_lwm2m_coap_server.erl b/apps/emqx_lwm2m/src/emqx_lwm2m_coap_server.erl index 47ea6a2ba..ed5743203 100644 --- a/apps/emqx_lwm2m/src/emqx_lwm2m_coap_server.erl +++ b/apps/emqx_lwm2m/src/emqx_lwm2m_coap_server.erl @@ -101,10 +101,12 @@ get_lwm2m_opts(Envs) -> AutoObserve = proplists:get_value(auto_observe, Envs, []), QmodeTimeWindow = proplists:get_value(qmode_time_window, Envs, []), Topics = proplists:get_value(topics, Envs, []), + PublishUpdateWhen = proplists:get_value(publish_update_when, Envs, object_list_changed), [{lifetime_max, LifetimeMax}, {lifetime_min, LifetimeMin}, {mountpoint, list_to_binary(Mountpoint)}, {port, Sockport}, {auto_observe, AutoObserve}, {qmode_time_window, QmodeTimeWindow}, + {publish_update_when, PublishUpdateWhen}, {topics, Topics}]. diff --git a/apps/emqx_lwm2m/src/emqx_lwm2m_protocol.erl b/apps/emqx_lwm2m/src/emqx_lwm2m_protocol.erl index 1fd3f5c54..c571e7cb0 100644 --- a/apps/emqx_lwm2m/src/emqx_lwm2m_protocol.erl +++ b/apps/emqx_lwm2m/src/emqx_lwm2m_protocol.erl @@ -115,15 +115,23 @@ post_init(Lwm2mState = #lwm2m_state{endpoint_name = _EndpointName, _ = send_to_broker(<<"register">>, #{<<"data">> => RegInfo}, Lwm2mState), Lwm2mState#lwm2m_state{mqtt_topic = Topic}. -update_reg_info(NewRegInfo, Lwm2mState=#lwm2m_state{life_timer = LifeTimer, register_info = RegInfo, - coap_pid = CoapPid}) -> +update_reg_info(NewRegInfo, Lwm2mState = #lwm2m_state{ + life_timer = LifeTimer, register_info = RegInfo, + coap_pid = CoapPid}) -> + UpdatedRegInfo = maps:merge(RegInfo, NewRegInfo), - %% - report the registration info update, but only when objectList is updated. - case NewRegInfo of - #{<<"objectList">> := _} -> + case proplists:get_value(publish_update_when, + lwm2m_coap_responder:options(), object_list_changed) of + always -> send_to_broker(<<"update">>, #{<<"data">> => UpdatedRegInfo}, Lwm2mState); - _ -> ok + object_list_changed -> + %% - report the registration info update, but only when objectList is updated. + case NewRegInfo of + #{<<"objectList">> := _} -> + send_to_broker(<<"update">>, #{<<"data">> => UpdatedRegInfo}, Lwm2mState); + _ -> ok + end end, %% - flush cached donwlink commands