目 錄
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ù),效果如下:
- 圖片
- 視頻