葡京娱乐总站平台C#工业物联网与集成系统解决方案的艺途径(数据源、数据收集、数据上传与接收、ActiveMQ、Mongodb、WebApi、手机App)

1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍

目       录

《连载 |
物联网框架ServerSuperIO教程》1.4种植简报模式机制。

工业物联网与集成系统解决方案的技巧路线… 1

《连载 |
物联网框架ServerSuperIO教程》2.服务实例的布参数说明

前言… 1

《连载 | 物联网框架ServerSuperIO教程》-
3.配备驱动介绍

第一段           系统架构… 3

《连载 |
物联网框架ServerSuperIO教程》-4.如开发同模拟设备驱动,同时支持串口和网络通讯。

1.1           硬件构架图… 3

《连载 | 物联网框架ServerSuperIO教程》-
5.轮询通讯模式开发以及注意事项。

1.2           组件构架图… 4

《连载 | 物联网框架ServerSuperIO教程》-
6.连作通讯模式开发暨注意事项

其次节           技术选型与介绍… 5

《连载 | 物联网框架ServerSuperIO教程》-
7.收通讯模式开发与注意事项

2.1           开发环境… 5

《连载 | 物联网框架ServerSuperIO教程》-
8.单例通讯模式开发以及注意事项

2.2           数据源… 5

《连载 | 物联网框架ServerSuperIO教程》- 9.
商谈过滤器,解决一保证多作、粘包、冗余数据

2.3           数据采集… 5


2.4           数据上传服务… 6

 

2.5           消息中间件… 6

目       录

2.6           数据接收服务… 6

10.不止传输大块数据流的片种艺术(如:文件)… 2

2.7           数据存储… 6

10.1        概述… 2

2.8           数据接口… 7

10.2        大块数据流的简单种植传输方式… 2

2.9           Web业务系统… 7

10.2.1       协议数据包的点子… 2

2.10        手机移动终端App. 7

10.2.2       请求长度、确认的章程… 3

第三章           Demo的介绍… 8

10.3        实现持续传输大块数据… 4

3.1           目录介绍… 8

10.3.1       设计要发送数据协议… 4

3.2           Demo调试… 8

10.3.2       客户端代码实现… 4

 

10.3.3       ServerSuperIO框架的落实同注意事项… 7

前言

10.4        运行效果… 11

   
2000年以后,互联网在华之世上大肆的腾飞,在斯行业竞争着于之是加速度。我清楚的记《世界是同的》中起如此同样段落话:在非洲,羚羊每天朝苏醒时,它掌握好必须飞得较最抢之狮子还快,否则就是会见给吃少;狮子每天早醒来时,它了解好必须赶上走得极其缓慢的羚羊,否则就算会让饥饿死;不管你是狮子还是羚羊,当阳光升起时,你最好好起来跑!我们跑的当下10大多年之岁月里,互联网技术带来了各行各来的开拓进取,同时也囊括了各行各来。

10.不停传输大块数据流的个别栽方法(如:文件)

   
2006年常,工业行业还以大面积利用电话线进行多少传和长途帮助。网络技术日趋的于朝各行各业传导,工业行业也当迈入,局域网、光纤以极其网、WIFI\3G\4G等就下特别广泛了。互联网技术以推进制造业发展的又,也带了多店铺之与时俱进,升级技能、提供再好的劳务。

10.1     概述

   
以今天物联网的现状或是对物联网的回味,特别是工业物联网,必须怀有集成多种数据源的力量。数据源大体分点儿近似:硬件来及软件来。如下图:

葡京娱乐总站平台 1 

   
基于现实情况,作为物联网框架必须怀有各类数据的合并力量,以及各种以场景。以数量大小为条例,小到均等潮接到缓存承载能力范围外的数目,大到过一不良收受缓存承载能力范围之数码,只要网络允许,都发出或。以前的连载文章都是盖略的多寡包为基础介绍的,这篇稿子介绍大块数据流的传输方式。

   
我们于盘算,后互联网时代以何以发展?将是互联网及五行深度融合的长河,例如现在时常叫提及的物联网,我道其实质上是工业互联网,是造技能与互联网技术无缝衔接。不管是叫物联网或工业互联网,未来事物及物的交互、物和食指之相将无法避免。硬件与软件的同发展,更快之推了之过程,例如:智能芯片的进化、嵌入式操作系统的进化、智能传感器的腾飞相当。

10.2     大块数据流的星星种传输方式

   
大数额、分布式、云计算相当于也以以惊人的进度发展,有些人恐怕认为这些东西去我们生存还较长远。但是毫无是这般的,距离2006年只不过10年左右,现在底腾飞却是先前您无法想像的,而这种加速度之迈入方式,2年之前行或是你过去10年之上扬之和。不管这些技能现在是不是会生,但是这种动向是无法更改之。

10.2.1 协议数据包的法子

   
这种方法是规定好数据包商的开头和最终,把大块数据说明变成必然长度的小数据包,以商事头+小数目包+协议尾的结合措施分批次开展多少传。接收至每个批次的数目后,再拓展数量校验,拼装数据,还原出总体的数额。示意图如下:

葡京娱乐总站平台 2 

     这种方式在以下几独问题:

       (1)
每个包的数出现问题后,要开展多少补发。要统筹好商,完成补发机制。

      
(2)数据源是多种多样的,例如:压缩文件、序列化的文件、加密的文书等等,那么就在每个微数据包的数目有或会见与商谈头要协议尾一样,甚至和CRC校验一致的情形,从而导致数据无法正常校验和分析,这时进行补发数据,可能出现同类情况是大概率事件。

    
选择这种传输大块数据流的章程,要因实地的骨子里情形开展抉择,规避可能出现的高风险,提高型、产品完全的稳定性。

    
如果选择这种办法,那么根据前介绍的章,就好实现,网友可以自己下手实现。这篇稿子主要介绍下这种方法。

   
数据的流可以表现,现金的流动可以追加GDP。技术之上扬就是生产力的升级换代,将来组织结构以及涉及呢一定发生变动。不管是不是知道技术技能、是否清楚管理,思维方式不转得会给裁。

10.2.2 请求长度、确认之艺术

  
客户端先发送请求发送数据的授命,并且以指令标识本次要发送数据的长。如果服务端接收到该要命令后,根据判断请求数据长度是否以允许范围外,然后回来相同命令数据或者其它确认数据为客户端,标识是否允许发送该长度的数码信息。如果可以发送,那么客户端则频频发送数据流,服务端也进展连发吸纳阶段。示意图如下:

葡京娱乐总站平台 3 

    
针对这种多少传的不二法门,ServerSuperIO专门供了接口。下面进行详细的介绍。

   
下面对物联网与集成系统的解决方案的艺途径进行介绍,只对技术选型和网流程,对于架构的演变以及技术哪个还好不开具体说明。只供应参考!!!

10.3     实现持续传输大块数据

首先章     系统架构

    
架构图这块主要表达一个大约的结构化的意思,可以无太规范,希望大家会明白。作为一个系统来讲还包网络部署框架图,根据使用场景以及网环境不平等网络框架图也未均等,所以无在本文的讨论范围外。

10.3.1 设计要发送数据协议

   
请求发送0x62下令,共10单字节,校验和也自“从机地址”开始的丰富和,不包“数据报头”、“校验和”和“协议了”。

    请求指令数据帧如下:

葡京娱乐总站平台 4

   
服务端接收到拖欠要命令后,返回同样的授命信息被客户端,客户端则进入持续发送数据的状态。

1.1    硬件构架图

 葡京娱乐总站平台 5

10.3.2 客户端代码实现

    先发送请求数据令,代码如下:

private void btSendFile_Click(object sender, EventArgs e)
{
            try
            {
                if (this._tcpClient == null)
                {
                    return;
                }

                if (!File.Exists(this.txtFilePath.Text))
                {
                    WriteLog("请选择文件");
                    return;
                }

                byte[] backData = new byte[10];
                backData[0] = 0x55;
                backData[1] = 0xaa;//协议头
                backData[2] = byte.Parse(this.numericUpDown1.Value.ToString());//从机地址
                backData[3] = 0x62;//命令
                int count=(int)(new FileInfo(this.txtFilePath.Text)).Length;
                byte[] countBytes = BitConverter.GetBytes(count);

                backData[4] = countBytes[0];
                backData[5] = countBytes[1];
                backData[6] = countBytes[2];
                backData[7] = countBytes[3];
                byte[] checkSum = new byte[6];
                Buffer.BlockCopy(backData, 2, checkSum, 0, checkSum.Length);
                backData[8] = (byte)checkSum.Sum(b => b);//计算校验和
                backData[9] = 0x0d;

                this._tcpClient.Client.Send(backData, 0, backData.Length, SocketFlags.None);
            }
            catch (SocketException ex)
            {
                Disconnect();
                WriteLog(ex.Message);
            }
}

     接收及服务端的确认消息后,持久发送数据的代码如下:

private void SendFile()
        {
            FileStream fs = null;
            try
            {
                if (this._tcpClient == null)
                {
                    return;
                }
                string fileName = this.txtFilePath.Text;
                if (!File.Exists(fileName))
                {
                    WriteLog("请选择文件");
                    return;
                }
                WriteLog("开始传输>>");
                byte[] sendBuffer = new byte[1024];
                fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
                long length = fs.Length;
                int count = 0;
                Stopwatch watch = new Stopwatch();
                watch.Start();
                while (length > 0)
                {
                    int sendNum = fs.Read(sendBuffer, 0, sendBuffer.Length);
                    sendNum = _tcpClient.Client.Send(sendBuffer, 0, sendNum, SocketFlags.None);
                    length -= sendNum;
                    count += sendNum;

                    float percent = ((fs.Length - length) / (float)fs.Length) * 100.0f;
                    WriteLog("已传:" + percent.ToString("0.00") + "%");
                }
                watch.Stop();

                WriteLog("传输完毕!总数:" + count.ToString() + ",耗时:" + watch.Elapsed.TotalSeconds.ToString(CultureInfo.InvariantCulture));
            }
            catch (SocketException ex)
            {
                this.Disconnect();
                WriteLog(ex.Message);
            }
            catch (Exception ex)
            {
                WriteLog(ex.Message);
            }
            finally
            {
                if (fs != null)
                {
                    fs.Close();
                    fs.Dispose();
                }
            }
        }

1.2    组件构架图

 葡京娱乐总站平台 6

 

10.3.3 ServerSuperIO框架的贯彻和注意事项

    
客户端的代码实现多并未呀好讲的,主要是介绍因ServerSuperIO框架,以设施驱动之主意是怎落实的。注:以下自控模式实现。

  1. 1.      共谋接口的贯彻

      DeviceProtocol:ProtocolDriver接口有一个GetPackageLength(byte[]
data, IChannel channel, ref int
readTimeout)函数接口,data参数是央发送数据的授命,channel参数是时下IO通道的实例,readTimeout是自从定义返回接收数据长度所设以的时刻,如果回到回值为0的语,则认为未进入持续吸纳数据任务。可以由此channel参数直接回确认消息,具体代码如下:

public override int GetPackageLength(byte[] data, IChannel channel, ref int readTimeout)
        {
            if (data == null || data.Length <= 0)
                return 0;
            readTimeout = 2000;
            if (CheckData(data))
            {
                try
                {
                    if (data[3] == 0x62) //发送文件请求
                    {
                        int length = BitConverter.ToInt32(new byte[] {data[4], data[5], data[6], data[7]}, 0);
                        if (length <= 1024*1024) //限制
                        {
                            int num = channel.Write(data);
                            if (num > 0)
                            {
                                Console.WriteLine("返回文件请求确认数据");
                                return length;
                            }
                            else
                            {
                                return 0;
                            }
                        }
                        else
                        {
                            return 0;
                        }
                    }
                    else
                    {
                        return 0;
                    }
                }
                catch (Exception)
                {
                    return 0;
                }
            }
            else
            {
                Console.WriteLine("校验错误");
                return 0;
            }
        }

 2.      共谋命令的实现

  
为了落实对大块数据的拍卖,专门多一个商议命令,用于解析、保存数据。代码如下:

internal class DeviceFileCommand:ProtocolCommand
    {
        public override string Name

        {
            get { return CommandArray.FileData.ToString(); }
        }

        public override dynamic Analysis<T>(byte[] data, T t)
        {
            if (t != null)
            {
                string path = AppDomain.CurrentDomain.BaseDirectory + DateTime.Now.ToString("yyyyMMddHHmmss") + ".txt";
                File.WriteAllBytes(path, t as byte[]);
                return path;
            }
            else
            {
                return null;
            }
        }
}
  1. 3.      配备驱动调用协议,并让协议命令

    
在接大块数据流的时光,会管持有数据信息返回到装备驱动之Communicate接口,其中info参数的Data是目前恳求数据的下令,BigData就是绵绵吸纳数据的消息,通过调用this.Protocol.DriverAnalysis协议接口驱动协议命令DeviceFileCommand。具体代码如下:

public override void Communicate(ServerSuperIO.Communicate.IRequestInfo info)
        {
            string hexs = BinaryUtil.ByteToHex(info.Data);
            OnDeviceRuningLog("接收>>" + hexs);
            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;
                }
                else if (cr == CommandArray.FileData)
                {
                    OnDeviceRuningLog("文件存储路径:" + obj.ToString());
                }
            }
            OnDeviceRuningLog("通讯正常");
        }
  1. 4.      宿主程序服务实例配置注意事项

     主要在布局参数中布局StartCheckPackageLength =
true,在连数据的进程遭到会检测相应设施驱动之商接口GetPackageLength。

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.DeviceIP,
            });

            server.AddDeviceCompleted += server_AddDeviceCompleted;
            server.DeleteDeviceCompleted+=server_DeleteDeviceCompleted;
            server.Start();
            server.AddDevice(dev2);
            while ("exit" == Console.ReadLine())
            {
                server.Stop();
            }
        }

其次章节     技术选型与介绍

文章非介绍代码有,在Demo事例中起整体的代码和注释,可以下载调试。

10.4     运行效果

图片

葡京娱乐总站平台 7

视频


 

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 


 

2.1    开发环境

支付语言:全部使用C#,配起少量底JS代码。

开发工具:除App部分,所有组件都采取VS2012开,App程序行使VS2015支付,VS2015凡是一个顶尖开发工具工厂,在Win10操作系统及付出IoT嵌入式程序,也从来不问题。

操作系统:Windows
8.1,用习惯了吧不错,听说只要停止服务了,不过还有人口以应用XP呢,不必顾虑。

2.2    数据源

   
数据源也就算是产生多少的东西,也有人拿这块统称为传感器,但是自己觉得这个叫法不绝标准,所以自己一般将这块统称为数据源。

   
数据源包括的情多,例如:各类传感器、大中小型设备、硬件电路、软件组件等。各类数据源的通讯协议不同、通讯链路不同、通讯机制不同,在从来不统一标准的动静下,这一部分的工作比要。因为发矣数之后,你的业务系统才发下之价值。

   
数据源我是形容了一个模块的多少程序,包括串口通讯及网口通讯。至于报道协议,请参见《C#通讯(串口和网络)框架的统筹及贯彻(SuperIO)-
12.二次开发及采取》。

2.3    数据收集

    
数据收集部分采用的是SuperIO框架,因为它们支持串口和网口统一的插件式设备驱动开发,也就是说开发一个让可以支持串口和网口通讯。另外,可扩展性比较高,可以大大减弱多少工作量。

    
开发了一个驱动程序,在SuperIO平台下多有限个叫实例,负责和数据源程序进行串口和网络通讯。

2.4    数据上传服务

    
数据上传服务是于SuperIO平台下出的,可以继承IAppService接口开发插件服务,并且挂载到SuperIO平台下运行,设备驱动采集结束数据后,可以经过接口传递至劳动插件内,通过内存交互数据。如果涉嫌到多少完全性的数量交互,可以由此介质进行多少交互,例如:数据库、文本文件等。

   
数据上传服务一直与消息中间件(ActiveMQ)进行交互,再由AcitveMQ进行信息转发。数据上传服务实在是信生产者的角色。

2.5    消息中间件

    
消息中间件采用ActiveMQ,需要配备Java运行环境。可用的消息中间件比较多,例如:RabbitMQ、ZeroMQ等。

    
根据使用场景不同,可以选的艺方案以及技艺路线吧不相同。消息中间件这块也完全好行使通讯组件来替,例如:Netty和SuperSocket。

2.6    数据接受服务

    
数据接受服务是于SuperIO平台下出的,可以连续IAppService接口开发插件服务,并且挂载到SuperIO平台下运行。

    
数据接收服务一直跟ActiveMQ进行互,接收ActiveMQ转发过来的信息,实际上是信息消费者的角色。

2.7    数据存储

   
数据存储采用的凡MongoDB,不绝喜欢大而重叠的物,而且未欲ORM了,部署简单,可以采取MongoVUE工具对数据库进行保管。如果是大拿,可以一直cmd。

2.8    数据接口

    数据接口采用Web
Api,符合RESTful风格的http协议,操作调用简单、方便。抛弃了WebService的Soap协议,更没选WCF框架。

    这块并不曾落实权力、安全保管。

2.9    Web业务体系

   
业务体系使用MVC框架,但是前端并无同后台的控制器进行互,而是与数码接口的WebAPI进行互动。前后端了分离。

2.10     手机走终端App

    
手机移动端应用VS2015开,使用Xamarin框架进行付出,这个框架支持过平台。Xamarin是独雅科学的东西,唯一的先天不足就是是得付费,对于华IT人员来讲,这或多或少应有无是阻碍。

第三章     Demo的介绍

3.1    目录介绍

项目目录介绍如下:

ClientService:上传数据与互为组件。

DeviceDemo:设备驱动,负责采集数据。

DeviceExport:数据输出组件,在Demo没有行使。

DeviceShowUI:数据显示视图组件,负责显示采集过来的数据信息。

FormTest:测试各部分的主工程。

ProtocolPackage:公用协议包。

ServerService:数据接收数据与互动组件。

SuperIO_App:移动APP端,需要VS2015打开。

SuperOPCClient:OPC客户端组件。

SuperOPCServer:OPC服务端组件。

TestDevice:模拟客户端测试程序。

WebAPI:WebAPI和Web业务端数据展示。

3.2    Demo调试

 下充斥地址:http://pan.baidu.com/s/1pJ7lZWf

(1)    下载DEMO和工具

    下载SuperIO v2.2.7\SuperIO_Demo
v2.rar;下载mongodb数据库;下载ActiveMQ消息中间件。

(2)    启动服务同次

    
启动mongodb,mongodb-win32-x86_64-2008plus-3.0.3-1\start.bat,默认监听端口为:2222。

    
启动ActiveMQ服务,apache-activemq-5.12.0\bin\win64\activemq.bat,需要JAVA运行条件。

    
启动SuperIO_Demo.sln解决方案,需要VS2012开发IDE,也得改成为VS2015工程,重新编译。

    
启动SuperIO_App.sln解决方案,需要VS2015出IDE,如果采取VS自带的模拟器,需要执行<adb
connect
模拟器的IP>,才能够管程序成安排及模拟器,并且展开调剂,否则VS工具一直处于部署阶段。

(3)运行效果图

 葡京娱乐总站平台 8

(4)调试视频

   
youku视频不是极其明白,请下载高清调试视频,地址:http://pan.baidu.com/s/1pJ7lZWf遇的【视频演示】。

 

 

作者:唯笑志在

Email:504547114@qq.com

QQ:504547114

.NET开发技术联盟:54256083

文档下载:http://pan.baidu.com/s/1pJ7lZWf

合法网址:http://www.bmpj.net