SECS/GEM-Golang解包、封包库
这一篇算是有时间就补一下以前做的事。之前有提过Go有Encode/Decode SML/HSMS消息的库,该库对SECS2基协议解析基础完备的支持,易于使用的话需要对其进行一些细微的修改。
这个库的学习可以通过各个文件的Test案例进行了解,基本上使用起来不会有太大的问题。
库简单讲解
库中对Go语言Duck Type的运用是很优秀的,而且也是很常用的。
例如,通过对SECS-II数据节点的抽象;对HSMS消息的抽象。这些在看源码时,都是可以有心学习的。
1 | type ItemNode interface { |
其中,经过我对比其他库,这个库的优点是对消息中变量的支持,可以事先插入变量在SML消息中进行占位,在后面对这些变量占位进行填充。
1 | NewIntNode(2, "var1").FillVariables(map[string]interface{}{"var1": 1}) |
但是,这里存在一个问题,这个库对数据获取的没有提供一个好的方式,例如我想获取List嵌套下的某一个Int中的第二个元素,这个就没办法了,需要我们自己进行拓展。例如Java中:
1 | // github.com/kenta-shimizu/secs4java8 |
修改
库中对消息节点的解析已经将数据解析到节点的values中,但是没有获取数据的method。
1 | type IntNode struct { |
这里就是要将其暴露出去,给到外部进行获取。
ItemNode
增加三个方法,Values、Get、Type.
Values:获取节点上的数据;
Get:获取节点,主要是List节点;
Type:标识数据节点;
1 | type ItemNode interface { |
List节点Get
函数:
1 | func (node *ListNode) Get(indices ...int) (ItemNode, error) { |
其他节点Get
函数:
1 | func (node *IntNode) Get(indices ...int) (ItemNode, error) { |
给DataMessage
添加获取节点数据的函数:
1 | GetAscii(indices ...int) (string, error) |
这样,即可获取到指定数据节点的信息,效果和Java库是一致的。
1 | func TestMessageNode_ProducedByFactoryMethod_HSMS11(t *testing.T) { |
本文标题:SECS/GEM-Golang解包、封包库
文章作者:小师
发布时间:2023-11-15
最后更新:2024-08-18
原始链接:chunlife.top/2023/11/15/SECS-GEM-Golang解包、封包库/
版权声明:本站所有文章均采用知识共享署名4.0国际许可协议进行许可