You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

357 lines
10 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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();
/// <summary>
/// 推送连接状态信息
/// </summary>
/// <param name="isConnected"></param>
public delegate void PushConnectedDelegate(bool isConnected);
public PushConnectedDelegate pushConnectedDelegateEvent;
/// <summary>
/// 推送接收数据信息
/// </summary>
/// <param name="datas"></param>
/// <param name="str"></param>
public delegate void PushReceiveDataDele(byte[] datas,string str);
public PushReceiveDataDele pushReceiveDataEvent;
/// <summary>
/// 推送设备状态修改
/// </summary>
/// <param name="isFlag"></param>
public delegate void PushDeviceStatusDelegate(bool isFlag);
public PushDeviceStatusDelegate pushDeviceStatusDelegateEvent;
/// <summary>
/// ReadBlock
/// </summary>
/// <param name="isConnected"></param>
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<string> 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<string>();
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;
}
}
}