《连载 | 物联网框架ServerSuperIO教程》- 12.服务接口的开发,以及与云端双向交互

简介: 1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 《连载 | 物联网框架ServerSuperIO教程》1.4种通讯模式机制。 《连载 | 物联网框架ServerSuperIO教程》2.服务实例的配置参数说明 《连载 | 物联网框架ServerSuperIO教程》- 3.设备驱动介绍 《连载 | 物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯。

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.实现设备(驱动)与设备(驱动)交互和级联控制。


目       录

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服务链接器,代表服务具备两大职能:1、向设备驱动发送命令或信息。2、接收设备驱动处理命令或信息的结果。代码如下:

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 

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
6月前
|
消息中间件 网络协议 物联网
MQTT常见问题之物联网设备端申请动态注册时MQTT服务不可用如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
3月前
|
物联网 区块链 vr&ar
未来已来:探索区块链、物联网与虚拟现实技术的融合与应用安卓与iOS开发中的跨平台框架选择
【8月更文挑战第30天】在科技的巨轮下,新技术不断涌现,引领着社会进步。本文将聚焦于当前最前沿的技术——区块链、物联网和虚拟现实,探讨它们各自的发展趋势及其在未来可能的应用场景。我们将从这些技术的基本定义出发,逐步深入到它们的相互作用和集成应用,最后展望它们如何共同塑造一个全新的数字生态系统。
|
28天前
|
安全 物联网 数据挖掘
选择物联网卡如何筛选服务提供商呢
在选择物联网卡服务提供商时,您需要考虑多个因素以确保所选服务商能够满足您的业务需求,同时提供稳定可靠的服务。以下是一些关键步骤和建议,帮助您筛选物联网卡服务提供商:
|
2月前
|
物联网 C# C语言
物联网开发中C、C++和C#哪个更好用
在物联网(IoT)开发中,C、C++和C#各有优缺点,适用场景不同。C语言性能高、资源占用低,适合内存和计算能力有限的嵌入式系统,但开发复杂度高,易出错。C++支持面向对象编程,性能优秀,适用于复杂应用,但学习曲线陡峭,编译时间长。C#易于学习,与.NET框架结合紧密,适合快速开发Windows应用,但性能略低,平台支持有限。选择语言需根据具体项目需求、复杂性和团队技术栈综合考虑。
|
2月前
|
存储 传感器 物联网
结合物联网开发探讨C语言的变量
在物联网(IoT)开发中,C语言的变量起着至关重要的作用。由于物联网设备资源有限,C语言的高效性和对硬件的直接控制使其成为开发嵌入式系统的首选。
|
4月前
|
安全 物联网 区块链
云端防御:云计算时代的网络安全策略与实战《未来已来:探索区块链、物联网与虚拟现实的融合革新》
【7月更文挑战第31天】在数字化转型的浪潮中,云计算已成为推动企业增长的核心动力。然而,随着数据和应用逐渐迁移到云端,网络安全问题也愈发严峻。本文将探讨云计算环境中的安全挑战,并提出相应的防御策略。通过分析云服务模型、安全威胁及信息安全技术的应用,结合代码示例,本文旨在为读者提供一套实用的云端安全防护方案。
48 1
|
4月前
|
机器学习/深度学习 传感器 边缘计算
云端物联:智能物联网平台引领数字化转型之路
云上智能物联网平台正在成为推动数字化转型的重要力量。它不仅为企业带来了新的商业模式和发展机会,也为消费者提供了更加便捷和个性化的服务体验。
|
6月前
|
监控 物联网
LabVIEW开发基于物联网的多功能功率分析仪
LabVIEW开发基于物联网的多功能功率分析仪
48 2
|
6月前
|
传感器 机器学习/深度学习 算法
LabVIEW开发工业物联网状态监测
LabVIEW开发工业物联网状态监测
69 2
|
6月前
|
传感器 存储 物联网
【C 言专栏】基于 C 语言的物联网开发
【5月更文挑战第6天】C 语言在物联网发展中扮演关键角色,适用于开发嵌入式系统、通信协议及云平台后端服务。其高效、灵活、可移植的特性适应资源有限的环境,确保设备兼容性。尽管开发挑战较大,如代码可读性,但借助辅助工具可改善。随着物联网技术进步,C 语言将持续发挥重要作用,塑造智能未来。
130 0
【C 言专栏】基于 C 语言的物联网开发

相关产品

  • 物联网平台