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_path, FullPathList},
|
||||||
{uri_query, QueryList},
|
{uri_query, QueryList},
|
||||||
{'accept', ?LWM2M_FORMAT_LINK}
|
{accept, ?LWM2M_FORMAT_LINK}
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
InputCmd
|
InputCmd
|
||||||
|
@ -241,6 +241,7 @@ empty_ack_to_mqtt(Ref) ->
|
||||||
coap_failure_to_mqtt(Ref, MsgType) ->
|
coap_failure_to_mqtt(Ref, MsgType) ->
|
||||||
make_base_response(maps:put(<<"msgType">>, MsgType, Ref)).
|
make_base_response(maps:put(<<"msgType">>, MsgType, Ref)).
|
||||||
|
|
||||||
|
%% TODO: application/link-format
|
||||||
content_to_mqtt(CoapPayload, <<"text/plain">>, Ref) ->
|
content_to_mqtt(CoapPayload, <<"text/plain">>, Ref) ->
|
||||||
emqx_lwm2m_message:text_to_json(extract_path(Ref), CoapPayload);
|
emqx_lwm2m_message:text_to_json(extract_path(Ref), CoapPayload);
|
||||||
content_to_mqtt(CoapPayload, <<"application/octet-stream">>, Ref) ->
|
content_to_mqtt(CoapPayload, <<"application/octet-stream">>, Ref) ->
|
||||||
|
|
|
@ -513,12 +513,16 @@ observe_object_list(AlternatePath, ObjectList, Session) ->
|
||||||
true ->
|
true ->
|
||||||
Acc;
|
Acc;
|
||||||
false ->
|
false ->
|
||||||
try
|
case emqx_lwm2m_xml_object_db:find_objectid(binary_to_integer(ObjId)) of
|
||||||
emqx_lwm2m_xml_object_db:find_objectid(binary_to_integer(ObjId)),
|
{error, no_xml_definition} ->
|
||||||
|
?SLOG(warning, #{
|
||||||
|
msg => "ignore_observer_resource",
|
||||||
|
reason => no_xml_definition,
|
||||||
|
object_id => ObjId
|
||||||
|
}),
|
||||||
|
Acc;
|
||||||
|
_ ->
|
||||||
observe_object(AlternatePath, ObjectPath, Acc)
|
observe_object(AlternatePath, ObjectPath, Acc)
|
||||||
catch
|
|
||||||
error:no_xml_definition ->
|
|
||||||
Acc
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
@ -538,15 +542,20 @@ deliver_auto_observe_to_coap(AlternatePath, TermData, Session) ->
|
||||||
path => AlternatePath,
|
path => AlternatePath,
|
||||||
data => TermData
|
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).
|
maybe_do_deliver_to_coap(Ctx, Req, 0, false, Session).
|
||||||
|
|
||||||
is_auto_observe() ->
|
is_auto_observe() ->
|
||||||
emqx:get_config([gateway, lwm2m, auto_observe]).
|
emqx:get_config([gateway, lwm2m, auto_observe]).
|
||||||
|
|
||||||
|
alloc_token(Req = #coap_message{}) ->
|
||||||
|
Req#coap_message{token = crypto:strong_rand_bytes(4)}.
|
||||||
|
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
%% Response
|
%% Response
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
|
||||||
handle_coap_response(
|
handle_coap_response(
|
||||||
{Ctx = #{<<"msgType">> := EventType}, #coap_message{
|
{Ctx = #{<<"msgType">> := EventType}, #coap_message{
|
||||||
method = CoapMsgMethod,
|
method = CoapMsgMethod,
|
||||||
|
|
|
@ -57,6 +57,7 @@
|
||||||
start_link(XmlDir) ->
|
start_link(XmlDir) ->
|
||||||
gen_server:start_link({local, ?MODULE}, ?MODULE, [XmlDir], []).
|
gen_server:start_link({local, ?MODULE}, ?MODULE, [XmlDir], []).
|
||||||
|
|
||||||
|
-spec find_objectid(integer()) -> {error, no_xml_definition} | xmerl:xmlElement().
|
||||||
find_objectid(ObjectId) ->
|
find_objectid(ObjectId) ->
|
||||||
ObjectIdInt =
|
ObjectIdInt =
|
||||||
case is_list(ObjectId) of
|
case is_list(ObjectId) of
|
||||||
|
@ -65,9 +66,10 @@ find_objectid(ObjectId) ->
|
||||||
end,
|
end,
|
||||||
case ets:lookup(?LWM2M_OBJECT_DEF_TAB, ObjectIdInt) of
|
case ets:lookup(?LWM2M_OBJECT_DEF_TAB, ObjectIdInt) of
|
||||||
[] -> {error, no_xml_definition};
|
[] -> {error, no_xml_definition};
|
||||||
[{ObjectId, Xml}] -> Xml
|
[{_ObjectId, Xml}] -> Xml
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
-spec find_name(string()) -> {error, no_xml_definition} | xmerl:xmlElement().
|
||||||
find_name(Name) ->
|
find_name(Name) ->
|
||||||
NameBinary =
|
NameBinary =
|
||||||
case is_list(Name) of
|
case is_list(Name) of
|
||||||
|
@ -77,10 +79,11 @@ find_name(Name) ->
|
||||||
case ets:lookup(?LWM2M_OBJECT_NAME_TO_ID_TAB, NameBinary) of
|
case ets:lookup(?LWM2M_OBJECT_NAME_TO_ID_TAB, NameBinary) of
|
||||||
[] ->
|
[] ->
|
||||||
{error, no_xml_definition};
|
{error, no_xml_definition};
|
||||||
[{NameBinary, ObjectId}] ->
|
[{_NameBinary, ObjectId}] ->
|
||||||
find_objectid(ObjectId)
|
find_objectid(ObjectId)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
-spec stop() -> ok.
|
||||||
stop() ->
|
stop() ->
|
||||||
gen_server:stop(?MODULE).
|
gen_server:stop(?MODULE).
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,39 @@
|
||||||
-define(ERR_BAD_REQUEST, <<"Bad Request">>).
|
-define(ERR_BAD_REQUEST, <<"Bad Request">>).
|
||||||
-define(REG_PREFIX, <<"rd">>).
|
-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).
|
-define(LWM2M_FORMAT_PLAIN_TEXT, 0).
|
||||||
|
|
||||||
|
%% 40: Link format. 40 is numeric value used in CoAP Content-Format option.
|
||||||
|
%%
|
||||||
-define(LWM2M_FORMAT_LINK, 40).
|
-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).
|
-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(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