2015-04-06 37 views
2

我正在寻找一个好的状态机编译器来测试一些自定义网络协议。我查看了一些已有的工具,如Yakindu,Ragel(编译器),SCXML(语言),但我不确定它们中的任何一个是否可用于网络协议。用于C的有限状态机编译器模拟网络协议

SCXML(语言)看起来不错,但我找不到任何专门用于C的编译器(scxmlcc用于C++)。有谁知道基于SCXML的C编译器? Yakindu工具看起来很有前途,但我不确定是否可以测试像BGP/OSPF这样的网络协议。任何人都可以请给这个指针吗? Ragel看起来不错,但我不确定是否可以使用此编译器生成复杂的网络协议客户端。

我特别提到网络协议的原因是,我也希望能够在发生'事件'之后执行自定义例程,例如packet_create/packet_send(具有自定义数据包大小)等,作为'actions'的一部分。

是否需要始终从状态图生成代码或者是否有一种方法可以直接与状态进行交互? 我对FSM非常新,任何帮助/建议/建议/链接将不胜感激。

回答

5

默认Yakindu SCT C代码生成器生成明确的C代码,该代码与具体的执行环境无关。这意味着您可以获得一段标准的C代码,您可以手动将它集成到您​​自己的应用程序中。这种手动集成意味着在应用程序和状态机之间映射事件,操作和变量。此外,您必须正确触发状态机的执行。

你可以在user guide找到一些相关信息。您也可以自定义代码生成器以满足您的需求,但是如果集成到应用程序中总是看起来相同并且您想要集成多于一个或两个状态机,那么这只有意义。

因此,如果您提供了一些关于应用程序端API的更多信息,我可以提供一些提示,说明如何与状态机集成。

2

LOKI是一个新的应用程序,旨在为程序员和系统管理员提供一种与BGP网络交互的简单方法。用它来测试你的OSPF/BGP连接

2

我们刚刚完成了我们的SCXML - > ANSI C转换。目前,它只做调用。 Here是生成的ANSI C代码的示例,具有用户提供的回调和通用脚手架here。 2015年末MacBook [email protected]上单个微步的性能测量结果为here

请注意,脚手架是在C++ 98中,因为我们必须连接到数据模型实现才能通过SCXML IRP测试。生成的源代码是ANSI C。如果要变换SCXML状态图表中可以使用尽可能uscxml变换:

$ uscxml-transform -tc -i FILE_OR_URL -o GENERATED_HERE 

例如,为了从SCXML IRP套件打印所生成的C代码test144上STDOUT:

$ uscxml-transform -tc -i https://raw.githubusercontent.com/tklab-tud/uscxml/master/test/w3c/ecma/test144.scxml 

生成的ANSI-C代码通过所有SCXML IRP测试,但通过调用和自定义I/O处理器。

+0

我们仍然不确定嵌入的API,即挂钩到您的实际应用程序代码。如果您有任何建议,请随时在github上发布[发布问题](https://github.com/tklab-tud/uscxml/issues)。 – sradomski 2016-01-29 10:01:08