DotNetty 實現 Modbus TCP 系列 (一) 報文類
DotNetty 實現 Modbus TCP 系列 (二) ModbusFunction 類圖及繼承舉例
DotNetty 作為一個半成品,我們不需要關註細節的實現,只需要關註自己的業務即可,所以最主要的就是處理 Codecs 和 Handler。
所有的 Codecs 和 Handler 均直接或間接繼承自 ChannelHandlerAdapter。為什麼要分為 Codecs 和 Handler,個人理解是 Codecs 負責將訊息解碼為我們所需的物件或者將處理的結果編碼,Handler 對解碼得到的物件進行邏輯處理,達到職責分離的目的。
DotNetty 中可以註冊多個 Codecs/Handler,入站訊息按照註冊的先後順序執行,出站訊息按照註冊的先後逆序執行。
對於 Client 端:
- 入站:ModbusDecoder –> ModbusResponseHandler
- 出站:ModbusEncoder
對於 Server 端:
- 入站:ModbusDecoder –> ModbusRequestHandler
- 出站:ModbusEncoder
ModbusDecoder
ModbusDecoder 繼承了 ByteToMessageDecoder。繼承了 ByteToMessageDecoder 的類必須實現的唯一的抽象方法:Decode,該方法將 ByteBuffer 解析為 List,如果 List 不為空則會將該 List 傳遞給下一個 ChannelHandlerAdapter。
ModbusDecoder 同時為 Client 端和 Server 端使用,如果是 Server 端則將訊息解析成請求類,反之如果是 Client 端則將訊息解析成響應類。
ModbusResponseHandler
將接收到的響應資訊加入 responses 供後續處理。
ModbusRequestHandler
responseService 為一個抽象類,用來自定義處理接收到的請求並傳回結果,需要在實現 Server 端時繼承並實現。
文中程式碼僅添加了 0x03 的方法)
ModbusEncoder
如果是 ModbusFrame 訊息則 Flush,否則傳遞到下一個 ChannelHandlerAdapter。
開源地址:https://github.com/VictorBu/modbus-tcp
原文地址:https://www.cnblogs.com/victorbu/p/10370890.html
.NET社群新聞,深度好文,歡迎訪問公眾號文章彙總 http://www.csharpkit.com