目 錄
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.[連載]《C#通訊(串口和網(wǎng)絡(luò))框架的設(shè)計(jì)與實(shí)現(xiàn)》
2.[開源]C#跨平臺(tái)物聯(lián)網(wǎng)通訊框架ServerSuperIO(SSIO)介紹
2.應(yīng)用SuperIO(SIO)和開源跨平臺(tái)物聯(lián)網(wǎng)框架ServerSuperIO(SSIO)構(gòu)建系統(tǒng)的整體方案
5.ServerSuperIO開源地址:https://github.com/wxzz/ServerSuperIO