物联网框架ServerSuperIO(SSIO)更新、以及增加宿主程序和配置工具,详细介绍
一、更新内容
1.修改Server类,以及承继关系。2.增加IRunDevice的IServerProvider接口继承。3.修复增加COM设备驱动可能造成的异常。4.修复网络发送数据可能引发的异常。5.完善协议驱动器。
6.修改协议驱动接口。7.修改协议命令接口。8.修复协议命令,抽象基类情况下的异常BUG。
9.增加协议接口GetPackageLength,数据交互更灵活。10.修复一些BUG。11.优化代码。
二、GetPackageLength接口的使用
????这个接口主要的使用场景是:当协议中有请求发送数据长度的命令,例如先向服务器发送数据包长度命令,得到返回确定后,再发送实际数据包信息。在连接发送大块数据的时候,例如文件内容、序列化后的内容等,内容有可能包含协议的头和尾,会影响数据包的完整性。主要用于交互连续的较大数据块内容。
?????1.接口参数
1
2
3
4
5
6
7
8 ///
??????///获得应该接收的数据长度,如果当前接收的数据小于这个返回值,那么继续接收数据,直到大于等于这个返回长度。如果接收数据超时,则直接返回当前已经接收的数据。
??????///
??????///接收的数据
??????///IO通道,用于返回确认数据
??????///返回读数据超时间隔时间
??????///
??????public?abstract?int?GetPackageLength(byte[]data,IChannelchannel,?ref?int?readTimeout); ?????2.接口使用
????????(1)设置配置参数
1
2
3
4
5
6
7
8
9 IServerserver=?new?ServerFactory().CreateServer(new?ServerConfig()
???????????{
???????????????ServerName=?"服务1",
???????????????SocketMode=SocketMode.Tcp,
???????????????ControlMode=ControlMode.Loop,
???????????????CheckSameSocketSession=?false,
???????????????StartCheckPackageLength=?true,?//开启检测数据包长度
???????????????NetReceiveBufferSize=20,
???????????}); ?????????(2)接口代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 public?override?int?GetPackageLength(byte[]data,IChannelchannel,?ref?int?readTimeout)
{
????if?(data==?null?||data.Length<=0)
????????return?0;
?
????readTimeout=2000;
?
????if?(CheckData(data))
????{
????????try
????????{
????????????int?length=BitConverter.ToInt32(new?byte[]{data[3],data[4],data[5],data[6]},0);
?
????????????byte[]okBytes=System.Text.Encoding.ASCII.GetBytes("ok");
????????????int?num=channel.Write(okBytes);
????????????if?(num>0)
????????????{
????????????????Console.WriteLine("返回数据");
????????????}
????????????return?length;
????????}
????????catch?(Exception)
????????{
?
????????????return?0;
????????}
????}
????else
????{
????????Console.WriteLine("校验错误");
????????return?0;
????}
} ?三、增加宿主程序(ServerSuperIO.Host)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 static?IServerFactory_serverFactory=?null;
????????static?void?Main(string[]args)
????????{
????????????Console.ForegroundColor=ConsoleColor.Green;
????????????ConsoleUtil.SetConsoleCtrlHandler(new?ConsoleUtil.ControlCtrlDelegate(HandlerRoutine),?true);
????????????bool?success=?true;
????????????Console.WriteLine("正在初始化服务程序......");
????????????IObjectBuilderbuilder=?new?TypeCreator();
????????????_serverFactory=?new?ServerFactory();
????????????try
????????????{
????????????????GlobalConfiggc=GlobalConfigTool.Load();
????????????????foreach?(ServerSuperIO.Config.ServerserverCfg?in?gc.Servers)
????????????????{
????????????????????IServerserver=_serverFactory.CreateServer(serverCfg.ServerConfig);
????????????????????server.AddDeviceCompleted+=server_AddDeviceCompleted;
????????????????????server.DeleteDeviceCompleted+=server_DeleteDeviceCompleted;
????????????????????server.Start();
????????????????????_serverFactory.AddServer(server);
?
????????????????????foreach?(Config.DevicedevCfg?in?serverCfg.Devices)
????????????????????{
????????????????????????try
????????????????????????{
????????????????????????????IRunDevicerunDev=builder.BuildUp(devCfg.AssemblyFile,devCfg.Instance);
?
????????????????????????????runDev.DeviceParameter.DeviceID=devCfg.DeviceID;
????????????????????????????runDev.DeviceDynamic.DeviceID=devCfg.DeviceID;
????????????????????????????runDev.CommunicateType=devCfg.CommunicateType;
????????????????????????????runDev.Initialize(devCfg.DeviceID);
?
????????????????????????????if?(server.AddDevice(runDev)!=devCfg.DeviceID)
????????????????????????????{
????????????????????????????????Console.WriteLine("增加设备:"?+devCfg.DeviceID+?"失败!");
????????????????????????????}
????????????????????????}
????????????????????????catch?(Exceptionex)
????????????????????????{
????????????????????????????Console.WriteLine(ex.Message);
????????????????????????????continue;
????????????????????????}
????????????????????}
????????????????}
????????????}
????????????catch?(Exceptionex)
????????????{
????????????????success=?false;
????????????????Console.WriteLine(ex.Message);
????????????}
?
????????????if?(success)
????????????{
????????????????Console.WriteLine("初始化服务程序完成");
????????????}
?
????????????while?("exit"?==Console.ReadLine())
????????????{
????????????????_serverFactory.RemoveAllServer();
????????????????break;
????????????}
????????}
?
????????private?static?bool?HandlerRoutine(int?ctrlType)
????????{
????????????if?(ctrlType==0||ctrlType==2)
????????????{
????????????????_serverFactory.RemoveAllServer(www.hunanwang.net);
????????????}
????????????return?false;
????????}
} ?四、增加配置工具(ServerSuperIO.Tool)
1.增加服务,如下图:
?
2.增加设备,如下图:
?
3.单击树型菜单,修改配置属性。
|
|