Просмотр исходного кода

feat(lwm2m): always publish update message (#4201)

* feat(lwm2m): always publish update message

* fix(lwm2m): change the publish_update_when to enum
Shawn 5 лет назад
Родитель
Сommit
1be62b7cbb

+ 9 - 0
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
 

+ 5 - 0
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}) ->

+ 2 - 0
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}].

+ 14 - 6
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