《連載 | 物聯網框架ServerSuperIO教程》- 9. 協議過濾器,解決一包多發、粘包、冗餘數據

来源:http://www.cnblogs.com/lsjwq/archive/2016/11/20/6083633.html
-Advertisement-
Play Games

在工業領域也有極端的情況出現,早些年做通訊的時候,數據包頭、包尾、數據長度、數據校驗位都對,但是就是解析出來的數據不正確,這種情況不會經常出現,但是在某種特殊應用環境可能會頻繁出現,後來經過分析得出結論:可能是由於地質電磁干擾引起的。但是也有技術上的設計缺陷,例如:數據校驗位是累加和,改成CRC是不... ...


1.C#跨平臺物聯網通訊框架ServerSuperIO(SSIO)介紹

《連載 | 物聯網框架ServerSuperIO教程》1.4種通訊模式機制。

《連載 | 物聯網框架ServerSuperIO教程》2.服務實例的配置參數說明

《連載 | 物聯網框架ServerSuperIO教程》- 3.設備驅動介紹

《連載 | 物聯網框架ServerSuperIO教程》-4.如開發一套設備驅動,同時支持串口和網路通訊。

《連載 | 物聯網框架ServerSuperIO教程》- 5.輪詢通訊模式開發及註意事項。

《連載 | 物聯網框架ServerSuperIO教程》- 6.併發通訊模式開發及註意事項

《連載 | 物聯網框架ServerSuperIO教程》- 7.自控通訊模式開發及註意事項

《連載 | 物聯網框架ServerSuperIO教程》- 8.單例通訊模式開發及註意事項


 

目       錄

9. 協議過濾器,解決一包多發、粘包、冗餘數據... 2

9.1  概述... 2

9.2 實際問題... 2

9.3 5種過濾器及二次開發... 5

9.4 設備驅動開發註意事項... 6

9.5 宿主程式服務實例配置註意事項... 6

9. 協議過濾器,解決一包多發、粘包、冗餘數據  

9.1    概述

     通訊中涉及到數據包的概念,是通訊協議中的數據組成形式。針對這塊內容,說簡單也簡單,說複雜也複雜。需要我們系統性的把問題考慮全面,並用代碼實現。

     在工業領域也有極端的情況出現,早些年做通訊的時候,數據包頭、包尾、數據長度、數據校驗位都對,但是就是解析出來的數據不正確,這種情況不會經常出現,但是在某種特殊應用環境可能會頻繁出現,後來經過分析得出結論:可能是由於地質電磁干擾引起的。但是也有技術上的設計缺陷,例如:數據校驗位是累加和,改成CRC是不是就不會出來這個問題了;另外對於增量數據,應該有補發機制等等。

9.2    實際問題

參考協議:《連載 | 物聯網框架ServerSuperIO教程》-4.如開發一套設備驅動,同時支持串口和網路通訊

  1. 1.      一包多發及解決

     多包發送數據是應用環境中的一種情況或一個問題,並不是我們會這樣實際應用,而是說在接收過程中多次接收數據才能完整接收客戶端一次發送的數據,可能由於網路環境或發送數據端造成的,示意如下圖:

 

     例如實時數據的完整包為: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. 2.      粘包及解決

    我原來並不知道粘包這個概念,後來在網上看文章才明白。在通訊領域中也是經常會遇到的問題。也就是多包數據一次性的接收,那麼就要合理的進行拆包。還有一種情況,就是多包半的數據一次性的接收,那半包的數據結合“1.一包多發及解決”來解決這個問題,示意如下圖:

 

    ServerSuperIO設置了協議過濾器,可以解決這個問題,如下圖:

  1. 3.      冗餘數據的出現及解決

       在工業領域受電纜或環境的電磁干擾,以及接頭虛接等,這種情況極有可能出現。如果干擾的冗餘數據夾雜在一個協議包中間,那麼校驗出合法的數據很困難。如果干擾的冗餘數據夾雜在兩個協議包中間,那麼就可以通過協議過濾來實現識別出有用的數據。示意如下圖:

 

      ServerSuperIO設置了協議過濾器,可以解決這個問題,如下圖:

9.3    5種過濾器及二次開發

   FixedEndReceiveFliter:固定結尾的協議過濾器。
   FixedHeadAndEndReceiveFliter:固定開頭和結尾的協議過濾器。
   FixedHeadAndLengthReceiveFliter:固定開頭和長度的協議過濾器。
   FixedHeadReceiveFliter:固定開頭的協議過濾器。
   FixedLengthReceiveFliter:固定長度的協議過濾器。

    這5個過濾器都繼承自IReceiveFilter介面,也可以繼承這個介面進行二次開發,定製自己的協議過濾器。代碼工程如下圖:

 

9.4    設備驅動開發註意事項

     對於開發設備驅動,在初始化過程中可以增加這個驅動的協議過濾器,代碼如下:

public override void Initialize(string devid)
{
            this.Protocol.InitDriver(this.GetType(),new FixedHeadAndEndReceiveFliter(new byte[] {0x55,0xaa},new byte[] {0x0d} ));
……
}

9.5    宿主程式服務實例配置註意事項

    在配置參數中需要配置: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();
            }
}

1.[連載]《C#通訊(串口和網路)框架的設計與實現》

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 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.存儲與文件系統 存儲設備 存儲設備(常見的是磁碟/硬碟,固態硬碟) 文件系統 文件系統是操作系統用於存儲設備或分區上的文件的方法和數據結構 分散式文件系統 文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過網路與節點相連 2.分散式文件系統 3.常見的分散式文件系統有: GFS: G ...
  • Database Configuration Assistant安裝失敗 向廣大園友求助 ...
  • 前面的話 對於前端工程師來說,資料庫並不是主要技能點,但是基本的增刪改查操作還是需要瞭解的。小火柴將mysql資料庫的學習記錄整理如下 目錄 前端學資料庫之基礎操作 前端學資料庫之數據類型 前端學資料庫之數據表操作 前端學資料庫之記錄操作 前端學資料庫之中文亂碼 前端學資料庫之子查詢 前端學資料庫之 ...
  • × 目錄 [1]存儲過程 [2]存儲引擎 前面的話 我們經常會對數據表進行插入、刪除、更新及查找的工作,即我們常說的CURD。其實,當我們輸入命令時,mysql引擎會按照下圖進行操作 如果我們省略了分析和編譯的環節,那麼執行效率將大大提高。這就需要下麵介紹的存儲來實現 存儲過程 存儲過程是SQL語句 ...
  • 當我們在linux上, 使用yum 安裝包時,報錯如下: 這時我們需要安裝EPEL EPEL,即Extra Packages for Enterprise Linux,這個軟體倉庫里有很多非常常用的軟體,而且是專門針對RHEL設計的,對RHEL標準yum源是一個很好的補充,完全免費使用,由Fedor ...
  • 問題 如何控制 OData 路由 解決方案 為了註冊路由,可以使用 HttpConfigurationExtension 類中 MapODataServiceRoute 的擴展方法。對於單一路由這樣做足以,其餘的處理由實體數據模型來處理。 從 ASP.NET Web API 2.2 開始支持 ODa ...
  • 我們看看各個web框架的性能,以TPS為指標排序(每秒返回的response多的在前面,性能越好),所有測試都在Linux中運行。在對比中,我們看到ASP.NET Core取得優異的成績,具體6個回合的對比請移步TechEmpower查看 ...
  • 怎樣使用 async & await 一步步將同步代碼轉換為非同步編程 【博主】反骨仔 【出處】http://www.cnblogs.com/liqingwen/p/6079707.html 序 上次,博主通過《利用 async & await 的非同步編程》一文介紹了 async & await 的基 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...