diff --git a/apps/iot/src/iot_device.erl b/apps/iot/src/iot_device.erl index ea66a66..59f9089 100644 --- a/apps/iot/src/iot_device.erl +++ b/apps/iot/src/iot_device.erl @@ -56,6 +56,8 @@ is_activated(Pid) when is_pid(Pid) -> gen_statem:call(Pid, is_activated). -spec change_status(Pid :: pid(), NewStatus :: integer()) -> no_return(). +change_status(undefined, _NewStatus) -> + ok; change_status(Pid, NewStatus) when is_pid(Pid), is_integer(NewStatus) -> gen_statem:cast(Pid, {change_status, NewStatus}). @@ -75,7 +77,9 @@ stop(Pid) when is_pid(Pid) -> %% initialize. To ensure a synchronized start-up procedure, this %% function does not return until Module:init/1 has returned. start_link(Name, DeviceUUID) when is_atom(Name), is_binary(DeviceUUID) -> - gen_statem:start_link({local, Name}, ?MODULE, [DeviceUUID], []). + gen_statem:start_link({local, Name}, ?MODULE, [DeviceUUID], []); +start_link(Name, DeviceInfo) when is_atom(Name), is_map(DeviceInfo) -> + gen_statem:start_link({local, Name}, ?MODULE, [DeviceInfo], []). %%%=================================================================== %%% gen_statem callbacks diff --git a/apps/iot/src/iot_host.erl b/apps/iot/src/iot_host.erl index 0e3b485..16b789a 100644 --- a/apps/iot/src/iot_host.erl +++ b/apps/iot/src/iot_host.erl @@ -133,8 +133,6 @@ start_link(Name, UUID) when is_atom(Name), is_binary(UUID) -> %% gen_statem:start_link/[3,4], this function is called by the new %% process to initialize. init([UUID]) -> - erlang:process_flag(trap_exit, true), - %% 重启时,认为主机是离线状态; 等待主机主动建立连接 {ok, _} = host_bo:change_status(UUID, ?HOST_OFFLINE), @@ -373,16 +371,12 @@ handle_event(cast, {handle, {feedback_result, Info0}}, session, State = #state{a end, {keep_state, State}; -handle_event(cast, {handle, {event, Event0}}, session, State = #state{aes = AES, devices = Devices}) -> +handle_event(cast, {handle, {event, Event0}}, session, State = #state{aes = AES}) -> EventText = iot_cipher_aes:decrypt(AES, Event0), case catch jiffy:decode(EventText, [return_maps]) of #{<<"event_type">> := ?EVENT_DEVICE, <<"params">> := #{<<"device_uuid">> := DeviceUUID, <<"status">> := Status}} -> - case lists:member(DeviceUUID, Devices) of - undefined -> - ok; - Pid -> - iot_device:change_status(Pid, Status) - end; + DevicePid = iot_device:get_pid(DeviceUUID), + iot_device:change_status(DevicePid, Status); Event when is_map(Event) -> lager:warning("[iot_host] event: ~p, not supported", [Event]); Other -> @@ -434,8 +428,8 @@ handle_data(#{<<"device_uuid">> := DeviceUUID, <<"service_name">> := ServiceName case iot_device:get_pid(DeviceUUID) of undefined -> ok; - Pid -> - case iot_device:is_activated(Pid) of + DevicePid when is_pid(DevicePid) -> + case iot_device:is_activated(DevicePid) of true -> %% 查找终端设备对应的点位信息 iot_router:route_uuid(DeviceUUID, FieldsList, Timestamp), @@ -444,7 +438,7 @@ handle_data(#{<<"device_uuid">> := DeviceUUID, <<"service_name">> := ServiceName NTags = Tags#{<<"uuid">> => UUID, <<"service_name">> => ServiceName, <<"device_uuid">> => DeviceUUID}, influx_client:write_data(DeviceUUID, NTags, FieldsList, Timestamp), - iot_device:change_status(Pid, 1); + iot_device:change_status(DevicePid, 1); false -> lager:notice("[iot_host] uuid: ~p, device_uuid: ~p, device is not activated", [UUID, DeviceUUID]) end