fix(lwm2m): ignore unknown ObjectId to auto observe

This commit is contained in:
JianBo He 2023-03-28 17:44:33 +08:00
parent 7a6494cda6
commit 6750618d9a
4 changed files with 55 additions and 11 deletions

View File

@ -138,7 +138,7 @@ mqtt_to_coap(AlternatePath, InputCmd = #{<<"msgType">> := <<"discover">>, <<"dat
[
{uri_path, FullPathList},
{uri_query, QueryList},
{'accept', ?LWM2M_FORMAT_LINK}
{accept, ?LWM2M_FORMAT_LINK}
]
),
InputCmd
@ -241,6 +241,7 @@ empty_ack_to_mqtt(Ref) ->
coap_failure_to_mqtt(Ref, MsgType) ->
make_base_response(maps:put(<<"msgType">>, MsgType, Ref)).
%% TODO: application/link-format
content_to_mqtt(CoapPayload, <<"text/plain">>, Ref) ->
emqx_lwm2m_message:text_to_json(extract_path(Ref), CoapPayload);
content_to_mqtt(CoapPayload, <<"application/octet-stream">>, Ref) ->

View File

@ -513,12 +513,16 @@ observe_object_list(AlternatePath, ObjectList, Session) ->
true ->
Acc;
false ->
try
emqx_lwm2m_xml_object_db:find_objectid(binary_to_integer(ObjId)),
observe_object(AlternatePath, ObjectPath, Acc)
catch
error:no_xml_definition ->
Acc
case emqx_lwm2m_xml_object_db:find_objectid(binary_to_integer(ObjId)) of
{error, no_xml_definition} ->
?SLOG(warning, #{
msg => "ignore_observer_resource",
reason => no_xml_definition,
object_id => ObjId
}),
Acc;
_ ->
observe_object(AlternatePath, ObjectPath, Acc)
end
end
end,
@ -538,15 +542,20 @@ deliver_auto_observe_to_coap(AlternatePath, TermData, Session) ->
path => AlternatePath,
data => TermData
}),
{Req, Ctx} = emqx_lwm2m_cmd:mqtt_to_coap(AlternatePath, TermData),
{Req0, Ctx} = emqx_lwm2m_cmd:mqtt_to_coap(AlternatePath, TermData),
Req = alloc_token(Req0),
maybe_do_deliver_to_coap(Ctx, Req, 0, false, Session).
is_auto_observe() ->
emqx:get_config([gateway, lwm2m, auto_observe]).
alloc_token(Req = #coap_message{}) ->
Req#coap_message{token = crypto:strong_rand_bytes(4)}.
%%--------------------------------------------------------------------
%% Response
%%--------------------------------------------------------------------
handle_coap_response(
{Ctx = #{<<"msgType">> := EventType}, #coap_message{
method = CoapMsgMethod,

View File

@ -57,6 +57,7 @@
start_link(XmlDir) ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [XmlDir], []).
-spec find_objectid(integer()) -> {error, no_xml_definition} | xmerl:xmlElement().
find_objectid(ObjectId) ->
ObjectIdInt =
case is_list(ObjectId) of
@ -65,9 +66,10 @@ find_objectid(ObjectId) ->
end,
case ets:lookup(?LWM2M_OBJECT_DEF_TAB, ObjectIdInt) of
[] -> {error, no_xml_definition};
[{ObjectId, Xml}] -> Xml
[{_ObjectId, Xml}] -> Xml
end.
-spec find_name(string()) -> {error, no_xml_definition} | xmerl:xmlElement().
find_name(Name) ->
NameBinary =
case is_list(Name) of
@ -77,10 +79,11 @@ find_name(Name) ->
case ets:lookup(?LWM2M_OBJECT_NAME_TO_ID_TAB, NameBinary) of
[] ->
{error, no_xml_definition};
[{NameBinary, ObjectId}] ->
[{_NameBinary, ObjectId}] ->
find_objectid(ObjectId)
end.
-spec stop() -> ok.
stop() ->
gen_server:stop(?MODULE).

View File

@ -36,8 +36,39 @@
-define(ERR_BAD_REQUEST, <<"Bad Request">>).
-define(REG_PREFIX, <<"rd">>).
%%--------------------------------------------------------------------
%% Data formats for transferring resource information, defined in
%% OMA-TS-LightweightM2M-V1_0_1-20170704-A
%% 0: Plain text. 0 is numeric value used in CoAP Content-Format option.
%% The plain text format is used for "Read" and "Write" operations on singular
%% Resources. i.e: /3/0/0
%%
%% This data format has a Media Type of "text/plain".
-define(LWM2M_FORMAT_PLAIN_TEXT, 0).
%% 40: Link format. 40 is numeric value used in CoAP Content-Format option.
%%
-define(LWM2M_FORMAT_LINK, 40).
%% 42: Opaque. 41 is numeric value used in CoAP Content-Format option.
%% The opaque format is used for "Read" and "Write" operations on singular
%% Resources where the value of the Resource is an opaque binary value.
%% i.e: firmware images or opaque value from top layer.
%%
%% This data format has a Media Type of "application/octet-stream".
-define(LWM2M_FORMAT_OPAQUE, 42).
%% 11542: TLV. 11542 is numeric value used in CoAP Content-Format option.
%% For "Read" and "Write" operation, the binary TLV format is used to represent
%% an array of values or a single value using a compact binary representation.
%%
%% This data format has a Media Type of "application/vnd.oma.lwm2m+tlv".
-define(LWM2M_FORMAT_TLV, 11542).
-define(LWMWM_FORMAT_JSON, 11543).
%% 11543: JSON. 11543 is numeric value used in CoAP Content-Format option.
%% The client may support the JSON format for "Read" and "Write" operations to
%% represent multiple resource or single resource values.
%%
%% This data format has a Media Type of "application/vnd.oma.lwm2m+json".
-define(LWM2M_FORMAT_OMA_JSON, 11543).