emqx/apps/emqx_gateway_mqttsn/include/emqx_mqttsn.hrl

229 lines
6.3 KiB
Erlang

%%--------------------------------------------------------------------
%% Copyright (c) 2020-2023 EMQ Technologies Co., Ltd. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%--------------------------------------------------------------------
-define(SN_MAX_PREDEF_TOPIC_ID, 1024).
%%--------------------------------------------------------------------
%% MQTT-SN Types
%%--------------------------------------------------------------------
-define(SN_ADVERTISE, 16#00).
-define(SN_SEARCHGW, 16#01).
-define(SN_GWINFO, 16#02).
-define(SN_CONNECT, 16#04).
-define(SN_CONNACK, 16#05).
-define(SN_WILLTOPICREQ, 16#06).
-define(SN_WILLTOPIC, 16#07).
-define(SN_WILLMSGREQ, 16#08).
-define(SN_WILLMSG, 16#09).
-define(SN_REGISTER, 16#0A).
-define(SN_REGACK, 16#0B).
-define(SN_PUBLISH, 16#0C).
-define(SN_PUBACK, 16#0D).
-define(SN_PUBCOMP, 16#0E).
-define(SN_PUBREC, 16#0F).
-define(SN_PUBREL, 16#10).
-define(SN_SUBSCRIBE, 16#12).
-define(SN_SUBACK, 16#13).
-define(SN_UNSUBSCRIBE, 16#14).
-define(SN_UNSUBACK, 16#15).
-define(SN_PINGREQ, 16#16).
-define(SN_PINGRESP, 16#17).
-define(SN_DISCONNECT, 16#18).
-define(SN_WILLTOPICUPD, 16#1A).
-define(SN_WILLTOPICRESP, 16#1B).
-define(SN_WILLMSGUPD, 16#1C).
-define(SN_WILLMSGRESP, 16#1D).
-type mqtt_sn_type() :: ?SN_ADVERTISE..?SN_WILLMSGRESP.
-define(SN_RC_ACCEPTED, 16#00).
-define(SN_RC_CONGESTION, 16#01).
-define(SN_RC_INVALID_TOPIC_ID, 16#02).
-define(SN_RC_NOT_SUPPORTED, 16#03).
%% Custom Reason code by emqx
-define(SN_RC2_NOT_AUTHORIZE, 16#80).
-define(SN_RC2_FAILED_SESSION, 16#81).
-define(SN_RC2_KEEPALIVE_TIMEOUT, 16#82).
-define(SN_RC2_EXCEED_LIMITATION, 16#83).
-define(SN_RC2_REACHED_MAX_RETRY, 16#84).
-define(QOS_NEG1, 3).
-type mqtt_sn_return_code() :: ?SN_RC_ACCEPTED..?SN_RC2_EXCEED_LIMITATION.
%%--------------------------------------------------------------------
%% MQTT-SN Message
%%--------------------------------------------------------------------
-record(mqtt_sn_flags, {
dup = false,
qos = 0,
retain = false,
will = false,
clean_start = false,
topic_id_type = 0
}).
-type mqtt_sn_flags() :: #mqtt_sn_flags{}.
-type mqtt_sn_variable() :: undefined | integer() | binary() | tuple().
-record(mqtt_sn_message, {
type :: mqtt_sn_type(),
variable :: mqtt_sn_variable()
}).
-type mqtt_sn_message() :: #mqtt_sn_message{}.
-define(SN_ADVERTISE_MSG(GwId, Duration), #mqtt_sn_message{
type = ?SN_ADVERTISE,
variable = {GwId, Duration}
}).
-define(SN_SEARCHGW_MSG(Radius), #mqtt_sn_message{
type = ?SN_SEARCHGW,
variable = Radius
}).
-define(SN_GWINFO_MSG(GwId, GwAddr), #mqtt_sn_message{
type = ?SN_GWINFO,
variable = {GwId, GwAddr}
}).
-define(SN_CONNECT_MSG(Flags, ProtocolId, Duration, ClientId), #mqtt_sn_message{
type = ?SN_CONNECT,
variable = {Flags, ProtocolId, Duration, ClientId}
}).
-define(SN_CONNACK_MSG(ReturnCode), #mqtt_sn_message{type = ?SN_CONNACK, variable = ReturnCode}).
-define(SN_WILLTOPICREQ_MSG(), #mqtt_sn_message{type = ?SN_WILLTOPICREQ}).
-define(SN_WILLTOPIC_MSG(Flags, Topic), #mqtt_sn_message{
type = ?SN_WILLTOPIC,
variable = {Flags, Topic}
}).
-define(SN_WILLTOPIC_EMPTY_MSG, #mqtt_sn_message{
type = ?SN_WILLTOPIC,
variable = undefined
}).
-define(SN_WILLMSGREQ_MSG(), #mqtt_sn_message{type = ?SN_WILLMSGREQ}).
-define(SN_WILLMSG_MSG(Msg), #mqtt_sn_message{type = ?SN_WILLMSG, variable = Msg}).
-define(SN_REGISTER_MSG(TopicId, MsgId, TopicName), #mqtt_sn_message{
type = ?SN_REGISTER,
variable = {TopicId, MsgId, TopicName}
}).
-define(SN_REGACK_MSG(TopicId, MsgId, ReturnCode), #mqtt_sn_message{
type = ?SN_REGACK,
variable = {TopicId, MsgId, ReturnCode}
}).
-define(SN_PUBLISH_MSG(Flags, TopicId, MsgId, Data), #mqtt_sn_message{
type = ?SN_PUBLISH,
variable = {Flags, TopicId, MsgId, Data}
}).
-define(SN_PUBACK_MSG(TopicId, MsgId, ReturnCode), #mqtt_sn_message{
type = ?SN_PUBACK,
variable = {TopicId, MsgId, ReturnCode}
}).
%% Type: SN_PUBREC | SN_PUBREL | SN_PUBCOMP
-define(SN_PUBREC_MSG(Type, MsgId), #mqtt_sn_message{
type = Type,
variable = MsgId
}).
-define(SN_SUBSCRIBE_MSG(Flags, MsgId, Topic), #mqtt_sn_message{
type = ?SN_SUBSCRIBE,
variable = {Flags, MsgId, Topic}
}).
-define(SN_SUBSCRIBE_MSG_TYPE(Type, Topic, QoS), #mqtt_sn_message{
type = ?SN_SUBSCRIBE,
variable = {
#mqtt_sn_flags{qos = QoS, topic_id_type = Type},
_,
Topic
}
}).
-define(SN_SUBACK_MSG(Flags, TopicId, MsgId, ReturnCode), #mqtt_sn_message{
type = ?SN_SUBACK,
variable = {Flags, TopicId, MsgId, ReturnCode}
}).
-define(SN_UNSUBSCRIBE_MSG(Flags, MsgId, Topic), #mqtt_sn_message{
type = ?SN_UNSUBSCRIBE,
variable = {Flags, MsgId, Topic}
}).
-define(SN_UNSUBSCRIBE_MSG_TYPE(Type, Topic), #mqtt_sn_message{
type = ?SN_UNSUBSCRIBE,
variable = {
#mqtt_sn_flags{topic_id_type = Type},
_,
Topic
}
}).
-define(SN_UNSUBACK_MSG(MsgId), #mqtt_sn_message{
type = ?SN_UNSUBACK,
variable = MsgId
}).
-define(SN_PINGREQ_MSG(ClientId), #mqtt_sn_message{type = ?SN_PINGREQ, variable = ClientId}).
-define(SN_PINGRESP_MSG(), #mqtt_sn_message{type = ?SN_PINGRESP}).
-define(SN_DISCONNECT_MSG(Duration), #mqtt_sn_message{
type = ?SN_DISCONNECT,
variable = Duration
}).
-define(SN_WILLTOPICUPD_MSG(Flags, Topic), #mqtt_sn_message{
type = ?SN_WILLTOPICUPD,
variable = {Flags, Topic}
}).
-define(SN_WILLTOPICRESP_MSG(ReturnCode), #mqtt_sn_message{
type = ?SN_WILLTOPICRESP,
variable = ReturnCode
}).
-define(SN_WILLMSGUPD_MSG(Msg), #mqtt_sn_message{
type = ?SN_WILLMSGUPD,
variable = Msg
}).
-define(SN_WILLMSGRESP_MSG(ReturnCode), #mqtt_sn_message{
type = ?SN_WILLMSGRESP,
variable = ReturnCode
}).
-define(SN_NORMAL_TOPIC, 0).
-define(SN_PREDEFINED_TOPIC, 1).
-define(SN_SHORT_TOPIC, 2).
-define(SN_RESERVED_TOPIC, 3).
-define(SN_INVALID_TOPIC_ID, 0).