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("无效的组地址。"); } } /// /// 创建一个组地址 /// /// 字符串格式的组地址,如:1.2.3 public GroupAddress(string groupAddress) { this.groupAddress = Parse(groupAddress).GetBytes(); } /// /// 获取组地址的字节表示 /// /// 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)); } } /// /// 创建一个设备地址 /// /// 字符串格式的设备地址 public DeviceAddress(string deviceAddress) { this.deviceAddress = Parse(deviceAddress).GetBytes(); } /// /// 获取设备地址的字节表示 /// /// 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); } } }