开源跨平台IOT通讯框架ServerSuperIO,集成到NuGet程序包管理器,以及Demo使用说明
物联网涉及到各种设备、各种传感器、各种数据源、各种协议,并且很难统一,那么就要有一个结构性的框架解决这些问题。SSIO就是根据时代发展的阶段和现实实际情况的结合产物。
各种数据信息,如下图:

解决方案,配合SIO使用:

一、SSIO特点
- 轻型高性能通信框架,适用于多种应用场,轮询模式、自控模式、并发模式和单例模式。
- 不光是通讯框架,是设备驱动、IO通道、控制模式场景的协调机制。
- 支持协议驱动器,可以按规范写标准协议和自定义协议。
- 支持发送数据缓存器,支持命令缓存重发和按优先级别发送。
- 支持协议过滤器,按规则筛选数据,并且可以承继接口,自定义过滤方式。
- 支持接收数据缓存器,可以缓存不符合过滤器的数据,和下次接收数据进行拼接。
- 支持按设备命令优先级别进行调度设备,保证有高级别命令的驱动及时发送。
- 支持一个设备驱动,同时支持串口和网络两种通讯方式,可以监视IO通道数据。
- 支持一个设备驱动,在网络通讯时可以支持TCP Server和TCP Client两种工作模式。
- 支持多设备共享同一IO通道进行通讯。
- 支持定时清理超时的网络IO通道。
- 支持显示视图接口,满足不同显示需求。
- 支持服务组件接口,可以自定义完成OPC服务、4-20mA输出、LED大屏显示、短信服务、以及多功能网关服务。
- 支持创建多服务实例,完成不同业务的拆分。
- 支持跨平台部署,可以运行在Linux和Windows系统。
二、SSIO发布到NuGet平台

三、搜索SSIO

四、安装SSIO

五、事例代码(Demo)
Demo下载地址: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的数据信息,稳定性、扩展性都非常不错。

2.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍
2.应用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)构建系统的整体方案
3.C#工业物联网和集成系统解决方案的技术路线(数据源、数据采集、数据上传与接收、ActiveMQ、Mongodb、WebApi、手机App)
5.ServerSuperIO开源地址:https://github.com/wxzz/ServerSuperIO
物联网&集成技术(.NET) QQ群:
开源跨平台IOT通讯框架ServerSuperIO,集成到NuGet程序包管理器,以及Demo使用说明的更多相关文章
- 【重大更新】开源跨平台物联网通讯框架ServerSuperIO 2.0(SSIO)下载
更新具体细节参见:[更新设计]跨平台物联网通讯框架ServerSuperIO 2.0 ,功能.BUG.细节说明,以及升级思考过程! 声明:公司在建设工业大数据平台,SSIO正好能派上用场,所以抓紧时间 ...
- 【开源】C#跨平台物联网通讯框架ServerSuperIO(SSIO)
[连载]<C#通讯(串口和网络)框架的设计与实现>-1.通讯框架介绍 [连载]<C#通讯(串口和网络)框架的设计与实现>-2.框架的总体设计 目 录 C#跨平台物联 ...
- [更新设计]跨平台物联网通讯框架ServerSuperIO 2.0 ,功能、BUG、细节说明,以及升级思考过程!
注:ServerSuperIO 2.0 还没有提交到开源社区,在内部测试!!! 1. ServerSuperIO(SSIO)说明 SSIO是基于早期工业现场300波特率通讯传输应用场景发展.演化而来. ...
- [更新]跨平台物联网通讯框架 ServerSuperIO v1.2(SSIO),增加数据分发控制模式
1.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO) 2.应用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)构建系统的整体方案 3.C#工业 ...
- C#跨平台物联网通讯框架ServerSuperIO(SSIO)正式开源... 1
今天科技类最大的新闻,莫过于微软宣布.NET开发框架开源计划..NET 开源,集成 Clang 和 LLVM 而且自带 Android 模拟器,这意味着 Visual Studio 这个当下最好没有之 ...
- 开源物联网通讯框架ServerSuperIO,成功移植到Windows10 IOT,在物联网和集成系统建设中降低成本。附:“物联网”交流大纲
[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 一.概述 经过一个多月晚上的时间,终于把开源物联网通讯框架ServerSuperIO成功移植到Windows10 IOT上, ...
- Swift 正式开源, 包括 Swift 核心库和包管理器
Swift 正式开源!Swift 团队很高兴宣布 Swift 开始开源新篇章.自从苹果发布 Swfit 编程语言,就成为了历史上发展最快的编程语言之一.Swift 通过设计使得软件编写更加快速更加安全 ...
- .NET持续集成与自动化部署之路第二篇——使用NuGet.Server搭建公司内部的Nuget(包)管理器
使用NuGet.Server搭建公司内部的Nuget(包)管理器 前言 Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展.在使用Visual Studio开发基 ...
- Xrepo:一个现代化的跨平台 C/C++ 包管理器
xrepo 是一个基于 Xmake 的跨平台 C/C++ 包管理器. 项目源码 官方文档 它基于 xmake 提供的运行时,但却是一个完整独立的包管理程序,相比 vcpkg/homebrew 此类包管 ...
随机推荐
- BPM端到端流程解决方案分享
一.需求分析 1.企业规模的不断发展.管理水平的不断提升,通常伴随着企业各业务板块管理分工更细.更专业,IT系统同样越来越多.越来越专 业化.不可避免的,部门墙和信息孤岛出现了,企业的流程被部门或者I ...
- Linux基础介绍【第一篇】
Linux简介 什么是操作系统? 操作系统,英文名称Operating System,简称OS,是计算机系统中必不可少的基础系统软件,它是应用程序运行以及用户操作必备的基础环境支撑,是计算机系统的核心 ...
- java的poi技术读取Excel数据到MySQL
这篇blog是介绍java中的poi技术读取Excel数据,然后保存到MySQL数据中. 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术可以在 ...
- 【Java并发编程实战】-----“J.U.C”:CountDownlatch
上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...
- Kinect开发文章目录
整理了一下去年为止到现在写的和翻译的Kinect的相关文章,方便大家查看.另外,最近京东上微软在搞活动, 微软 Kinect for Windows 京东十周年专供礼包 ,如果您想从事Kinect开发 ...
- 【PRINCE2是什么】PRINCE2认证之七大主题(1)
进入第一个主题,PRINCE2商业论证:PRINCE2指出,商业论证就是进行判断是否值得对项目进行投资,值不值的问题.PRINCE2的商业论证有四个 在项目开始时,开发商业论证.在整个项目生命周期中, ...
- php中使用fsockopen实现异步请求
php执行一段程序,有可能几毫秒就执行完毕,也有可能耗时较长.例如,用户下单这个事件,如果调用了些第三方服务进行发邮件.短信.推送等通知,可能导致前端一直在等待.而有的时候,我们并不关心这些耗时脚本的 ...
- 修改linux的hosts 后提示“无效的参数”
碰到个问题,修改linux的主机名问题. vim /etc/hosts 192.168.154.129 129192.168.154.132 132192.168.154.133 133 本地ip是1 ...
- PHP开发环境的配置
PHP的开发环境主要包括:安装和配置Apache服务器.PHP引擎以及MySQL数据库服务器,另外选用Dreamweaver作为PHP的开发工具. 1.安装和测试Apache 首先下载Apache:官 ...
- golang-web框架revel一个表单提交的总结
这里要介绍好是revel框架的表单post提交的列子,主要是用于入门学习,和一些知识点的讲解: 首先: 来了解一个问题那就是重复提交表单,做过form表单提交的同学都知道,如果表单提交后不做处理,那么 ...