From cdb15ec8f055bcf3d6e79bb2fa177ddc85e2919f Mon Sep 17 00:00:00 2001 From: anlicheng Date: Mon, 28 Aug 2023 13:50:22 +0800 Subject: [PATCH] fix host --- apps/iot/src/iot_host.erl | 78 ++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 43 deletions(-) diff --git a/apps/iot/src/iot_host.erl b/apps/iot/src/iot_host.erl index af64bbb..b38c7e4 100644 --- a/apps/iot/src/iot_host.erl +++ b/apps/iot/src/iot_host.erl @@ -14,7 +14,6 @@ %% 主机状态 -define(STATE_DENIED, denied). --define(STATE_ACTIVATED, activated). -define(STATE_SESSION, session). %% API @@ -136,30 +135,14 @@ init([UUID]) -> {ok, _} = host_bo:change_status(UUID, ?HOST_OFFLINE), case host_bo:get_host_by_uuid(UUID) of - {ok, #{<<"authorize_status">> := AuthorizeStatus, <<"id">> := HostId}} -> - Aes = list_to_binary(iot_util:rand_bytes(32)), - StateName = case AuthorizeStatus =:= 1 of - true -> - ?STATE_ACTIVATED; - false -> - ?STATE_DENIED - end, - %% 启动主机相关的device,此时device的状态为离线状态 - {ok, Devices} = device_bo:get_host_devices(HostId), - lists:foreach(fun(DeviceUUID) -> - case iot_device_sup:ensured_device_started(DeviceUUID) of - {ok, DevicePid} -> - iot_device:change_status(DevicePid, ?DEVICE_OFFLINE); - {error, Reason} -> - lager:notice("[iot_host] host: ~p, start_device: ~p, get error: ~p", [UUID, DeviceUUID, Reason]) - end - end, Devices), - + {ok, #{<<"id">> := HostId}} -> %% 通过host_id注册别名, 可以避免通过查询数据库获取HostPid AliasName = get_alias_name(HostId), global:register_name(AliasName, self()), - {ok, StateName, #state{host_id = HostId, uuid = UUID, aes = Aes}}; + Aes = list_to_binary(iot_util:rand_bytes(32)), + + {ok, ?STATE_DENIED, #state{host_id = HostId, uuid = UUID, aes = Aes}}; undefined -> lager:warning("[iot_host] host uuid: ~p, loaded from mysql failed", [UUID]), ignore @@ -212,18 +195,8 @@ handle_event({call, From}, {publish_message, _, _, _}, _, State) -> %% 关闭授权 handle_event({call, From}, {activate, Auth}, StateName, State = #state{host_id = HostId, uuid = UUID, monitor_ref = MRef, channel_pid = ChannelPid}) -> case {StateName, Auth} of - {?STATE_DENIED, false} -> + {?STATE_DENIED, _} -> {keep_state, State, [{reply, From, ok}]}; - {?STATE_DENIED, true} -> - {next_state, ?STATE_ACTIVATED, State, [{reply, From, ok}]}; - - {?STATE_ACTIVATED, false} -> - {ok, _} = host_bo:change_status(UUID, ?HOST_OFFLINE), - change_devices_status(HostId, ?DEVICE_OFFLINE), - {next_state, ?STATE_DENIED, State, [{reply, From, ok}]}; - {?STATE_ACTIVATED, true} -> - {keep_state, State, [{reply, From, ok}]}; - {?STATE_SESSION, false} -> %% 取消之前的monitor erlang:demonitor(MRef), @@ -253,19 +226,26 @@ handle_event({call, From}, {attach_channel, ChannelPid}, _, State = #state{uuid {keep_state, State#state{channel_pid = ChannelPid, monitor_ref = MRef}, [{reply, From, ok}]}; %% 授权通过后,才能将主机的状态设置为在线状态 -handle_event({call, From}, {create_session, PubKey}, ?STATE_DENIED, State = #state{uuid = UUID}) -> - lager:debug("[iot_host] host_id(denied) uuid: ~p, create_session, will not change host status", [UUID]), - Reply = #{<<"a">> => false, <<"aes">> => <<"">>}, - EncReply = iot_cipher_rsa:encode(Reply, PubKey), - {keep_state, State, [{reply, From, {ok, <<10:8, EncReply/binary>>}}]}; +handle_event({call, From}, {create_session, PubKey}, _, State = #state{uuid = UUID, aes = Aes, host_id = HostId}) -> + {ok, #{<<"authorize_status">> := AuthorizeStatus}} = host_bo:get_host_by_uuid(UUID), + case AuthorizeStatus =:= 1 of + true -> + Reply = #{<<"a">> => true, <<"aes">> => Aes}, + EncReply = iot_cipher_rsa:encode(Reply, PubKey), + {ok, AffectedRow} = host_bo:change_status(UUID, ?HOST_ONLINE), + lager:debug("[iot_host] host_id(~p) uuid: ~p, create_session, will change status, affected_row: ~p", [?STATE_SESSION, UUID, AffectedRow]), -handle_event({call, From}, {create_session, PubKey}, StateName, State = #state{uuid = UUID, aes = Aes}) -> - Reply = #{<<"a">> => true, <<"aes">> => Aes}, - EncReply = iot_cipher_rsa:encode(Reply, PubKey), - {ok, AffectedRow} = host_bo:change_status(UUID, ?HOST_ONLINE), - lager:debug("[iot_host] host_id(~p) uuid: ~p, create_session, will change status, affected_row: ~p", [StateName, UUID, AffectedRow]), + %% 启动主机相关的device + start_devices(HostId), - {next_state, ?STATE_SESSION, State, [{reply, From, {ok, <<10:8, EncReply/binary>>}}]}; + {next_state, ?STATE_SESSION, State, [{reply, From, {ok, <<10:8, EncReply/binary>>}}]}; + false -> + lager:debug("[iot_host] host_id(denied) uuid: ~p, create_session, will not change host status", [UUID]), + Reply = #{<<"a">> => false, <<"aes">> => <<"">>}, + EncReply = iot_cipher_rsa:encode(Reply, PubKey), + + {next_state, ?STATE_DENIED, [{reply, From, {ok, <<10:8, EncReply/binary>>}}]} + end; %% 重新加载设备信息 handle_event({call, From}, {reload_device, DeviceUUID}, _, State) -> @@ -437,6 +417,18 @@ code_change(_OldVsn, StateName, State = #state{}, _Extra) -> %%% Internal functions %%%=================================================================== +start_devices(HostId) when is_integer(HostId) -> + %% 启动主机相关的device,此时device的状态为离线状态 + {ok, Devices} = device_bo:get_host_devices(HostId), + lists:foreach(fun(DeviceUUID) -> + case iot_device_sup:ensured_device_started(DeviceUUID) of + {ok, DevicePid} -> + iot_device:change_status(DevicePid, ?DEVICE_OFFLINE); + {error, Reason} -> + lager:notice("[iot_host] start_device: ~p, get error: ~p", [DeviceUUID, Reason]) + end + end, Devices). + %% 修改设备的状态 change_devices_status(HostId, NewStatus) when is_integer(HostId), is_integer(NewStatus) -> {ok, Devices} = device_bo:get_host_devices(HostId),