1.C#跨平臺物聯網通信框架ServerSuperIO(SSIO)介紹html
《連載 | 物聯網框架ServerSuperIO教程》1.4種通信模式機制。git
《連載 | 物聯網框架ServerSuperIO教程》2.服務實例的配置參數說明github
《連載 | 物聯網框架ServerSuperIO教程》- 3.設備驅動介紹網絡
《連載 | 物聯網框架ServerSuperIO教程》-4.如開發一套設備驅動,同時支持串口和網絡通信。併發
《連載 | 物聯網框架ServerSuperIO教程》- 5.輪詢通信模式開發及注意事項。app
《連載 | 物聯網框架ServerSuperIO教程》- 6.併發通信模式開發及注意事項框架
《連載 | 物聯網框架ServerSuperIO教程》- 7.自控通信模式開發及注意事項ide
《連載 | 物聯網框架ServerSuperIO教程》- 8.單例通信模式開發及注意事項函數
《連載 | 物聯網框架ServerSuperIO教程》- 9. 協議過濾器,解決一包多發、粘包、冗餘數據post
《連載 | 物聯網框架ServerSuperIO教程》- 10.持續傳輸大塊數據流的兩種方式(如:文件)
目 錄
11.實現設備(驅動)與設備(驅動)級聯控制... 2
11.1 概述... 2
11.2 設備連接器... 2
11.3 場景假設... 3
11.4 設備驅動開發及注意事項... 3
11.5 宿主程序服務實例配置注意事項... 5
11.6 運行效果... 6
物聯網建設中數據採集是基礎,進行控制是目的,這是兩個根本要素。在採集設備數據的時候,若是該設備的實時數據出現異常,那麼是否存在其餘設備要進行聯動?也就是說一個設備出現異常以後,要對其餘某個設備進行聯動控制,以達到避免出現更大危險的狀況。
那麼不只要對某個設備進行聯動控制,還要對控制的結果進行反饋給出現異常的設備。造成異常、聯動、控制、反饋的閉環,以達到監測與控制共同做用的目的。
IRunDevice設備驅動接口繼承了IDeviceConnector設備連接器接口,以便使設備驅動與設備驅動之間能夠雙向交互,實現數據傳遞與命令控制的目的。接口的定義以下:
public interface IDeviceConnector { /// <summary> /// 支行設備鏈接器 /// </summary> /// <param name="fromDevice">信息傳遞的發送端</param> /// <param name="toDevice">信息傳遞的目的端,以及包含的數據信息</param> /// <returns></returns> object RunDeviceConnector(IFromDevice fromDevice, IDeviceToDevice toDevice); /// <summary> /// 設備鏈接器回調函數,在這裏寫回調的處理結果 /// </summary> /// <param name="obj"></param> void DeviceConnectorCallback(object obj); /// <summary> /// 若是執行方出現異常,則返回給這個函數結果 /// </summary> /// <param name="ex"></param> void DeviceConnectorCallbackError(Exception ex); /// <summary> /// 鏈接器事件,發起端 /// </summary> event DeviceConnectorHandler DeviceConnector; /// <summary> /// 確發事件接口 /// </summary> /// <param name="fromDevice"></param> /// <param name="toDevice"></param> void OnDeviceConnector(IFromDevice fromDevice, IDeviceToDevice toDevice); }
經過這個接口定義,能夠得知經過OnDeviceConnector事件觸發信息傳遞的起始端,會把信息傳遞給接收信息端設備驅動的RunDeviceConnector接口函數,執行完RunDeviceConnector函數後,會把結果數據返回給發送端設備驅動的DeviceConnectorCallback接口函數,若是接收數據端設備驅動執行RunDeviceConnector過程當中出現異常,則會調用發起端設備驅動的DeviceConnectorCallbackError接口函數,至此整個流程結束。
0號設備驅動的名稱叫金三,1號設備驅動的名稱叫普京。金三得知韓國樸大媽事件後,問普京:大哥,樸大媽爲何還不下課?。普京回答:你不以爲這纔是真正的韓劇嗎?傻小子。金三說:奧黑也真夠坑爹的!完成整個流程的信息傳遞。
public override void Communicate(ServerSuperIO.Communicate.IRequestInfo info) { byte[] cmds = this.Protocol.GetCommand(info.Data); CommandArray cr = (CommandArray)cmds[0]; dynamic obj = this.Protocol.DriverAnalysis<byte[]>(cr.ToString(), info.Data, info.BigData); if (obj != null) { if (cr == CommandArray.RealTimeData) { _deviceDyn.Dyn = (Dyn)obj; OnDeviceRuningLog("通信正常"); Console.WriteLine(">>>>模擬控制命令開始"); this.OnDeviceConnector(new FromDevice(this.DeviceParameter.DeviceID,this.DeviceParameter.DeviceCode,this.DeviceParameter.DeviceAddr,this.DeviceParameter.DeviceName),new DeviceToDevice("1",this.DeviceParameter.DeviceName+"問:大哥,樸大媽爲何還不下課?",null,null) ); } } }
2.普京接收到信息後,進行信息解析後,並返回他的意思(結果)。代碼以下:
public override object RunDeviceConnector(IFromDevice fromDevice, IDeviceToDevice toDevice) { Console.WriteLine(toDevice.Text);//輸出其餘設備傳來的數據。 return this.DeviceParameter.DeviceName + "答:你不以爲這纔是真正的韓劇嗎?傻小子"; }
3.金三接收到普京的返回信息後,把矛頭指向了奧黑。代碼以下:
public override void DeviceConnectorCallback(object obj) { Console.WriteLine(obj.ToString());//輸出返回結果 Console.WriteLine(this.DeviceParameter.DeviceName+ "說:奧黑也真夠坑爹的!"); Console.WriteLine(">>>>模擬控制命令結束"); }
注:這裏並無用到DeviceConnectorCallbackError執行異常返回接口函數。
這是用自控模式實現的,設備驅動並無主動發送數據。代碼以下:
static void Main(string[] args) { DeviceSelfDriver dev1 = new DeviceSelfDriver(); dev1.DeviceParameter.DeviceName = "金三"; dev1.DeviceParameter.DeviceAddr = 0; dev1.DeviceParameter.DeviceID = "0"; dev1.DeviceDynamic.DeviceID = "0"; dev1.DeviceParameter.DeviceCode = "0"; dev1.DeviceParameter.COM.Port = 1; dev1.DeviceParameter.COM.Baud = 9600; dev1.DeviceParameter.NET.RemoteIP = "127.0.0.1"; dev1.DeviceParameter.NET.RemotePort = 9600; dev1.CommunicateType = CommunicateType.NET; dev1.Initialize("0"); DeviceSelfDriver dev2 = new DeviceSelfDriver(); dev2.DeviceParameter.DeviceName = "普京"; dev2.DeviceParameter.DeviceAddr = 1; dev2.DeviceParameter.DeviceID = "1"; dev2.DeviceDynamic.DeviceID = "1"; dev2.DeviceParameter.DeviceCode = "1"; dev2.DeviceParameter.NET.RemoteIP = "127.0.0.1"; dev2.DeviceParameter.NET.RemotePort = 9600; dev2.CommunicateType = CommunicateType.NET; dev2.Initialize("1"); IServer server = new ServerManager().CreateServer(new ServerConfig() { ServerName = "服務1", ComReadTimeout = 1000, ComWriteTimeout = 1000, NetReceiveTimeout = 1000, NetSendTimeout = 1000, ControlMode = ControlMode.Self, SocketMode = SocketMode.Tcp, StartReceiveDataFliter = true, ClearSocketSession = false, StartCheckPackageLength = true, CheckSameSocketSession = false, DeliveryMode = DeliveryMode.DeviceCode, }); server.AddDeviceCompleted += server_AddDeviceCompleted; server.DeleteDeviceCompleted+=server_DeleteDeviceCompleted; server.Start(); server.AddDevice(dev1); server.AddDevice(dev2); while ("exit" == Console.ReadLine()) { server.Stop(); } }
1.圖片
2.視頻
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
注:最新原代碼,尚未放出,教程寫完了,同步更新。