diff --git a/projects/IoT/IoTServices/FBeeService/Application/Domain/Entities/RequestType.cs b/projects/IoT/IoTServices/FBeeService/Application/Domain/Entities/RequestType.cs index 2c5ea8d1..d3eb44e5 100644 --- a/projects/IoT/IoTServices/FBeeService/Application/Domain/Entities/RequestType.cs +++ b/projects/IoT/IoTServices/FBeeService/Application/Domain/Entities/RequestType.cs @@ -9,6 +9,11 @@ public const int x82 = 0x82; public const int x83 = 0x83; public const int x84 = 0x84; + public const int x85 = 0x85; + public const int x86 = 0x86; + public const int x87 = 0x87; + public const int x88 = 0x88; + public const int xa9 = 0xa9; public const int xc1 = 0xc1; public const int xa7 = 0xa7; public const int xa8 = 0xa8; diff --git a/projects/IoT/IoTServices/FBeeService/Infrastructure/DeviceService.cs b/projects/IoT/IoTServices/FBeeService/Infrastructure/DeviceService.cs index 9ca97b21..02633358 100644 --- a/projects/IoT/IoTServices/FBeeService/Infrastructure/DeviceService.cs +++ b/projects/IoT/IoTServices/FBeeService/Infrastructure/DeviceService.cs @@ -99,6 +99,7 @@ namespace FBeeService /// private void X01(string sn, byte[] data) { + var create = false; try { using (var ms = new MemoryStream(data)) @@ -118,6 +119,7 @@ namespace FBeeService var device = deviceRepo.Table().FirstOrDefault(o => o.Sn == sn && o.Address == address); if (device == null) { + create = true; device = new FBeeDevice { Sn = sn, @@ -162,6 +164,10 @@ namespace FBeeService device.Data = ms.ReadHexString(4); device.RawValue = BitConverter.ToString(data); deviceRepo.SaveChanges(); + if (create) + { + this.UpdateStatus(device); + } } else { @@ -176,6 +182,24 @@ namespace FBeeService } } + private void UpdateStatus(FBeeDevice device) + { + var deviceId = device.DeviceId; + var sn = device.Sn; + var ieee = device.IEEE; + if (new int[] { 0x0002, 0x0009, 0x0081, 0x0202, 0x0220, 0x0051 }.Contains(deviceId)) + { + this.X85(sn, ieee); + } + if (deviceId == 0x0220) + { + this.X86(sn, ieee); + this.X87(sn, ieee); + this.X88(sn, ieee); + this.XA9(sn, ieee); + } + } + /// /// 0x95删除指定设备 /// @@ -187,7 +211,7 @@ namespace FBeeService var list = new List(); list.AddRange(ieee.HexToBytes()); list.Add(0x01); - this.Write(sn, RequestType.x95, ieee, list); + this.Write(sn, RequestType.x95, ieee, list, 0); } //0x94更改指定设备名 @@ -205,7 +229,7 @@ namespace FBeeService } /// - /// 0x07接收指定设备的开关状态 + /// 0x85-0x07接收指定设备的开关状态 /// /// /// @@ -321,7 +345,7 @@ namespace FBeeService } /// - /// 0x09接收指定设备的色调返回值 + /// 0x09接收指定设备的饱和度返回值 /// /// /// @@ -350,12 +374,42 @@ namespace FBeeService } } - //0x84 - //0x85 + /// + /// 0x85-0x07查询开关状态 + /// + public void X85(string sn, string ieee) + { + var list = new List(); + this.Write(sn, RequestType.x85, ieee, list); + } + + /// + /// 0x86-0x08查询亮度状态 + /// + public void X86(string sn, string ieee) + { + var list = new List(); + this.Write(sn, RequestType.x86, ieee, list); + } + + /// + /// 0x87-0x09查询色度状态 + /// + public void X87(string sn, string ieee) + { + var list = new List(); + this.Write(sn, RequestType.x87, ieee, list); + } + + /// + /// 0x88-0x0a查询饱和度状态 + /// + public void X88(string sn, string ieee) + { + var list = new List(); + this.Write(sn, RequestType.x88, ieee, list); + } - //0x86 - //0x87 - //0x88 //0x8d //0x96 //0x8e @@ -467,21 +521,55 @@ namespace FBeeService } } + /// + /// 0080查询红外版本号 + /// + /// + /// public void XA70080(string sn, string ieee) { var list = new List(); - list.Add(0x03); - list.Add(0xff); - list.Add(0x00); + list.Add(0x03);//控制标志 + list.Add(0xff);//包长 + list.Add(0x00);//包序号 list.AddRange(new byte[] { 0x55, 0x55 }); list.Add(0x02); list.AddRange(new byte[] { 0x80, 0x00 }); list.Add(0x82); list[1] = (byte)(list.Count() - 3); - this.Write(sn, RequestType.xa7, ieee, list, 1); + this.Write(sn, RequestType.xa7, ieee, list, 2); + } + + /// + /// 0081开始匹配遥控器 + /// + /// + /// + public void XA70081(string sn, string ieee, string version, [Range(1, 5)]byte type) + { + var list = new List(); + list.Add(0x03);//控制标志 + list.Add(0xff);//包长 + list.Add(0x00);//包序号 + list.AddRange(new byte[] { 0x55, 0x55 }); + list.Add(0x09); + //list.AddRange(6); + list.AddRange(new byte[] { 0x81, 0x00 }); + list.Add(type); + list[1] = (byte)(list.Count() - 3 + 1); + list.Add((byte)list.Skip(3).Take(12).Select(o => (int)o).Sum()); + this.Write(sn, RequestType.xa7, ieee, list, 2); + } + + /// + /// 0xa9-0x27查询色温状态 + /// + public void XA9(string sn, string ieee) + { + var list = new List(); + this.Write(sn, RequestType.xa9, ieee, list); } - //0xa9 //0xab ///// ///// 0xa7查询红外数据 @@ -853,20 +941,27 @@ namespace FBeeService } } - private void Write(string sn, byte commandType, string ieee = null, List command = null, int format = 0, byte addressType = 0x02) + private void Write(string sn, byte commandType, string ieee = null, List command = null, int format = 1, byte addressType = 0x02) { this.Clients.TryGetValue(sn, out TcpClientWrapper client); var data = new List(); data.AddRange(sn.HexToBytes().Reverse());//sn号 data.Add(RequestType.xfe);//控制标志 data.Add(commandType);//控制类型 - if (command != null && command.Count > 0) + if (command != null) { using (var scope = _applicationServices.CreateScope()) { var repo = scope.ServiceProvider.GetService>(); var device = repo.ReadOnlyTable().FirstOrDefault(o => o.Sn == sn && o.IEEE == ieee); if (format == 0) + { + data.Add((byte)(command.Count() + 1 + 2));//数据总长 + data.Add(addressType);//地址模式 + data.AddRange(device.Address.HexToBytes().Reverse()); + data.AddRange(command); + } + else if (format == 1) { data.Add((byte)(command.Count() + 1 + 2 + 6 + 1 + 2));//数据总长 data.Add(addressType);//地址模式 @@ -876,7 +971,7 @@ namespace FBeeService data.AddRange(new byte[] { 0x00, 0x00 }); data.AddRange(command); } - else if (format == 1) + else if (format == 2) { data.Add((byte)(command.Count() + 2 + 1));//数据总长 data.AddRange(device.Address.HexToBytes().Reverse());