自动配置状态参数

在使用 Stateless 开源库时,你可以通过 XML 文件来定义状态机的状态、转移和触发事件,并编写代码来读取 XML 文件并自动配置 Stateless 状态机。以下是一个简单的例子来说明如何实现这一点:

首先,你需要一个 XML 文件来定义状态机的配置,比如 StateMachineConfig.xml:

<StateMachineConfig>  
  <States>  
    <State Name="Idle" />  
    <State Name="CheckingOut" />  
    <State Name="Completed" IsFinal="true" />  
  </States>  
  <Triggers>  
    <Trigger Name="Start" />  
    <Trigger Name="Complete" />  
    <Trigger Name="Cancel" />  
  </Triggers>  
  <Transitions>  
    <Transition From="Idle" Trigger="Start" To="CheckingOut" />  
    <Transition From="CheckingOut" Trigger="Complete" To="Completed" />  
    <Transition From="CheckingOut" Trigger="Cancel" To="Idle" />  
  </Transitions>  
</StateMachineConfig>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using Stateless;

public class StateMachineConfigLoader  
{  
    public StateMachine<string, string> Load(string filePath)  
    {  
        var xDoc = XDocument.Load(filePath);  
  
        var stateMachine = new StateMachine<string, string>();  
  
        // 加载状态  
        foreach (var stateElement in xDoc.Root.Element("States")?.Elements("State") ?? Enumerable.Empty<XElement>())  
        {  
            string stateName = stateElement.Attribute("Name")?.Value;  
            bool isFinal = bool.Parse(stateElement.Attribute("IsFinal")?.Value ?? "false");  
            stateMachine.Configure(stateName).AsFinal(isFinal);  
        }  
  
        // 加载触发事件  
        // 注意:对于 Stateless,通常不需要显式加载触发事件,因为你可以在转移时定义它们  
  
        // 加载转移  
        foreach (var transitionElement in xDoc.Root.Element("Transitions")?.Elements("Transition") ?? Enumerable.Empty<XElement>())  
        {  
            string fromState = transitionElement.Attribute("From")?.Value;  
            string trigger = transitionElement.Attribute("Trigger")?.Value;  
            string toState = transitionElement.Attribute("To")?.Value;  
  
            if (fromState != null && trigger != null && toState != null)  
            {  
                stateMachine.Configure(fromState)  
                    .Permit(trigger, toState);  
            }  
        }  
  
        // 返回配置好的状态机  
        return stateMachine;  
    }  
}  
  
class Program  
{  
    static void Main(string[] args)  
    {  
        var loader = new StateMachineConfigLoader();  
        var stateMachine = loader.Load("StateMachineConfig.xml");  
  
        // 设置初始状态(如果需要)  
        stateMachine.InitializeAsync("Idle").Wait();  
  
        // 现在你可以使用 stateMachine 来触发事件和检查状态了  
        stateMachine.Fire("Start");  
        Console.WriteLine(stateMachine.State); // 应该输出 "CheckingOut"  
  
        // ... 其他逻辑 ...  
    }  
}

请注意,在这个例子中,我假设了 XML 文件的格式,并且根据这个格式编写了相应的加载逻辑。此外,由于 Stateless 库的 StateMachine 类在配置时通常是链式的,所以我在 Load 方法中直接进行了配置。对于触发事件,你通常不需要在 XML 中明确列出它们,因为你可以在定义转移时隐式地定义它们。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.需要机房提供 信令点在哪个E1的哪个时隙、OPC和DPC、SLC、CIC从哪开始、ISUP还是TUP 呼叫是透传(如果是透传又分普通透传和呼叫前转两种)的还是隐藏的。 2.进入设备 EIS(config)#dev 40 1 E1[1][0]: useflag=1, state=1, crc4=0, alarm=0, linestate=0x2, errstate=0xf0, loopstate=4 E1[1][1]: useflag=1, state=1, crc4=0, alarm=0, linestate=0x2, errstate=0xf0, loopstate=4 E1[1][2]: useflag=1, state=1, crc4=0, alarm=0, linestate=0x2, errstate=0xf0, loopstate=4 E1[1][3]: useflag=1, state=1, crc4=0, alarm=0, linestate=0x2, errstate=0xf0, loopstate=4 E1[1][4]: useflag=1, state=1, crc4=0, alarm=0, linestate=0x2, errstate=0xf0, loopstate=4 E1[1][5]: useflag=1, state=1, crc4=0, alarm=0, linestate=0x2, errstate=0xf0, loopstate=4 E1[1][6]: useflag=1, state=1, crc4=0, alarm=0, linestate=0x2, errstate=0xf0, loopstate=4 E1[1][7]: useflag=1, state=1, crc4=0, alarm=0, linestate=0x2, errstate=0xf0, loopstate=4 useflag=为1代表PCM做了对应数据 state=状态为1,代表E1物理连接正常。 3.EIS(config)#ex EIS#sh mcc 16 ------------MCC global Informations----------------- HDLC mode is: ST_CO_64K. MCC Init Status = 1. MCC Init times = 1. MCC GOV FAIL times = 0. MCC GUN FAIL times = 0. MCC handle int times = 0. MCC recv int circle table ptr= 1459. -----------------------END-------------------------- ------------MCC channel 16 Informations----------------- chan16 send frames num = 27207878. chan16 recv frames num = 283003467. chan16 send FAILED num = 0. chan16 recv FAILED num = 0. 红色部分如果一直在增大,证明数据传输正常。如果变化的数字是一样的,E1可能自环。 chan16 send frames num = 27207878. chan16 recv frames num = 0. 如果这样的情况,就代表机房没做数据,或则双方的信令点没对上。 4.按照机房数据添加 这三个表 7号中继管理的 Web界面 命令界面 TG的OPC和DPC是10进制。如果机房提供的是非10进制的,需要转换。 7号MTP链路管理 Web界面 命令界面 上图是一个信令点在第一个E1的16时隙的例子。时隙一般是1或则16。 7号PCM管理 WEB界面 命令界面 上图是一个CIC从0开始的。如果从33开始就是PCM从1开始。 只要 和 这两个表做了数据,并和机房对应上,这个时候 Sh ss7 c就能看到7号链路建立,如果没建立成功。可以sh ss7 e看看有无报错。 号码属性的配置可以通过以下命令修改 EIS(config)#ss7 c Call change(y/n):n Not send LSTM(y/n):n 不发送LSTM Protocol is TUP(y/n):n 是否TUP Protocol is ISUP(y/n):n 是否ISUP Calling is subscriber(y/n):n 主叫用户号码 Calling is national(y/n):n 主叫国内号码 Calling is international(y/n):n 主叫国际号码 Called is subscriber(y/n):n 被叫用户号码 Called is national(y/n):n 被叫国内号码 Called is international(y/n):n 被叫国际号码 Protocol is itu-t(y/n):n Protocol is ansi(y/n):n Peer is shanghai alcatel-bell(y/n):n 送隐藏号码 清空numsect 表,在callpool表里加上机房提供的主叫号码 默认透传只需要 insert NumSect (0,0,255,65535,0,,,,0) 号码池里有这条数据即可 如果是呼叫前转的。 EIS(config)#select intparam (paramid=57) ROWID ParamID ParamDesc ParamVal -------------------------------------------------------------------------------------------- 107 57 Number transfer type(0:no trans, 1:PRA trans 2:SS7 trans) 2 清空numsect 表 在callpool表里加上机房提供的主叫号码 比如: 号码池 0206666 主叫 07557777 被叫: 1358888 eix上送过来的呼叫:主叫 07557777 呼叫被叫1358888 通过tg送出去之后,消息里面看起来就是 07557777呼叫给0206666,然后0206666呼转到1358888的 然后被叫手机1358888上还能正常显示主叫 07557777 pra对接 Pra的配置相对于7号就方便很多,只要和机房确定 每个E1是独立D通道。 还是就第一个E1有D通道,其他E1共用这个D通道。 交换机的接口是用户侧还是网络侧 如下图 这是一个每个E1都是D通道,交换机是网络侧的配置 命令里的显示 EIS(config)#db ex pratable insert PraTable (0,0,1,0,0,255,0,0,0) insert PraTable (1,0,1,1,0,0,0,0,0) insert PraTable (2,0,1,2,0,0,0,0,0) insert PraTable (3,0,1,3,0,0,0,0,0) insert PraTable (4,0,1,4,0,0,0,0,0) insert PraTable (5,0,1,5,0,0,0,0,0) insert PraTable (6,0,1,6,0,0,0,0,0) insert PraTable (7,0,1,7,0,0,0,0,0) EIS(config)#sel pratable (*) PRA群号 PRA接口ID E1端口号 是否D通道 绑定PRA群号 接口属性 ROWID PraGrpNo PraId SlotNo PortNo DChannel BindGrp E1所在槽位号,固定填1 NetMode CircSel Reserv 接口属性 -------------------------------------------------------------------------------------------------------- 0 0 0 1 0 0 255 0 0 0 1 1 0 1 1 0 0 0 0 0 2 2 0 1 2 0 0 0 0 0 3 3 0 1 3 0 0 0 0 0 7 4 0 1 4 0 0 0 0 0 6 5 0 1 5 0 0 0 0 0 5 6 0 1 6 0 0 0 0 0 4 7 0 1 7 0 0 0 0 0 如下图 这是一个只有第一个E1是D通道,其他E1共用第一个E1的D通道 命令行是 EIS(config)#db ex pratable insert PraTable (0,0,1,0,0,255,0,0,0) insert PraTable (1,0,1,1,1,0,0,0,0) insert PraTable (2,0,1,2,1,0,0,0,0) insert PraTable (3,0,1,3,1,0,0,0,0) EIS(config)#sel pratable (*) ROWID PraGrpNo PraId SlotNo PortNo DChannel BindGrp NetMode CircSel Reserv -------------------------------------------------------------------------------------------------------- 1 0 0 1 0 0 255 0 0 0 0 1 0 1 1 1 0 0 0 0 2 2 0 1 2 1 0 0 0 0 3 3 0 1 3 1 0 0 0 0 说明:  PRA群号:ETG/EIG进行PSTN呼出路由配置时所用的序号(由用户自己选择,一个PRA群需要配置一条D通道,一个PRA群可以包含多条E1);  PRA接口标识:每个PRA接口的标识(PRA接口ID代表该E1的标识,要与交换机保持一致;1条E1为一个PRA接口时一般填0);  槽位号:一般固定填写1;  E1端口号:接入PSTN的E1在EIG上对应的编号,编号依次为0-7;  是否D通路:是否将当前E1的第16时隙配置为PRA接口的D通路(信令通路),Dchannel=0代表配置了D通道;  NetMode=0代表用户侧接口,NetMode=1代表网络侧接口  CircSel为电路分配时的选择方式,电路选择方式(0最小,1最大,2循环) 1、如果是一个独立的PRA群,将“绑定PRA群号”配置成255即可。 2、如果要将PRA群0、PRA群1、PRA群2绑定,可以将PRA群1、PRA群2的“绑定PRA群号”配置成PRA群0,PRA群0的BindGrp无需配置,并且以PRA群0来配置呼出路由或SIP中继的落地PRA群号。 3、只需要在“D通道”所在的数据记录上配置即可。 4、如此配置之后,呼叫会在绑定的这几个PRA群中自动选择空闲的呼出。 5、sho q9 call或sho q9 sta 的统计信息没有变化:按照实际呼出、呼入时所在的接口进行统计、显示。 E1接好后可以通过这个命令查看 EIS(config)#dev 40 1 E1[1][0]: useflag=1, state=1, crc4=0, alarm=0, linestate=0x0, errstate=0x0, loopstate=4 (TG配置了PRA数据)(E1的物理状态) EIS#sh mcc 0 ------------MCC global Informations----------------- HDLC mode is: ST_CO_64K. MCC Init Status = 1. MCC Init times = 1. MCC GOV FAIL times = 0. MCC GUN FAIL times = 0. MCC handle int times = 0. MCC handle int times = 0. MCC recv int circle table ptr= 1787. -----------------------END-------------------------- ------------MCC channel 0 Informations----------------- chan0 send frames num = 65833. chan0 recv frames num = 65786. 这两行数据会变就代表数据收发正常 如果chan0 send frames num 有数据 chan0 recv frames num 没有数据,就代表我们做了PRA数据,机房没做 chan0 send FAILED num = 0. chan0 recv FAILED num = 1. chan0 TX UN interrupt num = 0. chan0 RX MRF interrupt num = 0. chan0 RX BSY interrupt num = 0. chan0 RX CRC errors num = 0. chan0 RX AB errors num = 1. chan0 RX NO errors num = 0. chan0 RX LG errors num = 0. chan0 RX BUF errors num = 0. chan0 RX SS7 SUERM errors num = 0. chan0 RX SS7 AERM errors num = 0. -------------------channel 0 END----------------------- ------------channel 0 BDs Informations----------------- chan0 txBdBase = 0x1939004. chan0 txBdNum = 32. chan0 txBdPtr = 9. chan0 rxBdBase = 0x1939104. chan0 rxBdNum = 32. chan0 rxBdPtr = 27. ----------------channel 0 BDs END---------------------- 数据做好后检查链路是否建立 EIS#sh q931 call E1 = 8 COMPORT = 128 DATA LINK STATE = ESTB //数据链路状态正常,反则为 WAIT_ ESTB CURRENT CALL NUM = 0 MAX CALL NUM AT SAME TIME= 0 当查询PRA状态时,如果状态为“故障”,可以遵循以下步骤进行排查: A) 检查存在故障的PRA接口对应的E1与EIG连接是否正常 B) 检查接口数据配置是否有误(例如D通路配置错误,将非D通道的E1配置为D通道,导致EIG与电信交换机PRA接口建立失败); 图1-1 E1连接示意图 C) 检查E1是否存在交叉连接(俗称鸳鸯线),即两E1的收发同时存在交叉连接(例如E1A的收发接到E1B的收发上),或两E1的收发部分存在交叉连接(例如E1A的收连接正确,而发却连接到E1B的发) D) 检查PRA接口的数据帧格式类型是否与交换机侧一致(此为高级设置,如果出现此类问题,请与厂商联系); 主从TG配置说明 1、选定一台tg作为主tg 2、在pubparam里面配置87号参数为main insert PubParam (87,tg series flag: [normal,main,slave],main) 3、保存数据库,重启系统 4、主tg重启后,在sip中继表中配置到从tg的sip中继信息,每一个从tg到主tg都必须配置一条中继,参数加密,ip地址认证 Insert SipTrunk (11,ss-1,cechi,888888,xxx.xx.xx.xx,2080,1,0,65535,0,00:00:00,00:00:00,65535,65535,0,0,1,1,0,0,2,0,0) 5、配置7号trunkno,配置mtp信息 6、配置ss7pcm信息时注意,最后一个字段siptrunk,参数65535代表本地的e1,从tg的e1信息时,siptrunk为到从tg的sip中继号 insert Ss7Pcm (0,1,0,65535) insert Ss7Pcm (0,0,7,11) 如上和从TG的SIP编号是11,所以指向从TG的PCM后trunkno=11 7、呼叫选路时,把主tg的七号中继,从tg的sip中继都要作为一个路由,顺序可以先从tg,再主tg的7号,或者自定义 从tg配置: 1、建议加载空白数据库,避免残留数据 2、公共参数表里面配置87参数为slave insert PubParam (87,tg series flag: [normal,main,slave],slave) 3、公共参数表里面配置88参数为主tg上对应从tg的sip中继密码 insert PubParam (88,tg series main tg password: ,888888) 4、公共参数表里面配置89参数为主tg的ip地址 insert PubParam (89,tg series main tg ip: ,xxx.xxx.xxx.xxx) 5、保存数据,重启 PS: 从TG不用配置,数据都是从主TG自动生成过去的 可以通过sh tg的命令查看TG状态 以下是主从连上后的状态 主TG上 EIS#sh tg Current tg role : main NO. SipTrunk State AvailableTs Ip ------------------------------------------- 0 11 Reg 248 xxx.xxx.xxx.xxx 从TG上 EIS#sh tg Current tg role : slave Main Tg Ip :xx.xx.xx.xx Main Tg SipTrunk :1 Main Tg Password :888888 ------------------------------------------- Regiseter State :Registered Link State :Connect Main Tg Signal State :Connect

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值