This commit is contained in:
anlicheng 2025-05-09 00:06:47 +08:00
parent 2e34e76d52
commit ad5f06be0e
2 changed files with 35 additions and 42 deletions

View File

@ -16,20 +16,21 @@
%%
%%
-define(PACKET_REGISTER, 16).
%%
-define(PACKET_METRIC_DATA, 3).
-define(PACKET_REGISTER, 16#00).
%%
-define(PACKET_RESPONSE, 7).
-define(PACKET_RESPONSE, 16#01).
%% efka下发给微服务配置
-define(PACKET_PUSH_CONFIG, 5).
%%
-define(PACKET_METRIC_DATA, 16#02).
%%
-define(PACKET_EVENT, 16#03).
%% efka获取自身的采集项
-define(PACKET_REQUEST_CONFIG, 10).
-define(PACKET_REQUEST_CONFIG, 16#04).
%%
-define(PACKET_EVENT, 15).
%% efka下发给微服务配置
-define(PACKET_PUSH_CONFIG, 16#10).
-define(PACKET_INVOKE, 16#11).
%% API
-export([start_link/3]).
@ -66,11 +67,15 @@ send_metric_data(DeviceUUID, Measurement, Tags, Fields) when is_binary(DeviceUUI
-spec request_config() -> {ok, Result :: list() | map()} | {error, Reason :: any()}.
request_config() ->
{ok, Ref} = gen_server:call(?MODULE, {request_config, self()}),
case await_reply(Ref, ?EFKA_REQUEST_TIMEOUT) of
{ok, Reply} ->
{ok, jiffy:decode(Reply, [return_maps])};
Error ->
Error
receive
{response, Ref, {ok, Reply}} ->
Config = jiffy:decode(Reply, [return_maps]),
{ok, Config};
{response, Ref, {error, Reason}} ->
{error, Reason}
after
?EFKA_REQUEST_TIMEOUT ->
{error, timeout}
end.
-spec device_offline(DeviceUUID :: binary()) -> no_return().
@ -89,18 +94,6 @@ send_event(EventType, Params) when is_integer(EventType), is_binary(Params) ->
%%% API
%%%===================================================================
-spec await_reply(Ref :: reference(), Timeout :: integer()) -> {ok, Result :: any()} | {error, Reason :: any()}.
await_reply(Ref, Timeout) when is_reference(Ref), is_integer(Timeout) ->
receive
{response, Ref, {ok, Reply}} ->
{ok, Reply};
{response, Ref, {error, Reason}} ->
{error, Reason}
after
Timeout ->
{error, timeout}
end.
%% @doc Spawns the server and registers the local name (unique)
-spec(start_link(ServiceId :: binary(), Host :: string(), Port :: integer()) ->
{ok, Pid :: pid()} | ignore | {error, Reason :: term()}).
@ -169,14 +162,14 @@ handle_cast({send_metric_data, DeviceUUID, Measurement, Tags, Fields}, State = #
Body = efka_point:normalized(Point),
Len = byte_size(DeviceUUID),
Packet = <<?PACKET_METRIC_DATA, 0:32, Len:8, DeviceUUID/binary, Body/binary>>,
Packet = <<?PACKET_METRIC_DATA, Len:8, DeviceUUID/binary, Body/binary>>,
ok = gen_tcp:send(Socket, Packet),
{noreply, State};
%% done
handle_cast({send_event, EventType, Params}, State = #state{socket = Socket}) ->
Packet = <<?PACKET_EVENT:8, 0:32, EventType:16, Params/binary>>,
Packet = <<?PACKET_EVENT:8, EventType:16, Params/binary>>,
ok = gen_tcp:send(Socket, Packet),
{noreply, State};

View File

@ -23,21 +23,21 @@
%%
%%
-define(PACKET_REGISTER, 16).
%%
-define(PACKET_METRIC_DATA, 3).
-define(PACKET_REGISTER, 16#00).
%%
-define(PACKET_RESPONSE, 7).
-define(PACKET_RESPONSE, 16#01).
%%
-define(PACKET_METRIC_DATA, 16#02).
%%
-define(PACKET_EVENT, 16#03).
%% efka获取自身的采集项
-define(PACKET_REQUEST_CONFIG, 16#04).
%% efka下发给微服务配置
-define(PACKET_PUSH_CONFIG, 5).
-define(PACKET_INVOKE, 6).
-define(PACKET_REQUEST_CONFIG, 10).
%%
-define(PACKET_EVENT, 15).
-define(PACKET_PUSH_CONFIG, 16#10).
-define(PACKET_INVOKE, 16#11).
-record(state, {
packet_id = 1,
@ -145,12 +145,12 @@ handle_info({tcp, Socket, <<?PACKET_REQUEST_CONFIG:8, PacketId:32>>}, State = #s
{noreply, State};
%%
handle_info({tcp, Socket, <<?PACKET_METRIC_DATA:8, 0:32, Len:8, DeviceUUID:Len/binary, Data/binary>>}, State = #state{socket = Socket, service_pid = ServicePid, is_registered = true}) ->
handle_info({tcp, Socket, <<?PACKET_METRIC_DATA:8, Len:8, DeviceUUID:Len/binary, Data/binary>>}, State = #state{socket = Socket, service_pid = ServicePid, is_registered = true}) ->
efka_service:metric_data(ServicePid, DeviceUUID, Data),
{noreply, State};
%% Event事件
handle_info({tcp, Socket, <<?PACKET_EVENT:8, 0:32, EventType:16, Params/binary>>}, State = #state{socket = Socket, service_pid = ServicePid, is_registered = true}) ->
handle_info({tcp, Socket, <<?PACKET_EVENT:8, EventType:16, Params/binary>>}, State = #state{socket = Socket, service_pid = ServicePid, is_registered = true}) ->
efka_service:send_event(ServicePid, EventType, Params),
{noreply, State};