《連載 | 物聯網框架ServerSuperIO教程》- 12.服務接口的開發,以及與雲端雙向交互

1.C#跨平臺物聯網通信框架ServerSuperIO(SSIO)介紹html

《連載 | 物聯網框架ServerSuperIO教程》1.4種通信模式機制。git

《連載 | 物聯網框架ServerSuperIO教程》2.服務實例的配置參數說明github

《連載 | 物聯網框架ServerSuperIO教程》- 3.設備驅動介紹緩存

《連載 | 物聯網框架ServerSuperIO教程》-4.如開發一套設備驅動,同時支持串口和網絡通信。網絡

《連載 | 物聯網框架ServerSuperIO教程》- 5.輪詢通信模式開發及注意事項。併發

《連載 | 物聯網框架ServerSuperIO教程》- 6.併發通信模式開發及注意事項app

《連載 | 物聯網框架ServerSuperIO教程》- 7.自控通信模式開發及注意事項框架

《連載 | 物聯網框架ServerSuperIO教程》- 8.單例通信模式開發及注意事項socket

《連載 | 物聯網框架ServerSuperIO教程》- 9. 協議過濾器,解決一包多發、粘包、冗餘數據tcp

《連載 | 物聯網框架ServerSuperIO教程》- 10.持續傳輸大塊數據流的兩種方式(如:文件)

《連載 | 物聯網框架ServerSuperIO教程》- 11.實現設備(驅動)與設備(驅動)交互和級聯控制。


目       錄

12.服務接口的開發,以及與雲端雙向交互... 2

12.1        概述... 2

12.2        設備連接器... 2

12.3        服務連接器... 3

12.4        場景假設... 3

12.5        設備驅動開發及注意事項... 4

12.6        服務實例開發及注意事項... 4

12.7        宿主程序服務實例配置注意事項... 8

12.8        運行效果... 9

12.服務接口的開發,以及與雲端雙向交互     

12.1     概述

     服務接口IService是除設備驅動接口IRunDevice外的特殊應用場景,例如:短信報警、LED輸出、模擬量的採集、OPC服務端/客戶端、數據的級聯轉發、以及其餘的特殊應用。是基於設備驅動接口IRunDevice的有力擴展,讓框架的功能更豐富和強大。

     這篇文章主要介紹數據的轉發和控制服務,其餘的服務開發與此相似。若是基於ServerSuperIO服務接口的開發具有數據轉發和控制能力,那麼在物聯網建設中將具有數據的無限級聯傳遞與控制能力,使用一套框架造成一套解決方案。示意圖以下:

 

12.2     設備連接器

      IRunDevice設備驅動接口繼承了服務的IServiceConnectorDevice接口,設備驅動會實現RunServiceConnector接口函數,表明能夠接收或運行來自服務實例傳遞過來的數據信息。代碼定義以下:

public interface IServiceConnectorDevice
{
        /// <summary>
        /// 支行設備鏈接器
        /// </summary>
        /// <param name="fromService"></param>
        /// <param name="toDevice"></param>
        /// <returns></returns>
        object RunServiceConnector(IFromService fromService, IServiceToDevice toDevice);
}

12.3     服務連接器

     IService接口繼承自IServiceConnector服務連接器,表明服務具有兩大職能:一、向設備驅動發送命令或信息。二、接收設備驅動處理命令或信息的結果。代碼以下:

public interface IServiceConnector
    {
        /// <summary>
        /// 設備鏈接器回調函數,在這裏寫回調的處理結果
        /// </summary>
        /// <param name="obj"></param>
        void ServiceConnectorCallback(object obj);

        /// <summary>
        /// 若是執行方出現異常,則返回給這個函數結果
        /// </summary>
        /// <param name="ex"></param>
        void ServiceConnectorCallbackError(Exception ex);

        /// <summary>
        /// 鏈接器事件,發起端
        /// </summary>
        event ServiceConnectorHandler ServiceConnector;

        /// <summary>
        /// 確發事件接口
        /// </summary>
        /// <param name="fromService"></param>
        /// <param name="toDevice"></param>
        void OnServiceConnector(IFromService fromService, IServiceToDevice toDevice);
}

12.4     場景假設

     設備驅動實時採集傳感器的數據信息,而後經過OnDeviceObjectChanged事件接口把數據信息傳遞給服務實例UpdateDevice接口函數,而後進行數據的緩存。開啓服務線程,鏈接雲端服務而且定時上傳傳感器的數據信息。雲端服務下發控制指令command:control:1(注:命令控制1號編碼設備),而後設備驅動把命令下發給傳感器,最終把結果返回給服務實例。

12.5     設備驅動開發及注意事項

1.給服務實例傳遞數據信息,經過OnDeviceObjectChanged事件。代碼以下:

List<string> list = new List<string>();
list.Add(_devicePara.DeviceCode);
list.Add(_devicePara.DeviceName);
list.Add(_deviceDyn.Dyn.Flow.ToString());
list.Add(_deviceDyn.Dyn.Signal.ToString());
OnDeviceObjectChanged(list.ToArray());

2.接收服務實例傳遞的命令和信息。代碼以下:

 public override object RunServiceConnector(IFromService fromService, IServiceToDevice toDevice)
        {
            Console.WriteLine(this.DeviceParameter.DeviceName+",接收到雲端指令:"+toDevice.Text);
            return this.DeviceParameter.DeviceName+",執行完成";
        }

12.6     服務實例開發及注意事項

     服務實例主要的職能是:緩存數據、鏈接雲端服務並定時發送數據、接收雲端命令信息並傳遞給設備驅動、接收驅動執行命令信息的結果。

  1. 緩存數據,代碼以下:
public override void UpdateDevice(string devCode, object obj)
        {
            lock (_SyncObject)
            {
                if (obj != null)
                {
                    if (obj is string[])
                    {
                        string[] arr = (string[])obj;
                        //OnServiceLog(String.Format("服務:{0} 接收到'{1}'的數據>>{2},{3}", ServiceName, arr[1], arr[2], arr[3]));
                        if (arr.Length >= 2)
                        {
                            if (this._Cache.ContainsKey(devCode)) //判斷ID
                            {
                                this._Cache[devCode] = arr;
                            }
                            else
                            {
                                this._Cache.Add(devCode, arr);
                            }
                        }
                    }
                }
            }
        }

     2.鏈接雲端服務並定時發送數據,代碼以下:

private void Target_Service()
        {
            while (_IsRun)
            {
                try
                {
                    if (_tcpClient != null)
                    {
                        lock (_SyncObject)
                        {
                            string content = String.Empty;
                            foreach (KeyValuePair<string, string[]> kv in _Cache)
                            {
                                content += String.Join(",", kv.Value) + Environment.NewLine;
                            }

                            if (!String.IsNullOrEmpty(content))
                            {
                                byte[] data = System.Text.Encoding.ASCII.GetBytes(content);
                                this.OnSend(data);
                            }
                        }
                    }
                    else
                    {
                        this.ConnectServer();
                    }
                }
                catch (SocketException ex)
                {
                    this.CloseSocket();
                    OnServiceLog(ex.Message);
                }
                catch (Exception ex)
                {
                    OnServiceLog(ex.Message);
                }
                finally
                {
                    System.Threading.Thread.Sleep(2000);
                }
            }
        }

     3.接收雲端命令信息並傳遞給設備驅動

private void ReceiveCallback(IAsyncResult ar)
        {
            TcpClient socket = (TcpClient)ar.AsyncState;
            try
            {
                if (socket != null)
                {
                    int read = socket.Client.EndReceive(ar);
                    if (read > 0)
                    {
                        //處理數據.....................通知設備
                        string text = System.Text.Encoding.ASCII.GetString(_Buffer, 0, read);
                        OnServiceConnector(new FromService(this.ServiceName,this.ServiceKey),new ServiceToDevice("1",text,null,null) );
                        OnReceive();
                    }
                    else
                    {
                        this.CloseSocket();
                    }
                }
            }
            catch (SocketException ex)
            {
                this.CloseSocket();
                this.OnServiceLog(ex.Message);
            }
            catch (Exception ex)
            {
                this.OnServiceLog(ex.Message);
            }
        }

      4.接收驅動執行命令信息的結果

public override void ServiceConnectorCallback(object obj)
        {
            OnServiceLog(obj.ToString());
            OnServiceLog("設備已經處理完成指令");
        }

12.7     宿主程序服務實例配置注意事項

static void Main(string[] args)
        {
            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(dev2);

            TestService.Service service=new TestService.Service();
            service.IsAutoStart = true;
            server.AddService(service);
 
            while ("exit" == Console.ReadLine())
            {
                server.Stop();
            }
        }

12.8     運行效果

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 

相關文章
相關標籤/搜索