目 录
开源跨平台IOT通信框架ServerSuperIO,集成到NuGet程序包管理器,以及德姆o使用表明,iotnuget
物联网涉及到种种设施、各类传感器、各样数据源、各个协商,何况很难统一,那么将要有四个结构性的框架消除这个标题。SSIO就是依赖不常前进的阶段和切实实际处境的构成产物。
种种数码音讯,如下图:
** 应用方案,协作SIO使用:**
一、SSIO特点
- 轻型高质量通讯框架,适用于两种应用场,轮询情势、自控情势、并发格局和单例情势。
- 岂不过报导框架,是器具驱动、IO通道、调节形式场景的和睦机制。
- 帮忙公约驱动器,能够按正统写标准左券和自定义切磋。
- 协理发送数据缓存器,援救命令缓存重发和按事先等第发送。
- 支撑左券过滤器,按法规筛选数据,况兼可以继继承口,自定义过滤格局。
- 支撑接收数据缓存器,能够缓存不适合过滤器的数量,和后一次接收数据实行拼接。
- 支撑按设备命令优先品级实行调整设施,保险有高档别命令的驱动及时发送。
- 帮忙五个设施驱动,同一时间扶助串口和网络二种简报方式,能够监视IO通道数据。
- 支撑贰个设施驱动,在互连网通信时能够帮忙TCP Server和TCP
Client二种工作形式。 - 扶助多配备共享同一IO通道实行报导。
- 支撑按期清理超时的互联网IO通道。
- 支持显得视图接口,满意不一样显示须求。
- 援助服务组件接口,能够自定义完结OPC服务、4-20mA输出、LED大屏展现、短信服务、以及多职能网关服务。
- 协理成立多服务实例,实现分化职业的拆分。
- 协理跨平台布署,能够运作在Linux和Windows系统。
二、SSIO发布到NuGet平台
三、搜索SSIO
四、安装SSIO
五、事例代码(Demo)
德姆o下载地址:https://github.com/wxzz/ServerSuperIO/tree/2.0
1.客商端(发送文书)
static void SendFile()
{
if (!System.IO.File.Exists(_file))
{
Console.WriteLine("文件不存在:"+_file);
return;
}
FileStream fs = null;
try
{
Console.WriteLine("开始传输>>");
string fileName=DateTime.Now.ToString("yyMMddHHmmss") + ".txt";
int bufferSize = _sendBufferSize;
byte[] sendBuffer = new byte[bufferSize];
fs = new FileStream(_file, 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);
byte[] package = GetDataPackage(fileName,sendBuffer, sendNum);
count+=_tcpClient.Client.Send(package, 0, package.Length, SocketFlags.None);
length -= sendNum;
float percent = ((fs.Length - length)/(float) fs.Length)*100.0f;
Console.WriteLine("已传:" + percent.ToString("0.00") + "%");
}
watch.Stop();
Console.WriteLine("传输完毕!总数:" + count.ToString()+",耗时:"+ watch.Elapsed.TotalSeconds.ToString(CultureInfo.InvariantCulture));
}
catch
{
throw;
}
finally
{
if (fs != null)
{
fs.Close();
fs.Dispose();
}
}
}
static byte[] GetDataPackage(string fileName,byte[] sendBuffer, int sendNum)
{
byte[] sendPackage = new byte[sendNum + 24];
sendPackage[0] = 0x35;
sendPackage[1] = 0x35;
string code = "0001";
byte[] codeBytes = System.Text.Encoding.ASCII.GetBytes(code);
Buffer.BlockCopy(codeBytes, 0, sendPackage, 2, 4);
byte[] fileBytes= System.Text.Encoding.ASCII.GetBytes(fileName);
Buffer.BlockCopy(fileBytes, 0, sendPackage, 6, 16);
Buffer.BlockCopy(sendBuffer, 0, sendPackage, 22, sendNum);
sendPackage[sendPackage.Length - 2] = 0x33;
sendPackage[sendPackage.Length - 1] = 0x33;
return sendPackage;
}
2.装置驱动
//设备驱动
public class ReceiveFileDriver:RunDevice
{
private Dynamic _Dyn;
private Parameter _Parameter;
private Protocol _Protocol;
public ReceiveFileDriver() : base()
{
_Dyn = new Dynamic();
_Parameter = new Parameter();
_Protocol = new Protocol();
}
public override void Initialize(int devid)
{
this.Protocol.InitDriver(this, new FixedHeadAndEndReceiveFliter(TransFileDriver.Protocol.Head, TransFileDriver.Protocol.End)); //初始化协议驱动
}
//省略......
}
//协议驱动,并处理数据
public class Command : ProtocolCommand
{
public Command()
{
}
public override string Name
{
get { return "writefile"; }
}
public override object Analysis(byte[] data, object obj)
{
try
{
//count += data.Length - 24;
//Console.WriteLine(count.ToString()+","+data[0].ToString() + "," + data[data.Length - 1].ToString());
string path = Path.Combine(Environment.CurrentDirectory, "rev");
if (!System.IO.Directory.Exists(path))
{
System.IO.Directory.CreateDirectory(path);
}
string fileName = System.Text.Encoding.ASCII.GetString(data, 6, 16);
path=Path.Combine(path, fileName);
using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write))
{
fs.Seek(fs.Length, SeekOrigin.Current);
byte[] content = new byte[data.Length - 24];
Buffer.BlockCopy(data, 22, content, 0, content.Length);
fs.Write(content, 0, content.Length);
fs.Flush();
}
}
catch
{
return -1;
}
return 0;
}
public override byte[] Package(string code, object obj)
{
throw new NotImplementedException();
}
}
3.宿主程序
static void Main(string[] args)
{
ReceiveFileDriver dev = new ReceiveFileDriver();
dev.DeviceParameter.DeviceName = "设备4";
dev.DeviceParameter.DeviceAddr = 0;
dev.DeviceParameter.DeviceCode = "0001";
dev.DeviceParameter.DeviceID = 0;
dev.DeviceDynamic.DeviceID = 0;
dev.DeviceParameter.NET.RemoteIP = "127.0.0.1";
dev.DeviceParameter.NET.RemotePort = 9600;
dev.CommunicateType = CommunicateType.NET;
dev.Initialize(0);
IServer server = new ServerFactory().CreateServer(new ServerConfig()
{
ServerName = "接收文件服务",
ListenPort = 6699,
NetReceiveBufferSize = 2048,
ControlMode = ControlMode.Self,
SocketMode = SocketMode.Tcp,
DeliveryMode = DeliveryMode.DeviceCode,
StartReceiveDataFliter = true,
ClearSocketSession = false,
});
server.AddDeviceCompleted += server_AddDeviceCompleted;
server.DeleteDeviceCompleted += server_DeleteDeviceCompleted;
server.Start();
server.AddDevice(dev);
while ("exit" == Console.ReadLine())
{
server.Stop();
}
}
六、实验效果
二日的岁月,将近3GB的数额新闻,牢固性、扩大性都特别科学。
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
http://www.bkjia.com/C\_jc/1151255.htmlwww.bkjia.comtruehttp://www.bkjia.com/C\_jc/1151255.htmlTechArticle开源跨平台IOT通讯框架ServerSuperIO,集成到NuGet程序包管理器,以及Demo使用说明,iotnuget
物联网涉及到 各样器械、各样传感器、各类数据源…
物联网涉及到各个设备、种种传感器、各类数据源、各个协商,何况很难统一,那么将要有一个结构性的框架消除这几个难题。SSIO正是依照时期升高的品级和实际实况的组合产物。
工业物联网和集成系统建设方案的技能路线… 1
各个数据音讯,如下图:
前言… 1
率先章 系统架构… 3
1.1 硬件构架图… 3
1.2 组件构架图… 4
应用方案,同盟SIO使用:
第二章 本事选型与介绍… 5
2.1 开垦情形… 5
一、SSIO特点
2.2 数据源… 5
- 轻型高质量通讯框架,适用于各样应用场,轮询形式、自我调节形式、并发情势和单例情势。
- 不单是通信框架,是器材驱动、IO通道、调节方式场景的调护医疗机制。
- 支撑公约驱动器,能够按正统写标准合同和自定义合计。
- 协理发送数据缓存器,帮助命令缓存重发和按优先等第发送。
- 援助合同过滤器,按法则筛选数据,况兼能够承受接口,自定义过滤形式。
- 扶助接收数据缓存器,可以缓存不切合过滤器的数码,和下一次接收数据举办拼接。
- 帮助按设备命令优先品级进行调解设施,保障有高档别命令的驱动及时发送。
- 支撑多个设备驱动,同一时直接济串口和互连网三种简报方式,能够监视IO通道数据。
- 支撑一个设备驱动,在互连网通信时得以支持TCP
Server和TCP Client三种职业格局。 - 支撑多配备分享同一IO通道举行电视发表。
- 帮助定期清理超时的互连网IO通道。
- 支撑显得视图接口,满足分裂展现要求。
- 支撑服务组件接口,能够自定义达成OPC服务、4-20mA输出、LED大屏呈现、短信服务、以及多效果与利益网关服务。
- 扶助创立多服务实例,完毕差别事业的拆分。
- 扶助跨平台陈设,能够运作在Linux和Windows系统。
2.3 数据搜集… 5
二、SSIO发布到NuGet平台
2.4 数据上传服务… 6
2.5 音信中间件… 6
三、搜索SSIO
2.6 数据接受服务… 6
2.7 数据存款和储蓄… 6
style=”font-size: 18px;”>四、安装SSIO
2.8 数据接口… 7
2.9 Web业务系统… 7
五、事例代码(德姆o)
2.10 手提式有线电话机移动终端App. 7
德姆o下载地址:https://github.com/wxzz/ServerSuperIO/tree/2.0
第三章 Demo的介绍… 8
1.客商端(发送文书)
3.1 目录介绍… 8
3.2 Demo调试… 8
static void SendFile()
{
if (!System.IO.File.Exists(_file))
{
Console.WriteLine("文件不存在:"+_file);
return;
}
FileStream fs = null;
try
{
Console.WriteLine("开始传输>>");
string fileName=DateTime.Now.ToString("yyMMddHHmmss") + ".txt";
int bufferSize = _sendBufferSize;
byte[] sendBuffer = new byte[bufferSize];
fs = new FileStream(_file, 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);
byte[] package = GetDataPackage(fileName,sendBuffer, sendNum);
count+=_tcpClient.Client.Send(package, 0, package.Length, SocketFlags.None);
length -= sendNum;
float percent = ((fs.Length - length)/(float) fs.Length)*100.0f;
Console.WriteLine("已传:" + percent.ToString("0.00") + "%");
}
watch.Stop();
Console.WriteLine("传输完毕!总数:" + count.ToString()+",耗时:"+ watch.Elapsed.TotalSeconds.ToString(CultureInfo.InvariantCulture));
}
catch
{
throw;
}
finally
{
if (fs != null)
{
fs.Close();
fs.Dispose();
}
}
}
static byte[] GetDataPackage(string fileName,byte[] sendBuffer, int sendNum)
{
byte[] sendPackage = new byte[sendNum + 24];
sendPackage[0] = 0x35;
sendPackage[1] = 0x35;
string code = "0001";
byte[] codeBytes = System.Text.Encoding.ASCII.GetBytes(code);
Buffer.BlockCopy(codeBytes, 0, sendPackage, 2, 4);
byte[] fileBytes= System.Text.Encoding.ASCII.GetBytes(fileName);
Buffer.BlockCopy(fileBytes, 0, sendPackage, 6, 16);
Buffer.BlockCopy(sendBuffer, 0, sendPackage, 22, sendNum);
sendPackage[sendPackage.Length - 2] = 0x33;
sendPackage[sendPackage.Length - 1] = 0x33;
return sendPackage;
}
前言
2.道具驱动
2000年过后,互连网在中原的五洲上任性的进化,在这么些行业竞争中比的是加快度。笔者鲜明的记得《世界是平的》中有那般一段话:在澳洲,羚羊每一天深夜醒来时,它知道自个儿必得跑得比最快的欧洲狮还快,不然就能被吃掉;白狮每一日清晨醒来时,它明白自身必得追上跑得最慢的剑羚,不然就能够被饿死;不管你是狮虎兽如故羚羊,当太阳升起时,你最棒伊始奔跑!大家奔跑的那10多年的时刻里,互连网才具带来了各行各来的提升,同一时候也包涵了各行各来。
//设备驱动
public class ReceiveFileDriver:RunDevice
{
private Dynamic _Dyn;
private Parameter _Parameter;
private Protocol _Protocol;
public ReceiveFileDriver() : base()
{
_Dyn = new Dynamic();
_Parameter = new Parameter();
_Protocol = new Protocol();
}
public override void Initialize(int devid)
{
this.Protocol.InitDriver(this, new FixedHeadAndEndReceiveFliter(TransFileDriver.Protocol.Head, TransFileDriver.Protocol.End)); //初始化协议驱动
}
//省略......
}
//协议驱动,并处理数据
public class Command : ProtocolCommand
{
public Command()
{
}
public override string Name
{
get { return "writefile"; }
}
public override object Analysis(byte[] data, object obj)
{
try
{
//count += data.Length - 24;
//Console.WriteLine(count.ToString()+","+data[0].ToString() + "," + data[data.Length - 1].ToString());
string path = Path.Combine(Environment.CurrentDirectory, "rev");
if (!System.IO.Directory.Exists(path))
{
System.IO.Directory.CreateDirectory(path);
}
string fileName = System.Text.Encoding.ASCII.GetString(data, 6, 16);
path=Path.Combine(path, fileName);
using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write))
{
fs.Seek(fs.Length, SeekOrigin.Current);
byte[] content = new byte[data.Length - 24];
Buffer.BlockCopy(data, 22, content, 0, content.Length);
fs.Write(content, 0, content.Length);
fs.Flush();
}
}
catch
{
return -1;
}
return 0;
}
public override byte[] Package(string code, object obj)
{
throw new NotImplementedException();
}
}
二零零五年时,工业行当还在科学普及利用电话线实行数据传输和长距离协助。网络技艺日趋的在向各行各业传导,工业行当也在前行,局域网、光纤以太网、WIFI\3G\4G等曾经运用很布满了。互连网技艺在推动创建业发展的同一时间,也拉动了非常多集团的与时俱进,进级本领、提供越来越好的劳动。
3.宿主程序
大家在图谋,后网络时期将如何进步?将是网络与五行深度融入的经过,举个例子现在常被提起的物联网,小编感觉它实质上是工业网络,是制作本领与互连网本事无缝对接。不管是叫物联网照旧工业网络,以后物与物的互动、物与人的互动将不恐怕制止。硬件与软件的同台发展,更快的递进了这几个历程,比如:智能微电路的上进、嵌入式操作系统的上进、智能传感器的向上等。
static void Main(string[] args)
{
ReceiveFileDriver dev = new ReceiveFileDriver();
dev.DeviceParameter.DeviceName = "设备4";
dev.DeviceParameter.DeviceAddr = 0;
dev.DeviceParameter.DeviceCode = "0001";
dev.DeviceParameter.DeviceID = 0;
dev.DeviceDynamic.DeviceID = 0;
dev.DeviceParameter.NET.RemoteIP = "127.0.0.1";
dev.DeviceParameter.NET.RemotePort = 9600;
dev.CommunicateType = CommunicateType.NET;
dev.Initialize(0);
IServer server = new ServerFactory().CreateServer(new ServerConfig()
{
ServerName = "接收文件服务",
ListenPort = 6699,
NetReceiveBufferSize = 2048,
ControlMode = ControlMode.Self,
SocketMode = SocketMode.Tcp,
DeliveryMode = DeliveryMode.DeviceCode,
StartReceiveDataFliter = true,
ClearSocketSession = false,
});
server.AddDeviceCompleted += server_AddDeviceCompleted;
server.DeleteDeviceCompleted += server_DeleteDeviceCompleted;
server.Start();
server.AddDevice(dev);
while ("exit" == Console.ReadLine())
{
server.Stop();
}
}
大数据、分布式、云总括等也在以惊人的快慢发展,某个人大概感觉这几个东西离我们生存还相比较持久。然而并不是是如此的,距离二零零七年只可是10年左右,现在的上进却是在此以前您不能想像的,而这种加快度的升高办法,2年的升高恐怕是您过去10年的发展之和。不管那么些技艺以往是或不是能够落地,可是这种势头是力不能够及改动的。
六、实验效果
数据的流动能够表现,现金的流淌能够追加GDP。技能的升高就是生产力的晋升,现在团队结商谈涉嫌也决然产生变化。不管是或不是懂本事技艺、是不是懂管理,思维方法不扭转确定会被淘汰。
下面前碰到物联网和集成系统的施工方案的技术路子开展介绍,只对技巧选型和种类流程,对于架构的嬗变以及手艺哪个更加好不做具体表达。只供参照他事他说加以考察!!!
二日的光阴,将近3GB的数码新闻,稳固性、扩大性都丰硕不利。
首先章 系统架构
架构图这块首要表明三个大概的结构化的意味,能够不太可相信,希望我们能够清楚。作为一个系统来说还包罗互联网安插框架图,依照使用场景和网络碰着不雷同网络框架图也差异样,所以不在本文的座谈范围内。
1.1 硬件构架图
1.2 组件构架图
第二章 本事选型与介绍
作品不介绍代码部分,在德姆o事例中有全体的代码和注释,能够下载调节和测量检验。
2.1 开荒意况
支出语言:全体使用C#,配有小量的JS代码。
开拓工具:除App部分,全部组件都施用VS二零一一开销,App程序行使VS二〇一四开支,VS二零一四是叁个一流级开辟工具工厂,在Win10操作系统上付出IoT嵌入式程序,也并没卓殊。
操作系统:Windows
8.1,用习贯了也未可厚非,据说要停下服务了,然则还大概有人在运用XP呢,不必顾虑。
2.[开源]C#跨平台物联网通信框架ServerSuperIO(SSIO)介绍
2.2 数据源
数据源相当于产生多少的东西,也是有人把那块统称为传感器,然而小编认为这一个叫法不太标准,所以自个儿一般把那块统称为数据源。
数据源包括的剧情比相当多,比如:种种传感器、大中型Mini型设备、硬件电路、软件组件等。各个数据源的简报左券差别、通信链路不一样、通信机制不一样,在并未有统一规范的气象下,这一部分的行事比第一。因为有了数据现在,你的政工体系才有应用的股票总值。
数据源作者是写了七个模块的小程序,包括串口通信和网口通信。至于报导公约,请参见《C#电视发表(串口和网络)框架的规划与贯彻(SuperIO)-
12.三回开辟及应用》。
2.选用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)营造系统的完整方案
2.3 数据搜聚
数据采摘部分接纳的是SuperIO框架,因为它帮衬串口和网口统一的插件式设备驱动开荒,也正是说开拓八个使得可以补助串口和网口通信。其他,可扩充性相比强,能够大大减小职业量。
开采了四个驱动程序,在SuperIO平台下扩展七个驱动实例,肩负与数据源程序开展串口和互连网通信。
3.C#工业物联网和集成系统实施方案的手艺路径(数据源、数据收罗、数据上传与接收、ActiveMQ、Mongodb、WebApi、手机App)
2.4 数据上传服务
数据上传服务是在SuperIO平台下支付的,能够持续IAppService接口开荒插件服务,并且挂载到SuperIO平台下运转,设备驱动收集完数据后,能够由此接口传递到服务插件内,通过内存交互数据。若是涉及到多少完全性的多寡交互,可以经过介质举办数量交互,举个例子:数据库、文本文件等。
数据上传服务一贯与音讯中间件(ActiveMQ)进行相互,再由AcitveMQ进行消息转载。数据上传服务实在是消息生产者的角色。
5.ServerSuperIO开源地址:https://github.com/wxzz/ServerSuperIO
2.5 音讯中间件
音信中间件选用ActiveMQ,必要配置Java运维境遇。可用的消息中间件相当多,比如:RabbitMQ、ZeroMQ等。
依据使用场景区别,能够挑选的技术方案和手艺路子也不平等。新闻中间件那块也统统能够选择通信组件来代表,举个例子:Netty和SuperSocket。
物联网&集成技艺(.NET) QQ群:54256083
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
手提式有线话机移动端应用VS二零一六支付,使用Xamarin框架举办付出,这些框架援救跨平台。Xamarin是个很科学的事物,独一的瑕玷正是索要付费,对于中中原人民共和国IT人士来说,这点应该不是阻碍。
第三章 Demo的介绍
3.1 目录介绍
品种目录介绍如下:
ClientService:上传数据与相互组件。
Device德姆o:设备驱动,担负征集数据。
DeviceExport:数据输出组件,在德姆o未有动用。
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_德姆o
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实施方案,要求VS二〇一二费用IDE,也得以转成VS二〇一五工程,重新编写翻译。
启动SuperIO_App.sln实施方案,须求VS二〇一四开采IDE,如若运用VS自带的模拟器,供给实践<adb
connect
模拟器的IP>,技艺把程序成功布置到模拟器,况且进行调剂,不然VS工具一贯处在计划阶段。
(3)运维作效果果图
(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