fix(lwm2m): ignore unknown ObjectId to auto observe
This commit is contained in:
parent
7a6494cda6
commit
6750618d9a
|
@ -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) ->
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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).
|
||||
|
||||
|
|
|
@ -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).
|
||||
|
|
Loading…
Reference in New Issue