fix device
This commit is contained in:
parent
0bb6883ac6
commit
d4d1c06086
@ -56,7 +56,7 @@ handle_request("POST", "/device/activate", _, #{<<"device_uuid">> := DeviceUUID,
|
|||||||
lager:debug("[device_handler] reload device: ~p, get error: ~p", [DeviceUUID, Reason]),
|
lager:debug("[device_handler] reload device: ~p, get error: ~p", [DeviceUUID, Reason]),
|
||||||
{ok, 200, iot_util:json_error(404, <<"activate device failed">>)}
|
{ok, 200, iot_util:json_error(404, <<"activate device failed">>)}
|
||||||
end;
|
end;
|
||||||
{ok, DevicePid} when is_pid(DevicePid) ->
|
DevicePid when is_pid(DevicePid) ->
|
||||||
iot_device:auth(DevicePid, Auth),
|
iot_device:auth(DevicePid, Auth),
|
||||||
{ok, 200, iot_util:json_data(<<"success">>)}
|
{ok, 200, iot_util:json_data(<<"success">>)}
|
||||||
end;
|
end;
|
||||||
|
|||||||
@ -124,6 +124,9 @@ init([UUID]) ->
|
|||||||
|
|
||||||
case host_bo:get_host_by_uuid(UUID) of
|
case host_bo:get_host_by_uuid(UUID) of
|
||||||
{ok, #{<<"authorize_status">> := AuthorizeStatus, <<"id">> := HostId}} ->
|
{ok, #{<<"authorize_status">> := AuthorizeStatus, <<"id">> := HostId}} ->
|
||||||
|
%% 注册监听事件
|
||||||
|
iot_host_monitor:register(self(), HostId),
|
||||||
|
|
||||||
Aes = list_to_binary(iot_util:rand_bytes(32)),
|
Aes = list_to_binary(iot_util:rand_bytes(32)),
|
||||||
StateName = case AuthorizeStatus =:= ?HOST_AUTHED of
|
StateName = case AuthorizeStatus =:= ?HOST_AUTHED of
|
||||||
false -> denied;
|
false -> denied;
|
||||||
|
|||||||
@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
%% API
|
%% API
|
||||||
-export([start_link/0]).
|
-export([start_link/0]).
|
||||||
-export([register/2, unregister/1]).
|
-export([register/2]).
|
||||||
|
|
||||||
%% gen_server callbacks
|
%% gen_server callbacks
|
||||||
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
|
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
|
||||||
@ -21,18 +21,15 @@
|
|||||||
-define(SERVER, ?MODULE).
|
-define(SERVER, ?MODULE).
|
||||||
|
|
||||||
-record(state, {
|
-record(state, {
|
||||||
|
register_map = #{}
|
||||||
}).
|
}).
|
||||||
|
|
||||||
%%%===================================================================
|
%%%===================================================================
|
||||||
%%% API
|
%%% API
|
||||||
%%%===================================================================
|
%%%===================================================================
|
||||||
|
|
||||||
register(HostPid, HostUUID) when is_pid(HostPid), is_binary(HostUUID) ->
|
register(HostPid, HostId) when is_pid(HostPid), is_integer(HostId) ->
|
||||||
gen_server:call(?MODULE, {register, HostPid, HostUUID}).
|
gen_server:call(?MODULE, {register, HostPid, HostId}).
|
||||||
|
|
||||||
unregister(HostPid) when is_pid(HostPid) ->
|
|
||||||
gen_server:call(?MODULE, {unregister, HostPid}).
|
|
||||||
|
|
||||||
%% @doc Spawns the server and registers the local name (unique)
|
%% @doc Spawns the server and registers the local name (unique)
|
||||||
-spec(start_link() ->
|
-spec(start_link() ->
|
||||||
@ -62,8 +59,9 @@ init([]) ->
|
|||||||
{noreply, NewState :: #state{}, timeout() | hibernate} |
|
{noreply, NewState :: #state{}, timeout() | hibernate} |
|
||||||
{stop, Reason :: term(), Reply :: term(), NewState :: #state{}} |
|
{stop, Reason :: term(), Reply :: term(), NewState :: #state{}} |
|
||||||
{stop, Reason :: term(), NewState :: #state{}}).
|
{stop, Reason :: term(), NewState :: #state{}}).
|
||||||
handle_call({register, HostPid, HostUUID}, _From, State = #state{}) ->
|
handle_call({register, HostPid, HostId}, _From, State = #state{register_map = RegisterMap}) ->
|
||||||
{reply, ok, State}.
|
erlang:monitor(process, HostPid),
|
||||||
|
{reply, ok, State#state{register_map = maps:put(HostPid, HostId, RegisterMap)}}.
|
||||||
|
|
||||||
%% @private
|
%% @private
|
||||||
%% @doc Handling cast messages
|
%% @doc Handling cast messages
|
||||||
@ -80,8 +78,25 @@ handle_cast(_Request, State = #state{}) ->
|
|||||||
{noreply, NewState :: #state{}} |
|
{noreply, NewState :: #state{}} |
|
||||||
{noreply, NewState :: #state{}, timeout() | hibernate} |
|
{noreply, NewState :: #state{}, timeout() | hibernate} |
|
||||||
{stop, Reason :: term(), NewState :: #state{}}).
|
{stop, Reason :: term(), NewState :: #state{}}).
|
||||||
handle_info(_Info, State = #state{}) ->
|
%% 当websocket断开的时候,则设置主机状态为下线状态; 主机的状态需要转换
|
||||||
{noreply, State}.
|
handle_info({'DOWN', _Ref, process, HostPid, Reason}, State = #state{register_map = RegisterMap}) ->
|
||||||
|
lager:warning("[iot_host_monitor] host: ~p, down with reason: ~p", [HostPid, Reason]),
|
||||||
|
case maps:take(HostPid, RegisterMap) of
|
||||||
|
error ->
|
||||||
|
{noreply, State};
|
||||||
|
{HostId, NRegisterMap} ->
|
||||||
|
case device_bo:get_host_devices(HostId) of
|
||||||
|
{ok, Devices} ->
|
||||||
|
DevicesUUIDs = lists:map(fun(#{<<"device_uuid">> := DeviceUUID}) -> DeviceUUID end, Devices),
|
||||||
|
lists:foreach(fun(DeviceUUID) ->
|
||||||
|
DevicePid = iot_device:get_pid(DeviceUUID),
|
||||||
|
iot_device:change_status(DevicePid, 0)
|
||||||
|
end, DevicesUUIDs);
|
||||||
|
{error, _} ->
|
||||||
|
ok
|
||||||
|
end,
|
||||||
|
{noreply, State#state{register_map = NRegisterMap}}
|
||||||
|
end.
|
||||||
|
|
||||||
%% @private
|
%% @private
|
||||||
%% @doc This function is called by a gen_server when it is about to
|
%% @doc This function is called by a gen_server when it is about to
|
||||||
@ -103,4 +118,4 @@ code_change(_OldVsn, State = #state{}, _Extra) ->
|
|||||||
|
|
||||||
%%%===================================================================
|
%%%===================================================================
|
||||||
%%% Internal functions
|
%%% Internal functions
|
||||||
%%%===================================================================
|
%%%===================================================================
|
||||||
@ -37,6 +37,15 @@ init([]) ->
|
|||||||
modules => ['iot_endpoint_monitor']
|
modules => ['iot_endpoint_monitor']
|
||||||
},
|
},
|
||||||
|
|
||||||
|
#{
|
||||||
|
id => iot_host_monitor,
|
||||||
|
start => {'iot_host_monitor', start_link, []},
|
||||||
|
restart => permanent,
|
||||||
|
shutdown => 2000,
|
||||||
|
type => supervisor,
|
||||||
|
modules => ['iot_host_monitor']
|
||||||
|
},
|
||||||
|
|
||||||
#{
|
#{
|
||||||
id => 'iot_endpoint_sup',
|
id => 'iot_endpoint_sup',
|
||||||
start => {'iot_endpoint_sup', start_link, []},
|
start => {'iot_endpoint_sup', start_link, []},
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user