Files
Web_CRICS_Server_VS2010_Prod/RCUHost/Protocols/GroupAddress.cs

151 lines
3.9 KiB
C#
Raw Normal View History

2025-12-11 09:17:16 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
namespace RCUHost.Protocols
{
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct GroupAddress
{
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3)]
public readonly byte[] groupAddress;
public GroupAddress(byte[] groupAddress)
{
if (groupAddress != null && groupAddress.Length == 3)
{
this.groupAddress = groupAddress;
}
else
{
throw new ApplicationException("无效的组地址。");
}
}
/// <summary>
/// 创建一个组地址
/// </summary>
/// <param name="groupAddress">字符串格式的组地址1.2.3</param>
public GroupAddress(string groupAddress)
{
this.groupAddress = Parse(groupAddress).GetBytes();
}
/// <summary>
/// 获取组地址的字节表示
/// </summary>
/// <returns></returns>
public byte[] GetBytes()
{
return this.groupAddress;
}
public override string ToString()
{
return String.Join(".", groupAddress);
}
public static GroupAddress Parse(string s)
{
if (string.IsNullOrEmpty(s))
{
throw new ArgumentNullException("s");
}
byte[] arrGroupAddr = new byte[3] { 0, 0, 0 };
try
{
if (s.Count(r => r == '.') != 2)
{
throw new ApplicationException("组地址必须是以三段点分十进制组成。");
}
arrGroupAddr = s.Split('.').Select(r => Convert.ToByte(r)).ToArray();
}
catch (Exception ex)
{
throw new ApplicationException("无效的组地址(" + s + ")。", ex);
}
return new GroupAddress(arrGroupAddr);
}
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct DeviceAddress
{
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
public readonly byte[] deviceAddress;
public DeviceAddress(byte[] deviceAddress)
{
if (deviceAddress != null && deviceAddress.Length == 4)
{
this.deviceAddress = deviceAddress;
}
else
{
throw new ApplicationException("无效的设备地址:" + System.Text.Encoding.UTF8.GetString(deviceAddress));
}
}
/// <summary>
/// 创建一个设备地址
/// </summary>
/// <param name="deviceAddress">字符串格式的设备地址</param>
public DeviceAddress(string deviceAddress)
{
this.deviceAddress = Parse(deviceAddress).GetBytes();
}
/// <summary>
/// 获取设备地址的字节表示
/// </summary>
/// <returns></returns>
public byte[] GetBytes()
{
return this.deviceAddress;
}
public override string ToString()
{
//ushort type = BitConverter.ToUInt16(deviceAddress, 1);
//return String.Format("{0:000}{1:000}{2:000}", deviceAddress[0], type, deviceAddress[3]);
if (deviceAddress[0] == 0x00)//指令场景地址
{
return String.Format("{0}.{1}.{2}", deviceAddress[1], deviceAddress[2], deviceAddress[3]);
}
else
{
ushort type = BitConverter.ToUInt16(deviceAddress, 2);
return String.Format("{0:000}{1:000}{2:000}", deviceAddress[0], deviceAddress[1], type);
}
}
public static DeviceAddress Parse(string s)
{
if (string.IsNullOrEmpty(s))
{
throw new ArgumentNullException("s");
}
byte[] arrDeviceAddr = new byte[4] { 0, 0, 0, 0 };
try
{
arrDeviceAddr[0] = Convert.ToByte(s.Substring(0, 3));
arrDeviceAddr[1] = Convert.ToByte(s.Substring(3, 3));
byte[] modalType = BitConverter.GetBytes(Convert.ToUInt16(s.Substring(6, 3)));
arrDeviceAddr[2] = modalType[0];
arrDeviceAddr[3] = modalType[1];
}
catch (Exception ex)
{
throw new ApplicationException("无效的设备地址。", ex);
}
return new DeviceAddress(arrDeviceAddr);
}
}
}