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

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

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

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

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

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

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

 

目       錄併發

6. 併發通信模式開發及注意事項... 2app

6.1           概述... 2框架

6.2           通信機制說明... 2異步

6.3           設備驅動開發注意事項... 3

6.3.1    實時發送數據... 3

6.3.2    優先發送其餘數據... 3

6.3.3    如何選擇IO通道發送數據... 4

6.3.4    如何以DeviceCode分配數據... 4

6.4           宿主程序服務實例配置注意事項... 5

6.5           併發模式運行效果... 6

 

6. 併發通信模式開發及注意事項 

6.1    概述

     併發通信模式只能用於網絡通信設備,主要是增強通信的併發能力,集中發送請求數據,異步接收返回數據。集中發送請求數據的間隔時間能夠設置;異步接收返回數據涉及到如何分配數據到相應的設備驅動的問題,主要是經過兩種方式:IP地址的方式和設備Code的方式,前者適用於設備終端是固定IP地址的狀況,後者適用於設備終端是動態IP的狀況,例如:DTU、GPRS、3G/4G等無線通信方式。

     併發通信模式本質上仍是呼叫應答的通信方式,與輪詢通信模式相似,可是比輪詢通信模式的採集數據更高效。

6.2    通信機制說明

     網絡通信的狀況下,輪詢模式顯然效率比較低,那麼能夠採用併發模式。併發通信模式是集中發送給全部設備請求指令,框架是採用循環同步方式發送請求命令給每一個IO通道對應的設備,固然也能夠採用並行異步方式集中發送請求命令。硬件設備接收到指令後進行校驗,校驗成功後返回對應指令的數據,通信平臺異步監聽到數據信息後,進行接收操做,而後再進行數據的分發、處理等。

     那麼這裏就涉及到IO通道接收到的數據是異步接收的,如何才能和設備驅動匹配上(把數據分發到設備驅動上),這是能過DeviceCode和DeviceIP兩種方式來實現的。DeviceCode能夠是設備地址或是設備編碼,DeviceIP是預先設置好的參數,要求終端設備的IP地址是固定的。

     通信結構以下圖:

`

6.3    設備驅動開發注意事項

6.3.1    實時發送數據

     ServerSuperIO框架會輪詢調度全部設備,以呼叫應答的方式向設備發送請求實時數據命令,對於同一個設備的請求實時數據命令通常相對固定。在調度某一具體設備驅動的時候,會調用固定的調用IRunDevice驅動接口的GetConstantCommand函數,以得到請求實時數據的命令。代碼以下:

       public override byte[] GetConstantCommand()
        {
            byte[] data = this.Protocol.DriverPackage<String>("0", "61", null);
            string hexs = BinaryUtil.ByteToHex(data);
            OnDeviceRuningLog("發送>>"+hexs);
            return data;
        }

     this.Protocol.DriverPackage驅動調用61命令得到要發送的命令,並返回byte[]數組,ServerSuperIO得到數據後會自動經過IO接口下發命令數據。若是返回null類型,系統不進行下發操做。

6.3.2    優先發送其餘數據

對於一個設備不可能只有一個讀實時數據的命令,可能還存在其餘命令進行交互,例如:讀參數、實時校準等,這時就須要進行優先級調度發送數據信息。能夠經過兩種方式讓ServerSuperIO框架優先調度該設備驅動。

  1. 把命令增長髮送數據緩存中,框架從緩存中得到數據後會自動刪除,代碼以下:
this.Protocol.SendCache.Add("讀參數",readParaBytes);

      2.設置設備的優先級別屬性,代碼以下:

this.DevicePriority=DevicePriority.Priority;

6.3.3    如何選擇IO通道發送數據

     集中發送數據時,涉及到如何關聯設備驅動與IO通道,框架會以DeviceParameter.NET.RemoteIP設置的終端IP參數進行選擇IO通道發送數據。可是若是終端設備是動態IP地址的話,那麼RemoteIP參數也應該是變更的。這時就須要設置服務實例是以DeviceCode的方式分佈數據到設備驅動,終端設備先發送簡單的驗證數據,保證發送的DeviceCode與設備驅動的相對應,設備驅動接收到驗證數據後須要保存臨時的RemoteIP信息,這樣保證在發送數據的時候參數準確找到要請求數據的IO通道到終端設備。

     例以下面代碼:

public override void Communicate(ServerSuperIO.Communicate.IRequestInfo info)
{
            this.DeviceParameter.NET.RemoteIP = info.Channel.Key;
            this.DeviceParameter.Save(this.DeviceParameter);
            ……
}

6.3.4    如何以DeviceCode分配數據

     若是服務實例設置以DeliveryMode.DeviceCode模式分配數據,那麼就須要在通信協議接口裏實現過濾DeviceCode編碼的接口。

     例以下面的代碼:

  internal class DeviceProtocol:ProtocolDriver
    {
        public override string GetCode(byte[] data)
        {
            byte[] head = new byte[] {0x55, 0xaa};
            int codeIndex = data.Mark(0, data.Length, head);
            if (codeIndex == -1)
            {
                return String.Empty;
            }
            else
            {
                return data[codeIndex + head.Length].ToString();
            }
        }
}

6.4    宿主程序服務實例配置注意事項

     在宿主程序中建立服務實例的時候,須要把服務實例的配置參數設置爲併發通信模式,並啓動服務實例,把實例化的設備驅動增長到該服務實例中。代碼以下:

static void Main(string[] args)
{
            IServer server = new ServerFactory().CreateServer(new ServerConfig()
            {
                ServerName = "服務1",
                ComReadTimeout = 1000,
                ComWriteTimeout = 1000,
                NetReceiveTimeout = 1000,
                NetSendTimeout = 1000,
                ControlMode = ControlMode.Parallel,
                SocketMode = SocketMode.Tcp,
                StartReceiveDataFliter = false,
                ClearSocketSession = false,
                StartCheckPackageLength = false,
                CheckSameSocketSession = false,
                DeliveryMode = DeliveryMode.DeviceCode,
                ParallelInterval = 1000
            });
            server.AddDeviceCompleted += server_AddDeviceCompleted;
            server.DeleteDeviceCompleted += server_DeleteDeviceCompleted;
            server.Start();

            string devCode = "0";
            DeviceDriver dev1 = new DeviceDriver();
            dev1.DeviceParameter.DeviceName = "設備驅動"+ devCode.ToString();
            dev1.DeviceParameter.DeviceAddr = int.Parse(devCode);
            dev1.DeviceParameter.DeviceCode = devCode.ToString();
            dev1.DeviceParameter.DeviceID = devCode.ToString();
            dev1.DeviceDynamic.DeviceID = devCode.ToString();
            dev1.DeviceParameter.NET.RemoteIP = "127.0.0.1";
            dev1.DeviceParameter.NET.RemotePort = 9600;
            dev1.CommunicateType = CommunicateType.NET;
            dev1.Initialize(devCode.ToString());
            server.AddDevice(dev1);

            devCode = "1";
            DeviceDriver dev2 = new DeviceDriver();
            dev2.DeviceParameter.DeviceName = "設備驅動" + devCode.ToString();
            dev2.DeviceParameter.DeviceAddr = int.Parse(devCode);
            dev2.DeviceParameter.DeviceCode = devCode.ToString();
            dev2.DeviceParameter.DeviceID = devCode.ToString();
            dev2.DeviceDynamic.DeviceID = devCode.ToString();
            dev2.DeviceParameter.NET.RemoteIP = "192.168.1.102";
            dev2.DeviceParameter.NET.RemotePort = 9600;
            dev2.CommunicateType = CommunicateType.NET;
            dev2.Initialize(devCode.ToString());
            server.AddDevice(dev2);

            while ("exit" == Console.ReadLine())
            {
                server.Stop();
            }
}

    ControlMode = ControlMode. Parallel代碼是設置服務實例調度設備爲併發控制模式;以DeliveryMode = DeliveryMode.DeviceCode方式進行數據分發,固然我如今模擬的是因定的終端IP。

6.5    併發模式運行效果

1.圖片

 

2.視頻

 


 

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 

相關文章
相關標籤/搜索