目       錄

8.單例通訊模式開發(fā)及注意事項(xiàng)... 2

8.1           概述... 2

8.2           通訊機(jī)制說明... 2

8.3           設(shè)備驅(qū)動(dòng)開發(fā)注意事項(xiàng)... 2

8.4           宿主程序服務(wù)實(shí)例配置注意事項(xiàng)... 3

8.5           單例模式運(yùn)行效果... 4

8.單例通訊模式開發(fā)及注意事項(xiàng)

8.1    概述

    單例通訊模式只適用于網(wǎng)絡(luò)通訊,并且只能增加一個(gè)“設(shè)備驅(qū)動(dòng)”,這里“設(shè)備驅(qū)動(dòng)”是邏輯概念,代表了所有設(shè)備或傳感器,也就是說所有接到的數(shù)據(jù)全部分發(fā)給這個(gè)“設(shè)備驅(qū)動(dòng)”。

8.2    通訊機(jī)制說明

    只有網(wǎng)絡(luò)通訊時(shí)可以使用這種控制模式。在一個(gè)服務(wù)實(shí)例內(nèi)只能有一個(gè)設(shè)備驅(qū)動(dòng),相當(dāng)于一個(gè)設(shè)備驅(qū)動(dòng)對(duì)應(yīng)著N多個(gè)硬件設(shè)備終端。更適合通訊的數(shù)據(jù)協(xié)議有固定的標(biāo)準(zhǔn),以命令關(guān)鍵字處理不同的數(shù)據(jù)。適用于高并發(fā)的硬件終端設(shè)備主動(dòng)上傳數(shù)據(jù),服務(wù)器端根據(jù)數(shù)據(jù)信息進(jìn)行處理和返回相應(yīng)的數(shù)據(jù)。

   通訊結(jié)構(gòu)如下圖:

 

 

8.3    設(shè)備驅(qū)動(dòng)開發(fā)注意事項(xiàng)

     單例模式的設(shè)備驅(qū)動(dòng)開發(fā)更簡(jiǎn)單,如果業(yè)務(wù)不復(fù)雜,那么只涉及到初始化參數(shù)、實(shí)時(shí)數(shù)據(jù)、協(xié)議,以及數(shù)據(jù)的處理邏輯,更高級(jí)的應(yīng)用會(huì)涉及到協(xié)議數(shù)據(jù)過濾(IReceiveFilter接口)、數(shù)據(jù)轉(zhuǎn)發(fā)(IService接口)、數(shù)據(jù)視圖展示(IGraphicsShow接口)等,將在后續(xù)的文章中逐一進(jìn)行介紹。

8.4    宿主程序服務(wù)實(shí)例配置注意事項(xiàng)

  sta

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
static void Main(string[] args)
{
            //55 AA 00 61 43 7A 00 00 43 B4 15 0D
            DeviceSingletonDriver dev1 = new DeviceSingletonDriver();
            dev1.DeviceParameter.DeviceName = "網(wǎng)絡(luò)設(shè)備";
            dev1.DeviceParameter.DeviceAddr = 0;
            dev1.DeviceParameter.DeviceID = "0";
            dev1.DeviceDynamic.DeviceID = "0";
            dev1.DeviceParameter.DeviceCode = "0";
            dev1.DeviceParameter.NET.RemoteIP = "127.0.0.1";
            dev1.DeviceParameter.NET.RemotePort = 9600;
            dev1.CommunicateType = CommunicateType.NET;
            dev1.Initialize("0");
 
            IServer server = new ServerManager().CreateServer(new ServerConfig()
            {
                ServerName = "單例服務(wù)",
                NetReceiveBufferSize = 1024,
                ControlMode = ControlMode.Singleton,
                MaxConnects = 4000
            });
 
            server.AddDeviceCompleted += server_AddDeviceCompleted;
            server.DeleteDeviceCompleted += server_DeleteDeviceCompleted;
            server.SocketConnected+=server_SocketConnected;
            server.SocketClosed+=server_SocketClosed;
            server.Start();
 
            server.AddDevice(dev1);
 
            while ("exit" == Console.ReadLine())
            {
                server.Stop();
            }
}

     ControlMode = ControlMode.Singleton設(shè)置成單位模式就可以了。

8.5    單例模式運(yùn)行效果

     在本機(jī)跑過10000萬個(gè)并發(fā)連接,用的jmeter,jmeter占用了1.4G左右的內(nèi)存、90%多的CPU,我也不知道為什么這么耗資源,筆記本勉強(qiáng)還能工作。

    現(xiàn)在模擬的是15個(gè)客戶端,100毫秒發(fā)送一次數(shù)據(jù),效果如下:

  1. 圖片

  1. 視頻