using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; #region << 版 本 注 释 >> /*-------------------------------------------------------------------- * 版权所有 (c) 2024 WenJY 保留所有权利。 * CLR版本:4.0.30319.42000 * 机器名称:T14-GEN3-7895 * 命名空间:ConsoleApp * 唯一标识:988d1fd9-7907-40bb-9147-51a2c953d9f8 * * 创建者:WenJY * 电子邮箱: * 创建时间:2024-05-22 11:19:23 * 版本:V1.0.0 * 描述: * *-------------------------------------------------------------------- * 修改人: * 时间: * 修改说明: * * 版本:V1.0.0 *--------------------------------------------------------------------*/ #endregion << 版 本 注 释 >> namespace ConsoleApp { public class HidUtils { #region parameter Define HIDInterface hid = new HIDInterface(); struct connectStatusStruct { public bool preStatus; public bool curStatus; } connectStatusStruct connectStatus = new connectStatusStruct(); /// /// 推送连接状态信息 /// /// public delegate void PushConnectedDelegate(bool isConnected); public PushConnectedDelegate pushConnectedDelegateEvent; /// /// 推送接收数据信息 /// /// /// public delegate void PushReceiveDataDele(byte[] datas,string str); public PushReceiveDataDele pushReceiveDataEvent; /// /// 推送设备状态修改 /// /// public delegate void PushDeviceStatusDelegate(bool isFlag); public PushDeviceStatusDelegate pushDeviceStatusDelegateEvent; /// /// ReadBlock /// /// public delegate void PushReadBlockDelegate(TagBlock tagBlock); public PushReadBlockDelegate pushReadBlockDelegateEvent; #endregion public void Initial() { hid.StatusConnected = StatusConnected; hid.DataReceived = DataReceived; HIDInterface.HidDevice hidDevice = new HIDInterface.HidDevice(); hidDevice.vID = (ushort)1285; hidDevice.pID = (ushort)20560; hidDevice.serial = ""; hid.AutoConnect(hidDevice); } public void Close() { hid.StopAutoConnect(); } public bool SendBytes(byte[] data) { return hid.Send(data); } public void StartScan() { byte[] array = new byte[12] { 12, 87, 89, 8, 0, 0, 255, 255, 1, 0, 210, 15 }; ushort value = CalculateCRC(array); byte[] bytes = BitConverter.GetBytes(value); array[array.Length - 2] = bytes[0]; array[array.Length - 1] = bytes[1]; SendBytes(array); } public void StopScan() { byte[] array = new byte[12] { 12, 87, 89, 8, 0, 0, 255, 255, 0, 0, 210, 15 }; ushort value = CalculateCRC(array); byte[] bytes = BitConverter.GetBytes(value); array[array.Length - 2] = bytes[0]; array[array.Length - 1] = bytes[1]; SendBytes(array); } public void ReadBlockData(string BlockAddr, string BlockNum) { byte[] data = Get_Order(0, 0, 16, 0, 36, new byte[10] { 112, 105, 180, 242, 80, 1, 4, 224, Convert.ToByte(BlockAddr, 16), Convert.ToByte(BlockNum, 16) }); SendBytes(data); } public void WriteBlock(string BlockAddr, string BlockNum, List BlockList) { int num = int.Parse(BlockNum); if (num / 2 > BlockList.Count) { Console.WriteLine( "输入数据有误!"); return; } int num2 = 10 + num * 2; byte[] array = new byte[num2]; int num3 = 0; array[num3++] = 138; array[num3++] = 138; array[num3++] = 186; array[num3++] = 242; array[num3++] = 80; array[num3++] = 1; array[num3++] = 4; array[num3++] = 224; array[num3++] = Convert.ToByte(BlockAddr, 16); array[num3++] = Convert.ToByte(BlockNum, 16); if (num % 2 != 0) { num++; } for (int i = 0; i < num / 2; i++) { string text = BlockList[i]; if (text.Length != 8 && text.Length != 4) { Console.WriteLine("长度不符合!"); return; } foreach (char c in text) { if ((c < '0' || c > '9') && (c < 'a' || c > 'f') && (c < 'A' || c > 'F')) { Console.WriteLine("数据含有不合法字符!"); return; } } for (int k = 0; k < text.Length / 2; k++) { array[num3++] = Convert.ToByte(text.Substring(k * 2, 2), 16); } } byte[] data = Get_Order(0, 0, 1, 0, 37, array); SendBytes(data); } public void DataReceived(object sender, byte[] bytes) { if (bytes[7] == 31 && (bytes[8] == 0 || bytes[8] == 1)) //修改设备返回信息 { bool isFlag = false; if (bytes[10] == 1 && bytes[11] == 1) { isFlag = false; } else { isFlag = true; } if (pushDeviceStatusDelegateEvent != null) pushDeviceStatusDelegateEvent(isFlag); } if (bytes[7] == 31 && bytes[8] == 36) { TagBlock tagBlock = new TagBlock(); tagBlock.Block = new List(); int num = 0; int num2 = 0; string text = ""; if (bytes[bytes.Length - 3] == 1 && bytes[bytes.Length - 4] == 1) { tagBlock.State = false; return; } for (int i = 10; i < bytes.Length - 4; i++) { text += bytes[i].ToString("X2"); num2++; if (num2 == 4) { tagBlock.Block.Add(text); num++; num2 = 0; text = ""; } } if (text.Length > 0) { tagBlock.Block.Add(text); num++; num2 = 0; text = ""; } if (pushReadBlockDelegateEvent != null) pushReadBlockDelegateEvent(tagBlock); } if (bytes[7] == 31 && bytes[8] == 37) //写入结果 { bool isFlag = false; if (bytes[10] == 1 && bytes[11] == 1) { isFlag = false; } else { isFlag = true; } } if (bytes[7] == 31 && bytes[8] == 17) { string str = ""; for (int index = 10; index <= bytes.Length - 6; ++index) { str += bytes[index].ToString("X2"); if (index != bytes.Length - 6) str += " "; } if (pushReceiveDataEvent != null) pushReceiveDataEvent(bytes, str); } } public void StatusConnected(object sender, bool isConnect) { connectStatus.curStatus = isConnect; if (connectStatus.curStatus == connectStatus.preStatus) //connect return; connectStatus.preStatus = connectStatus.curStatus; if (connectStatus.curStatus) { Console.WriteLine("连接成功"); } else { Console.WriteLine("无法连接"); } if (pushConnectedDelegateEvent != null) pushConnectedDelegateEvent(connectStatus.curStatus); } private byte[] Get_Order(byte Source_Address_0, byte Source_Address_1, byte Destination_Address_0, byte Destination_Address_1, byte Type, byte[] data) { int num = 12 + data.Length; byte[] array = new byte[num]; int num2 = 0; array[num2++] = (byte)num; array[num2++] = 87; array[num2++] = 89; array[num2++] = (byte)(num - 4); array[num2++] = Source_Address_0; array[num2++] = Source_Address_1; array[num2++] = Destination_Address_0; array[num2++] = Destination_Address_1; array[num2++] = Type; array[num2++] = 0; for (int i = 0; i < data.Length; i++) { array[num2++] = data[i]; } ushort value = CalculateCRC(array); byte[] bytes = BitConverter.GetBytes(value); array[num2++] = bytes[0]; array[num2++] = bytes[1]; return array; } private ushort CalculateCRC(byte[] data) { ushort num1 = ushort.MaxValue; foreach (byte num2 in data) { num1 ^= (ushort)num2; for (int index = 0; index < 8; ++index) { if (((int)num1 & 1) == 1) num1 = (ushort)((int)num1 >> 1 ^ 33800); else num1 >>= 1; } } return num1; } } }