《連載 | 物聯網框架ServerSuperIO教程》- 11.實現設備(驅動)與設備(驅動)交互和級聯控制。註:設備驅動模擬金三與普京的對話

来源:http://www.cnblogs.com/lsjwq/archive/2016/11/22/6091355.html
-Advertisement-
Play Games

那麼不僅要對某個設備進行聯動控制,還要對控制的結果進行反饋給出現異常的設備。形成異常、聯動、控制、反饋的閉環,以達到監測與控制共同作用的目的。 ...


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.持續傳輸大塊數據流的兩種方式(如:文件)


 

目       錄

11.實現設備(驅動)與設備(驅動)級聯控制... 2

11.1         概述... 2

11.2         設備鏈接器... 2

11.3         場景假設... 3

11.4         設備驅動開發及註意事項... 3

11.5         宿主程式服務實例配置註意事項... 5

11.6         運行效果... 6

11.實現設備(驅動)與設備(驅動)級聯控制     

11.1     概述

    物聯網建設中數據採集是基礎,進行控制是目的,這是兩個根本要素。在採集設備數據的時候,如果該設備的實時數據出現異常,那麼是否存在其他設備要進行聯動?也就是說一個設備出現異常之後,要對其他某個設備進行聯動控制,以達到避免出現更大危險的情況。

    那麼不僅要對某個設備進行聯動控制,還要對控制的結果進行反饋給出現異常的設備。形成異常、聯動、控制、反饋的閉環,以達到監測與控制共同作用的目的。

11.2     設備鏈接器

      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介面函數,至此整個流程結束。

11.3     場景假設

    0號設備驅動的名稱叫金三,1號設備驅動的名稱叫普京。金三得知南韓樸大媽事件後,問普京:大哥,樸大媽為什麼還不下課?。普京回答:你不覺得這才是真正的韓劇嗎?傻小子。金三說:奧黑也真夠坑爹的!完成整個流程的信息傳遞。

11.4     設備驅動開發及註意事項

  1. 金三接到信息後,發起信息傳遞。觸發OnDeviceConnector事件,並把IDeviceToDevice介面deviceCode參數設置為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執行異常返回介面函數。

11.5     宿主程式服務實例配置註意事項

       這是用自控模式實現的,設備驅動並沒有主動發送數據。代碼如下:

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();
            }
        }

11.6     運行效果

      1.圖片

      2.視頻


1.[連載]《C#通訊(串口和網路)框架的設計與實現》

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 

註:最新原代碼,還沒有放出,教程寫完了,同步更新。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • web.config <configuration> <connectionStrings> <add name="constr" connectionString="server=.\sqlexpress;database=db2016;uid=sa;pwd=123;" /> <add name= ...
  • Public Class Profile Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As Stri ...
  • 現在流行的系統一般都採用依賴註入的實現方式,利用DI容器來直接獲取所用到的類/介面的實例。.net core也一樣採用DI的方式,提供了DI容器的介面IServiceCollection,並提供了基於該介面的預設實現ServiceCollection。 這樣我們就可以不再像以前一樣,需要引入第三方的 ...
  • 1.界面 <UserControl x:Class="HKDCMS.Client.Demo.UIViews.UIControls.AboutUsControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xml ...
  • In Windows 8 & 10, you have to right-click devenv.exe and select "Troubleshoot compatibility". 轉自 http://stackoverflow.com/questions/12257110/can-you- ...
  • 註冊的伺服器和中間件共同構成了ASP.NET Core用於處理請求的管道, 這樣一個管道是在我們啟動作為應用宿主的WebHost時構建出來的。要深刻瞭解這個管道是如何被構建出來的,我們就必須對WebHost和它的創建者WebHostBuilder這個重要的對象具有深刻的理解。[ ...
  • 利用 async & await 進行非同步 IO 操作 【博主】反骨仔 【出處】http://www.cnblogs.com/liqingwen/p/6082673.html 序 上次,博主通過《利用 async & await 的非同步編程》這篇點睛之作初步介紹了 async & await 的基本 ...
  • 問題 在 Web API 中使用 OData Function 和 Action。 解決方案 可以通過 ODataModelBuilder,使用 OData 構建 ASP.NET Web API, EntityCollectionConfiguration,EnityTypeConfiguratio ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...