1.C#跨平臺物聯網通信框架ServerSuperIO(SSIO)介紹html
《連載 | 物聯網框架ServerSuperIO教程》1.4種通信模式機制。git
《連載 | 物聯網框架ServerSuperIO教程》2.服務實例的配置參數說明github
《連載 | 物聯網框架ServerSuperIO教程》- 3.設備驅動介紹網絡
《連載 | 物聯網框架ServerSuperIO教程》-4.如開發一套設備驅動,同時支持串口和網絡通信。併發
《連載 | 物聯網框架ServerSuperIO教程》- 5.輪詢通信模式開發及注意事項。框架
《連載 | 物聯網框架ServerSuperIO教程》- 6.併發通信模式開發及注意事項ide
《連載 | 物聯網框架ServerSuperIO教程》- 7.自控通信模式開發及注意事項post
《連載 | 物聯網框架ServerSuperIO教程》- 8.單例通信模式開發及注意事項this
目 錄spa
9. 協議過濾器,解決一包多發、粘包、冗餘數據... 2
9.1 概述... 2
9.2 實際問題... 2
9.3 5種過濾器及二次開發... 5
9.4 設備驅動開發注意事項... 6
9.5 宿主程序服務實例配置注意事項... 6
通信中涉及到數據包的概念,是通信協議中的數據組成形式。針對這塊內容,說簡單也簡單,說複雜也複雜。須要咱們系統性的把問題考慮全面,並用代碼實現。
在工業領域也有極端的狀況出現,早些年作通信的時候,數據包頭、包尾、數據長度、數據校驗位都對,可是就是解析出來的數據不正確,這種狀況不會常常出現,可是在某種特殊應用環境可能會頻繁出現,後來通過分析得出結論:多是因爲地質電磁干擾引發的。可是也有技術上的設計缺陷,例如:數據校驗位是累加和,改爲CRC是否是就不會出來這個問題了;另外對於增量數據,應該有補發機制等等。
參考協議:《連載 | 物聯網框架ServerSuperIO教程》-4.如開發一套設備驅動,同時支持串口和網絡通信
多包發送數據是應用環境中的一種狀況或一個問題,並非咱們會這樣實際應用,而是說在接收過程當中屢次接收數據才能完整接收客戶端一次發送的數據,可能因爲網絡環境或發送數據端形成的,示意以下圖:
例如實時數據的完整包爲:55 AA 00 61 43 7A 00 00 43 B4 15 0D。那麼接收數據的時候,第一次接收到:55 AA 00 61 43 7A 00 00 43 B4 15,第二次接到:0D。按通信協議應該可以把這兩次接收的數據進行自動拼接,造成完整的數據並進行解析。
ServerSuperIO設置了協議過濾器,能夠解決這個問題,以下圖:
我原來並不知道粘包這個概念,後來在網上看文章才明白。在通信領域中也是常常會遇到的問題。也就是多包數據一次性的接收,那麼就要合理的進行拆包。還有一種狀況,就是多包半的數據一次性的接收,那半包的數據結合「1.一包多發及解決」來解決這個問題,示意以下圖:
ServerSuperIO設置了協議過濾器,能夠解決這個問題,以下圖:
在工業領域受電纜或環境的電磁干擾,以及接頭虛接等,這種狀況極有可能出現。若是干擾的冗餘數據夾雜在一個協議包中間,那麼校驗出合法的數據很困難。若是干擾的冗餘數據夾雜在兩個協議包中間,那麼就能夠經過協議過濾來實現識別出有用的數據。示意以下圖:
ServerSuperIO設置了協議過濾器,能夠解決這個問題,以下圖:
FixedEndReceiveFliter:固定結尾的協議過濾器。 FixedHeadAndEndReceiveFliter:固定開頭和結尾的協議過濾器。 FixedHeadAndLengthReceiveFliter:固定開頭和長度的協議過濾器。 FixedHeadReceiveFliter:固定開頭的協議過濾器。 FixedLengthReceiveFliter:固定長度的協議過濾器。
這5個過濾器都繼承自IReceiveFilter接口,也能夠繼承這個接口進行二次開發,定製本身的協議過濾器。代碼工程以下圖:
對於開發設備驅動,在初始化過程當中能夠增長這個驅動的協議過濾器,代碼以下:
public override void Initialize(string devid) { this.Protocol.InitDriver(this.GetType(),new FixedHeadAndEndReceiveFliter(new byte[] {0x55,0xaa},new byte[] {0x0d} )); …… }
在配置參數中須要配置:StartReceiveDataFliter = true,協議過濾器才能起到做用。代碼以下:
static void Main(string[] args) { DeviceSelfDriver dev2 = new DeviceSelfDriver(); dev2.DeviceParameter.DeviceName = "網絡設備"; dev2.DeviceParameter.DeviceAddr = 1; dev2.DeviceParameter.DeviceID = "1"; dev2.DeviceDynamic.DeviceID = "1"; dev2.DeviceParameter.DeviceCode = "1"; dev2.DeviceParameter.NET.RemoteIP = "127.0.0.1"; dev2.DeviceParameter.NET.RemotePort = 9600; dev2.CommunicateType = CommunicateType.NET; dev2.Initialize("1"); IServer server = new ServerManager().CreateServer(new ServerConfig() { ServerName = "服務1", ComReadTimeout = 1000, ComWriteTimeout = 1000, NetReceiveTimeout = 1000, NetSendTimeout = 1000, ControlMode = ControlMode.Self, SocketMode = SocketMode.Tcp, StartReceiveDataFliter = true, ClearSocketSession = false, StartCheckPackageLength = false, CheckSameSocketSession = false, DeliveryMode = DeliveryMode.DeviceIP, }); server.AddDeviceCompleted += server_AddDeviceCompleted; server.DeleteDeviceCompleted+=server_DeleteDeviceCompleted; server.Start(); server.AddDevice(dev2); while ("exit" == Console.ReadLine()) { server.Stop(); } }
2.[開源]C#跨平臺物聯網通信框架ServerSuperIO(SSIO)介紹
2.應用SuperIO(SIO)和開源跨平臺物聯網框架ServerSuperIO(SSIO)構建系統的總體方案
3.C#工業物聯網和集成系統解決方案的技術路線(數據源、數據採集、數據上傳與接收、ActiveMQ、Mongodb、WebApi、手機App)
5.ServerSuperIO開源地址:https://github.com/wxzz/ServerSuperIO
物聯網&集成技術(.NET) QQ羣:54256083