ServerSuperIO之前所作的工做逐步爲造成迴路控制或級聯控制打下基礎,例如:服務鏈接器和設備驅動鏈接器的開發與應用。總之,是經過多種形式下發命令控制設備(驅動)或傳感器,雲端控制站點或監測點的傳感器、App或者其餘終端控制傳感器、根據傳感器的採集數據控制另外一個傳感器等。html
下面介紹雲端、App或者其餘終端如何控制傳感器設備(傳感器控制傳感器相似,請參見:12.服務接口的開發,以及與雲端雙向交互)。根據通信協議,結構化方案、不須要太多代碼便可完成相應的功能。效果以下圖:mysql
控制端發起控制命令,用ServerSuperIO服務接口開發一個簡單的代理服務,經過服務鏈接器IServiceConnector接口與設備驅動進行交互,設備驅動接收到控制命令後下發給設備或傳感器,等待控制返回的確認消息,再原路返回給控制端。git
有人問爲何不使用MQTT協議,那如何兼容不一樣設備和傳感器的協議?以於中國現實狀況,顯然還不能達到統一標準的水平,在經濟很差的狀況下,企業也不可能投資替換掉原來的硬件設備。也不符合ServerSuperIO設計的原則,就是要搞協議無關性,任何標準或非標準的協議均可以集成進來。若是想過一條河,把橋修好、把索道搭好、把船擺好…具體怎麼過河由你本身決定。github
有人問ServerSuperIO都集成了什麼協議?上面已經給出了答案,另外我想說的是沒有任何一個框架能夠包治百病。從相反的角度來考慮,若是像組態同樣把任何協議都加進來,企業又想拿出來多少的價值來對等交換呢,因此協議驅動仍是交給你們來本身寫吧。sql
咱們演示的協議以下圖:數據庫
控制端包括不少種:雲端向下級發送控制命令、App或Pc機軟件鏈接服務發送控制命令等等。發送控制命令以下圖:緩存
代理服務是經過ServerSuperIO的IService接口實現,在繼承類中使用ServerSuperIO框架自己的單例模式開發代理服務,代碼以下:網絡
public override void StartService() { string devId = "ControlDeviceService"; Driver dev = new Driver(); dev.ReceiveRequestInfos += Dev_ReceiveRequestInfos; dev.DeviceParameter.DeviceName = "控制設備驅動器"; dev.DeviceParameter.DeviceAddr = 0; dev.DeviceParameter.DeviceID = devId; dev.DeviceParameter.DeviceCode = ""; dev.DeviceDynamic.DeviceID = devId; dev.DeviceParameter.NET.RemoteIP = "127.0.0.1"; dev.DeviceParameter.NET.RemotePort = 9600; dev.DeviceParameter.NET.ControllerGroup = "LocalGroup"; dev.CommunicateType = CommunicateType.NET; dev.Initialize(devId); IServer server = new ServerManager().CreateServer(new ServerConfig() { ServerName = "控制設備服務", ListenPort=6670, ComReadTimeout = 1000, ComWriteTimeout = 1000, NetReceiveTimeout = 1000, NetSendTimeout = 1000, ControlMode = ControlMode.Singleton, SocketMode = SocketMode.Tcp, StartReceiveDataFliter = false, ClearSocketSession = false, StartCheckPackageLength = false, CheckSameSocketSession = false, }); server.AddDeviceCompleted += server_AddDeviceCompleted; server.DeleteDeviceCompleted += server_DeleteDeviceCompleted; server.SocketConnected += server_SocketConnected; server.SocketClosed += server_SocketClosed; server.Start(); server.AddDevice(dev); }
dev.ReceiveRequestInfos事件是控制驅動繼承ServerSuperIO框架中RunDevice驅動類擴展的事件接口,ServerSuperIO單例模式接收到數據信息,若是符合協議標準會把數據信息反饋給驅動程序的Communicate接口,ReceiveRequestInfos事件把數據信息傳遞給代理服務訂閱該事件的Dev_ReceiveRequestInfos函數。代碼以下圖:併發
代理服務中的Dev_ReceiveRequestInfos函數,經過服務鏈接器接口IServiceConnector,根據DeviceCode(addr)把信息傳遞給相應的設備驅動。代碼以下圖:oracle
代理服務經過ServiceConnectorCallback和ServiceConnectorCallbackError函數接口接收設備驅動反饋的結果信息,若是中間出現異常會調用ServiceConnectorCallbackError,若是正常會調用ServiceConnectorCallback函數,ServiceConnectorCallback函數接口根據記錄的命令與IO通道的對應關係,再把結果發送給控制端。ServiceConnectorCallback代碼以下圖:
在這裏邊有一個注意的地方,就是設備驅動在規定的時間內沒有反饋控制命令的確認信息,也就是傳感器沒有反饋相應的信息。這種狀況要增長一個定時檢測服務,若是超時沒有反饋信息,發送給控制端相應的消息。代碼以下圖:
這個設備驅動與傳感器相對應,之間相互過行數據交互。設備驅動的RunServiceConnector接口負責接收代理服務Dev_ReceiveRequestInfos(OnServiceConnector)函數傳遞過來的命令信息。代碼以下圖:
有兩點說明:1.接收到命令數據後能夠經過OnSendData函數當即下發數據信息,以設置的IP查找相應的IO通道,適用於自控模式。2. 接收到命令數據後放到this.Protocol.SendCache協議緩存中,等待下發命令,適用於輪詢、併發模式。
針對於返回的結果對象ServiceConnectorCallbackResult的isAsyn參數,若是爲true,說明經過AsyncServiceConnectorCallback callback返回結果信息,也就是說要等待傳感器返回確認信息,而且設備驅動接收後再反饋到代理服務;若是爲false,說明會當即反饋到代理服務,適用於傳遞數據信息而無論與傳感器是否交互成功。
能夠在這個函數中把callback參數進行臨時保存,等待傳感器返回確認信息後在Communicate函數中觸發異步回調到代理服務。代碼以下圖:
打開兩個TestDevice程序,一個做爲設備傳感器,一個做爲控制端,DeviceCode要以應;TestDeviceDriver是設備驅動,在服務實例中加載,我用的是自控模式,使用TestSelfMain項目;ControlDeviceService是代理服務,在TestSelfMain中加載。具體參見工程代碼:http://pan.baidu.com/s/1c1ZZLOO。
備註:未來咱們的大數據平臺,也能夠通這種模式下發控制命令到站點。
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
下載地址:http://www.bmpj.net/thread-14-1-1.html
1.C#跨平臺物聯網通信框架ServerSuperIO(SSIO)介紹
《連載 | 物聯網框架ServerSuperIO教程》1.4種通信模式機制。
《連載 | 物聯網框架ServerSuperIO教程》2.服務實例的配置參數說明
《連載 | 物聯網框架ServerSuperIO教程》- 3.設備驅動介紹
《連載 | 物聯網框架ServerSuperIO教程》-4.如開發一套設備驅動,同時支持串口和網絡通信。
《連載 | 物聯網框架ServerSuperIO教程》- 5.輪詢通信模式開發及注意事項。
《連載 | 物聯網框架ServerSuperIO教程》- 6.併發通信模式開發及注意事項
《連載 | 物聯網框架ServerSuperIO教程》- 7.自控通信模式開發及注意事項
《連載 | 物聯網框架ServerSuperIO教程》- 8.單例通信模式開發及注意事項
《連載 | 物聯網框架ServerSuperIO教程》- 9. 協議過濾器,解決一包多發、粘包、冗餘數據
《連載 | 物聯網框架ServerSuperIO教程》- 10.持續傳輸大塊數據流的兩種方式(如:文件)
《連載 | 物聯網框架ServerSuperIO教程》- 11.實現設備(驅動)與設備(驅動)交互和級聯控制。
《連載 | 物聯網框架ServerSuperIO教程》- 12.服務接口的開發,以及與雲端雙向交互
《連載 | 物聯網框架ServerSuperIO教程》- 13.自定義視圖顯示接口開發,知足不一樣的顯示需求
《連載 | 物聯網框架ServerSuperIO教程》- 14.配製工具介紹,以及設備驅動、視圖驅動、服務實例的掛載
《連載 | 物聯網框架ServerSuperIO教程》- 15.數據持久化接口的使用
《連載 | 物聯網框架ServerSuperIO教程》- 16.OPC Server的使用步驟
《連載 | 物聯網框架ServerSuperIO教程》- 17.支持實時數據庫,高併發保存測點數據
《連載 | 物聯網框架ServerSuperIO教程》- 18.集成OPC Client,及使用步驟
《連載 | 物聯網框架ServerSuperIO教程》-19.設備驅動和OPC Client支持mysql、oracle、sqlite、sqlserver的持久化