erlang 实现多状态机

-module(code_lock).
-behaviour(gen_fsm).
-export([send_evt/2]).
-export([create/2]).
-export([init/1, state_open/2, state_close/2]).

-record
(
    cmd_data,
    {
        cmd = send_evt,
        digit = 0
    }
).

-record
(
    lock_data,
    {
        input_buf = [],
        code_buf = []
    }
).

%% 输入界面
send_evt(Obj, Digit) ->
    gen_fsm:send_event( Obj, #cmd_data{digit=Digit} ).

%% 初始化锁
create(Obj, Code) ->
    gen_fsm:start_link({local, Obj}, code_lock, #lock_data{code_buf=Code}, []).
init( LockData ) ->
    {ok, state_close, LockData }.

%% 开状态
state_open( Cmd, LockData ) ->
    case Cmd of
        timeout ->
            io:format("state_open ~p ~n", [LockData]),
            {next_state, state_close, LockData};
        Default ->
            TimeOut = 10000,
            io:format("state_close Default ~n"),
            {next_state, state_close, LockData}
    end.

% 关状态 %
state_close( Cmd, LockData ) ->
    Buf = LockData#lock_data.input_buf,
    Code = LockData#lock_data.code_buf,
    case Cmd of
        #cmd_data{ digit=CurDigit } ->
            TimeOut = 10000,
            case Buf ++ [CurDigit] of
                Code ->
                    io:format("Current Input: ~p ~nSucced in Unlock. ~n", [Code]),
                    {next_state, state_open, #lock_data{code_buf=Code}, TimeOut};
                CurNums when length(CurNums)<length(Code) ->
                    io:format("Current Input: ~p ~n", [CurNums]),
                    {next_state, state_close, #lock_data{input_buf = CurNums, code_buf=Code}, TimeOut};
                Default ->
                    io:format("Failed in Unlock. ~nCurrent Input: ~p ~n", [Default]),
                    {next_state, state_close, #lock_data{code_buf=Code}, TimeOut}
            end;
        timeout ->
            io:format("Input TimeOut. Clear! ~n"),
            {next_state, state_close, #lock_data{code_buf=Code}};
        Default ->
            TimeOut = 10000,
            io:format("state_close Default ~n"),
            {next_state, state_close, #lock_data{code_buf=Code}, TimeOut}
    end.


Eshell V5.10.4  (abort with ^G)
1> make:all().
Recompile: code_lock
code_lock.erl:2: Warning: undefined callback function code_change/4 (behaviour 'gen_fsm')
code_lock.erl:2: Warning: undefined callback function handle_event/3 (behaviour 'gen_fsm')
code_lock.erl:2: Warning: undefined callback function handle_info/3 (behaviour 'gen_fsm')
code_lock.erl:2: Warning: undefined callback function handle_sync_event/4 (behaviour 'gen_fsm')
code_lock.erl:2: Warning: undefined callback function terminate/3 (behaviour 'gen_fsm')
code_lock.erl:41: Warning: variable 'Default' is unused
code_lock.erl:42: Warning: variable 'TimeOut' is unused
code_lock.erl:68: Warning: variable 'Default' is unused
up_to_date
2> code_lock:create( t1, [1,2,3] ).
{ok,<0.42.0>}
3> code_lock:send_evt( t1, 1 ).
Current Input: [1] 
ok
4> Input TimeOut. Clear! 
4> code_lock:send_evt( t1,2 ).

Current Input: [2] 
ok
5> code_lock:send_evt( t1, 1 ).
Input TimeOut. Clear! 
Current Input: [1] 
ok
6> Input TimeOut. Clear! 
6> code_lock:send_evt( t1, 1 ).

Current Input: [1] 
ok
7> code_lock:send_evt( t1, 2).

Current Input: [1,2] 
ok
8> code_lock:send_evt( t1, 3).

Current Input: [1,2,3] 
Succed in Unlock. 
ok
9> 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. RabbitMQ简介 RabbitMQ是一个开源的消息代理,它实现了高级消息队列协议(AMQP),并且支持多种协议。RabbitMQ支持多种编程语言,包括Java、Python、Ruby、PHP、C#等等。RabbitMQ是一个可靠的、可扩展的、可插拔的并且易于使用的消息代理。 2. RabbitMQ安装 2.1 安装Erlang RabbitMQ是基于Erlang语言开发的,所以在安装RabbitMQ之前需要先安装Erlang。可以到Erlang官网下载最新版的Erlang安装包。 2.2 安装RabbitMQ 下载RabbitMQ安装包,根据操作系统的不同选择对应的安装包进行安装。安装过程中需要选择安装目录、配置文件等。 3. RabbitMQ配置 3.1 配置文件 RabbitMQ的配置文件在安装目录下的/etc/rabbitmq目录中。配置文件可以包含多个节,每个节包含多个键值对。可以通过修改配置文件来修改RabbitMQ的行为。 3.2 用户管理 在RabbitMQ中,需要通过用户进行身份验证才能使用RabbitMQ。可以通过以下命令创建用户: rabbitmqctl add_user username password 可以通过以下命令为用户分配角色: rabbitmqctl set_user_tags username role 其中role可以是以下几种角色之一: - administrator:管理员角色,可以进行所有操作。 - management:管理角色,可以管理RabbitMQ,但是不能进行敏感操作。 - monitoring:监控角色,可以查看RabbitMQ的状态信息。 - policymaker:策略制定者角色,可以制定RabbitMQ的策略。 3.3 虚拟主 在RabbitMQ中,虚拟主是一个逻辑概念,它允许在同一个RabbitMQ服务器上创建多个逻辑消息代理。每个虚拟主有自己的用户、队列、交换等。可以通过以下命令创建虚拟主: rabbitmqctl add_vhost vhost_name 可以通过以下命令为虚拟主分配权限: rabbitmqctl set_permissions -p vhost_name username ".*" ".*" ".*" 其中,第一个.*表示允许用户对虚拟主中的队列进行所有操作,第二个.*表示允许用户对虚拟主中的交换进行所有操作,第三个.*表示允许用户对虚拟主中的绑定进行所有操作。 4. RabbitMQ使用 4.1 生产者 生产者向RabbitMQ中的队列发送消息。可以使用RabbitMQ提供的客户端库来编写生产者。 4.2 消费者 消费者从RabbitMQ中的队列接收消息。可以使用RabbitMQ提供的客户端库来编写消费者。 4.3 队列 队列是RabbitMQ中最基本的组件,生产者向队列发送消息,消费者从队列接收消息。可以通过RabbitMQ控制台来创建队列。 4.4 交换 交换是用来接收生产者发送的消息,并将消息路由到指定的队列中。可以通过RabbitMQ控制台来创建交换。 4.5 绑定 绑定是将队列和交换绑定在一起,并指定路由键。可以通过RabbitMQ控制台来创建绑定。 5. 总结 RabbitMQ是一个开源的消息代理,它实现了高级消息队列协议(AMQP),并且支持多种协议。RabbitMQ支持多种编程语言,包括Java、Python、Ruby、PHP、C#等等。RabbitMQ是一个可靠的、可扩展的、可插拔的并且易于使用的消息代理。在使用RabbitMQ时,需要先安装Erlang,然后安装RabbitMQ。可以通过修改配置文件来修改RabbitMQ的行为。在使用RabbitMQ时,需要创建用户、虚拟主、队列、交换和绑定等组件。可以使用RabbitMQ提供的客户端库来编写生产者和消费者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值