Skip to content

2.5 抽象协议层 Protocol

luosheng edited this page Jun 7, 2023 · 1 revision

抽象协议层是某一类型的协议的公共内核,以及管理具体协议层的入口。

Modbus.Net的抽象协议层为IProtocol,其中管理了大量的ProtocolUnit。

每一个ProtocolUnit就是一个抽象协议,它并不是真正的协议,而是协议的公共部分。
比如Modbus协议中,
Rtu协议为 从站-协议号-地址-数据-CRC校验
ASCII协议为 从站-协议号-地址-数据-LRC校验
TCP协议为 4个0-从站-协议号-地址-数据
那么它们的公共部分就是 从站-协议号-地址-数据

BaseProtocol实现了一个惰性加载ProtocolUnit的字典,这个字典不需要手动添加,只需要直接指明ProtocolUnit的类型,它就能把相应的ProtocolUnit自动懒加载到字典当中供使用者调用。

内部实现:

  • ProtocolUnit

    ProtocolUnit继承自IProtocolFormatting,由两个方法构成,Format和Unformat。

     public abstract TParamIn Format(IInputStruct message);
    
     public abstract IOutputStruct Unformat(TParamOut messageBytes, ref int pos);

    Format把IInputStruct变为输入参数,Unformat把输出参数变为IOutputStruct。

    您可以参考Modbus.Net.Modbus中的ModbusProtocol.cs,实现自己的ProtocolUnit。

  • BaseProtocol

    BaseProtocol实现了一个惰性加载的Dictionary。

     public ProtocolUnit this[Type type]

    这个Dictionary以ProtocolUnit的类型作为参数,当ProtocolUnit未加载时,则将ProtocolUnit加载到Dictionary中,否则直接调用缓存。

    当需要发送数据和接收数据的时候,则直接调用ProtocolUnit的Format和Unformat方法构造与解构协议内容。

    如果您想实现自己的加载方法,请直接继承IProtocol。

内部图4

外部接口:

当构造IProtocol的时候,会要求添加一个IProtocolLinker,这个Linker代表了具体协议的构造与发送器。

IProtocol只有SendReceive一个主要方法,在IUtilityMethod向其发送SendReceive用于传递消息的时候,IProtocol则会把协议变为输入参数(默认为字节数组),然后发送给IProtocolLinker的SendReceive。

外部图4

Home

Clone this wiki locally