You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
862 lines
23 KiB
862 lines
23 KiB
|
1 month ago
|
using System;
|
||
|
|
using System.Collections.Concurrent;
|
||
|
|
using System.Collections.Generic;
|
||
|
|
using System.Linq;
|
||
|
|
using System.Text;
|
||
|
|
using UnityEngine;
|
||
|
|
using static Pc2McuProto;
|
||
|
|
|
||
|
|
public static class UDE_API
|
||
|
|
{
|
||
|
|
private const string package_name = "cn.wch.ch9140lib";
|
||
|
|
|
||
|
|
static AndroidJavaClass UnityPlayer;
|
||
|
|
static AndroidJavaObject CurrentActivity;
|
||
|
|
static AndroidJavaObject App;
|
||
|
|
static AndroidJavaClass CH9140BluetoothManager;
|
||
|
|
static AndroidJavaObject ManagerInstance;
|
||
|
|
|
||
|
|
static ConcurrentDictionary<string, string> DeviceMacDir; //线程保护的字典,key是蓝牙名,value是mac地址
|
||
|
|
|
||
|
|
static ConcurrentDictionary<string, UDE_Device> DeviceDir;
|
||
|
|
|
||
|
|
private static bool isSearchVaild = true; //是否准许搜索设备
|
||
|
|
|
||
|
|
static ConcurrentDictionary<string, bool> DeviceConnectState;
|
||
|
|
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 初始化
|
||
|
|
/// </summary>
|
||
|
|
public static void UDE_Init()
|
||
|
|
{
|
||
|
|
DeviceConnectState = new ConcurrentDictionary<string, bool>();
|
||
|
|
DeviceMacDir = new ConcurrentDictionary<string, string>();
|
||
|
|
DeviceDir = new ConcurrentDictionary<string, UDE_Device>();
|
||
|
|
|
||
|
|
// UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
|
||
|
|
// CurrentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
|
||
|
|
// App = CurrentActivity.Call<AndroidJavaObject>("getApplication");
|
||
|
|
//
|
||
|
|
// CH9140BluetoothManager = new AndroidJavaClass(package_name + ".CH9140BluetoothManager");
|
||
|
|
// ManagerInstance = CH9140BluetoothManager.CallStatic<AndroidJavaObject>("getInstance");
|
||
|
|
//
|
||
|
|
// ManagerInstance.Call("init", App);
|
||
|
|
BluetoothLEHardwareInterface.Initialize(true, false, () => { },
|
||
|
|
(error) => { Debug.LogError($"UDE Init Faild ,{error}"); });
|
||
|
|
//registerSerialModemNotify();
|
||
|
|
Debug.Log("UDE:" + "Init Success!!");
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 启动搜索设备
|
||
|
|
/// </summary>
|
||
|
|
public static void StartEnumDevices()
|
||
|
|
{
|
||
|
|
DeviceDir.Clear();
|
||
|
|
BluetoothLEHardwareInterface.ScanForPeripheralsWithServices(null, (address, name) =>
|
||
|
|
{
|
||
|
|
if (name.Contains("UDST"))
|
||
|
|
{
|
||
|
|
Debug.Log("UDE:" + $"Enum Result {name}");
|
||
|
|
|
||
|
|
if (string.IsNullOrEmpty(address))
|
||
|
|
{
|
||
|
|
Debug.Log("UDE:" + "Device is Invalid!!");
|
||
|
|
//LogUtil.d("该设备不是合法设备");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
RegisterDevice(name, address);
|
||
|
|
}
|
||
|
|
}, null);
|
||
|
|
// EnumResult enumResult = new EnumResult();//创建一个回调对象
|
||
|
|
// Debug.Log("UDE:" + "Start Enum Devices!!");
|
||
|
|
// ManagerInstance.Call("startEnumDevices", enumResult);
|
||
|
|
// Debug.Log("UDE:" + "Start Enum Devices Success!!");
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 停止搜索设备
|
||
|
|
/// </summary>
|
||
|
|
public static void StopEnumDevices()
|
||
|
|
{
|
||
|
|
BluetoothLEHardwareInterface.StopScan();
|
||
|
|
Debug.Log("UDE:" + "Stop Enum Deivces!!");
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 注册设备
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="name">设备名</param>
|
||
|
|
/// <param name="mac">地址</param>
|
||
|
|
private static void RegisterDevice(string name, string mac)
|
||
|
|
{
|
||
|
|
if (DeviceMacDir.ContainsKey(name))
|
||
|
|
{
|
||
|
|
DeviceMacDir[name] = mac;
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
DeviceMacDir.TryAdd(name, mac);
|
||
|
|
UDE_Device device = new UDE_Device();
|
||
|
|
DeviceDir.TryAdd(mac, device);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 取消注册设备
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="name">需要取消的设备名</param>
|
||
|
|
/// <returns></returns>
|
||
|
|
public static bool UnRegisterDevice(string name)
|
||
|
|
{
|
||
|
|
string mac = DeviceMacDir[name];
|
||
|
|
bool result = DeviceDir.TryRemove(mac, out UDE_Device _);
|
||
|
|
result &= DeviceMacDir.TryRemove(name, out string _);
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 获取设备名的集合
|
||
|
|
/// </summary>
|
||
|
|
/// <returns></returns>
|
||
|
|
public static List<string> GetDeviceList()
|
||
|
|
{
|
||
|
|
return DeviceMacDir.Keys.ToList();
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 按照名字开启设备
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="name"></param>
|
||
|
|
public static bool OpenDeviceByName(string name, Action<string, bool> action = null)
|
||
|
|
{
|
||
|
|
if (!DeviceMacDir.ContainsKey(name))
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
string mac = DeviceMacDir[name];
|
||
|
|
|
||
|
|
DeviceDir[mac].OpenDevice(mac, action);
|
||
|
|
SetConnectByMac(mac, false);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 按照名字关闭设备
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="name"></param>
|
||
|
|
public static bool CloseDeviceByName(string name)
|
||
|
|
{
|
||
|
|
if (!DeviceMacDir.ContainsKey(name))
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
string mac = DeviceMacDir[name];
|
||
|
|
DeviceDir[mac].CloseDevice(mac, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static string GetDeviceDataByName(string name)
|
||
|
|
{
|
||
|
|
if (DeviceMacDir == null || !DeviceMacDir.ContainsKey(name))
|
||
|
|
{
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
string mac = DeviceMacDir[name];
|
||
|
|
Debug.Log($"name :{name},mac:{mac}");
|
||
|
|
return DeviceDir[mac].GetDeviceData();
|
||
|
|
}
|
||
|
|
|
||
|
|
public static int GetDeviceBatteryByName(string name)
|
||
|
|
{
|
||
|
|
if (DeviceMacDir == null || !DeviceMacDir.ContainsKey(name))
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
string mac = DeviceMacDir[name];
|
||
|
|
Debug.Log($"name :{name},mac:{mac}");
|
||
|
|
return DeviceDir[mac].GetBatteryType();
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 开启接收蓝牙数据
|
||
|
|
/// </summary>
|
||
|
|
public static void Pc2Mcu_StartReceive(string name)
|
||
|
|
{
|
||
|
|
if (name == null)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!DeviceMacDir.ContainsKey(name))
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
string mac = DeviceMacDir[name];
|
||
|
|
|
||
|
|
DeviceDir[mac].Pc2Mcu_StartReceive(mac);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 停止接收蓝牙数据
|
||
|
|
/// </summary>
|
||
|
|
public static void Pc2Mcu_StopReceive(string name)
|
||
|
|
{
|
||
|
|
if (!DeviceMacDir.ContainsKey(name))
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
string mac = DeviceMacDir[name];
|
||
|
|
DeviceDir[mac].Pc2Mcu_StopReceive(mac);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
///
|
||
|
|
/// </summary>
|
||
|
|
public static void Pc2Mcu_StringData(string name)
|
||
|
|
{
|
||
|
|
if (!DeviceMacDir.ContainsKey(name))
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
string mac = DeviceMacDir[name];
|
||
|
|
DeviceDir[mac].Pc2Mcu_StringData(mac);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 发送振动反馈
|
||
|
|
/// </summary>
|
||
|
|
public static void Pc2Mcu_SendVibration(string name, byte address, byte time, byte stren)
|
||
|
|
{
|
||
|
|
if (!DeviceMacDir.ContainsKey(name))
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
string mac = DeviceMacDir[name];
|
||
|
|
DeviceDir[mac].Pc2Mcu_SendVibration(mac, address, time, stren);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 启动心跳
|
||
|
|
/// </summary>
|
||
|
|
public static void OnHeartBeat(string name)
|
||
|
|
{
|
||
|
|
if (name == null)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!DeviceMacDir.ContainsKey(name))
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
string mac = DeviceMacDir[name];
|
||
|
|
DeviceDir[mac].OnHeartBeat(mac);
|
||
|
|
Debug.Log($"[HeartBeat] in {DateTime.Now.ToString("G")}");
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 是否连接
|
||
|
|
/// </summary>
|
||
|
|
/// <returns></returns>
|
||
|
|
public static bool IsCon()
|
||
|
|
{
|
||
|
|
bool result = false;
|
||
|
|
|
||
|
|
foreach (var item in DeviceConnectState.Values)
|
||
|
|
{
|
||
|
|
//Debug.Log("---iscon---" + item.ToString() + "//" + item.Value.IsCon);
|
||
|
|
result |= item;
|
||
|
|
}
|
||
|
|
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMTU(string name, int mtu)
|
||
|
|
{
|
||
|
|
if (!DeviceMacDir.ContainsKey(name))
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
string mac = DeviceMacDir[name];
|
||
|
|
DeviceDir[mac].SetMtu(mac, mtu);
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetMTUByMac(string mac, int mtu)
|
||
|
|
{
|
||
|
|
if (!DeviceDir.ContainsKey(mac))
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
DeviceDir[mac].SetMtu(mac, mtu);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 获取最大传输单元
|
||
|
|
/// </summary>
|
||
|
|
/// <returns></returns>
|
||
|
|
public static int GetMTUByMac(string mac)
|
||
|
|
{
|
||
|
|
if (!DeviceDir.ContainsKey(mac))
|
||
|
|
{
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
|
||
|
|
return DeviceDir[mac].GetMTU(mac);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
public static bool SetSerialBaudByMac(string mac)
|
||
|
|
{
|
||
|
|
if (!DeviceMacDir.ContainsKey(mac))
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
return DeviceDir[mac].SetSerialBaud(mac);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 设置串行调制解调器
|
||
|
|
/// </summary>
|
||
|
|
/// <returns></returns>
|
||
|
|
public static bool SetSerialModemByMac(string mac)
|
||
|
|
{
|
||
|
|
if (!DeviceMacDir.ContainsKey(mac))
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
return DeviceDir[mac].SetSerialModem(mac);
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetSearchVaild(bool flag)
|
||
|
|
{
|
||
|
|
isSearchVaild = flag;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static bool IsSupportedFirmware()
|
||
|
|
{
|
||
|
|
return ManagerInstance.Call<bool>("isSupportedFirmware");
|
||
|
|
}
|
||
|
|
|
||
|
|
public static bool IsSearchVaild()
|
||
|
|
{
|
||
|
|
return isSearchVaild;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static bool CheckConnectByName(string Device_name)
|
||
|
|
{
|
||
|
|
if (Device_name == string.Empty || !DeviceMacDir.ContainsKey(Device_name))
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
string mac = DeviceMacDir[Device_name];
|
||
|
|
if (!DeviceDir.ContainsKey(mac))
|
||
|
|
{
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
return DeviceDir[mac].IsConnect;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void SetConnectByMac(string mac, bool connect)
|
||
|
|
{
|
||
|
|
DeviceConnectState[mac] = connect;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
public static int GetTransferFrequency(string name)
|
||
|
|
{
|
||
|
|
if (!DeviceMacDir.ContainsKey(name))
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
string mac = DeviceMacDir[name];
|
||
|
|
return DeviceDir[mac].Transfer_freq;
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 开启搜索的回调
|
||
|
|
/// </summary>
|
||
|
|
public class EnumResult : AndroidJavaProxy
|
||
|
|
{
|
||
|
|
public EnumResult() : base("cn.wch.ch9140lib.callback.EnumResult")
|
||
|
|
{
|
||
|
|
}
|
||
|
|
|
||
|
|
public void onResult(AndroidJavaObject device, int var2, byte[] var3)
|
||
|
|
{
|
||
|
|
Debug.Log("UDE:" + $"onResult!!");
|
||
|
|
|
||
|
|
string name = device.Call<string>("getName");
|
||
|
|
|
||
|
|
string mac = device.Call<string>("getAddress");
|
||
|
|
Debug.Log("UDE:" + $"Enum Result {name}");
|
||
|
|
|
||
|
|
if (string.IsNullOrEmpty(mac))
|
||
|
|
{
|
||
|
|
Debug.Log("UDE:" + "Device is Invalid!!");
|
||
|
|
//LogUtil.d("该设备不是合法设备");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
RegisterDevice(name, mac);
|
||
|
|
//UDE_API.StopEnumDevices();
|
||
|
|
//UDE_API.OpenDevice(mac);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public class UDE_Device
|
||
|
|
{
|
||
|
|
ConcurrentDictionary<string, string> DeviceDir; //线程保护的字典,key是蓝牙名,value是mac地址
|
||
|
|
|
||
|
|
private string data_s;
|
||
|
|
|
||
|
|
private readonly string serivce_uuid = "8653000a-43e6-47b7-9cb0-5fc21d4ae340";
|
||
|
|
private readonly string write_character_uuid = "8653000c-43e6-47b7-9cb0-5fc21d4ae340";
|
||
|
|
private readonly string read_character_uuid = "8653000b-43e6-47b7-9cb0-5fc21d4ae340";
|
||
|
|
|
||
|
|
|
||
|
|
int index = 0;
|
||
|
|
|
||
|
|
List<byte> one_buff = new List<byte>();
|
||
|
|
private int buff_len = int.MaxValue;
|
||
|
|
|
||
|
|
|
||
|
|
private int count = 0;
|
||
|
|
|
||
|
|
public int Transfer_freq;
|
||
|
|
|
||
|
|
private DateTime last_time;
|
||
|
|
public bool IsConnect = false;
|
||
|
|
public Action<string, bool> ConnectListener;
|
||
|
|
|
||
|
|
private int last_battery = 0;
|
||
|
|
|
||
|
|
private int _batteryType = 0;
|
||
|
|
|
||
|
|
public int BatteryType
|
||
|
|
{
|
||
|
|
get => _batteryType;
|
||
|
|
set
|
||
|
|
{
|
||
|
|
_batteryType = value;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 开启设备
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="mac">设备地址</param>
|
||
|
|
public void OpenDevice(string mac, Action<string, bool> action = null)
|
||
|
|
{
|
||
|
|
ConnectListener = action;
|
||
|
|
Debug.Log("UDE:" + $"Start Open Device {mac} !!");
|
||
|
|
BluetoothLEHardwareInterface.ConnectToPeripheral(mac, (address) => { }, null,
|
||
|
|
(address, service, characteristic) =>
|
||
|
|
{
|
||
|
|
Debug.Log("UDE:" + $"{address} Connect Success!!!");
|
||
|
|
IsConnect = true;
|
||
|
|
Pc2Mcu_StartReceive(mac);
|
||
|
|
ConnectListener?.Invoke(address, IsConnect);
|
||
|
|
});
|
||
|
|
UDE_API.SetSearchVaild(false);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 蓝牙读取数据解析
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="read_buff_list">蓝牙数据链表</param>
|
||
|
|
private void ReadBuffAnalysis(List<byte> read_buff_list)
|
||
|
|
{
|
||
|
|
|
||
|
|
byte[] read_buff = read_buff_list.ToArray();
|
||
|
|
StringBuilder msg = new StringBuilder();
|
||
|
|
Mcu2PcProto mcu2PcProto = new Mcu2PcProto();
|
||
|
|
mcu2PcProto.crc = read_buff[read_buff.Length - 1];
|
||
|
|
if (mcu2PcProto.crc != Pc2McuProto.check_num(read_buff, read_buff.Length))
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (read_buff[0] != 0xAA)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (read_buff[1] != 0x55)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
mcu2PcProto.Address = read_buff[2];
|
||
|
|
mcu2PcProto.CommandType = read_buff[3];
|
||
|
|
mcu2PcProto.DataType = read_buff[4];
|
||
|
|
mcu2PcProto.DataLength = read_buff[5];
|
||
|
|
byte[] decrypt_data = new byte[mcu2PcProto.DataLength];
|
||
|
|
Array.Copy(read_buff, 6, decrypt_data, 0, decrypt_data.Length);
|
||
|
|
|
||
|
|
decrypt(decrypt_data, (short)decrypt_data.Length);
|
||
|
|
|
||
|
|
if (mcu2PcProto.CommandType == CommandType.BATTERY_VOLTAGE_DATA)
|
||
|
|
{
|
||
|
|
short[] int16arry = new short[1];
|
||
|
|
ConvertByte2Int16Aarry(decrypt_data, 0, 1, out int16arry);
|
||
|
|
short battery = int16arry[0];
|
||
|
|
|
||
|
|
int battery_type;
|
||
|
|
if (battery <= 2180)
|
||
|
|
{
|
||
|
|
battery_type = 1;
|
||
|
|
}
|
||
|
|
else if (battery <= 2290)
|
||
|
|
{
|
||
|
|
battery_type = 2;
|
||
|
|
}
|
||
|
|
else if (battery <= 2350)
|
||
|
|
{
|
||
|
|
battery_type = 3;
|
||
|
|
}
|
||
|
|
else if (battery <= 2500)
|
||
|
|
{
|
||
|
|
battery_type = 4;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
battery_type = 5;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (battery_type > last_battery)
|
||
|
|
{
|
||
|
|
if (battery <= 2200)
|
||
|
|
{
|
||
|
|
battery_type = 1;
|
||
|
|
}
|
||
|
|
else if (battery <= 2310)
|
||
|
|
{
|
||
|
|
battery_type = 2;
|
||
|
|
}
|
||
|
|
else if (battery <= 2370)
|
||
|
|
{
|
||
|
|
battery_type = 3;
|
||
|
|
}
|
||
|
|
else if (battery <= 2520)
|
||
|
|
{
|
||
|
|
battery_type = 4;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
battery_type = 5;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
last_battery = battery_type;
|
||
|
|
_batteryType = battery_type;
|
||
|
|
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (mcu2PcProto.CommandType == CommandType.ADC_IMU_16)
|
||
|
|
{
|
||
|
|
|
||
|
|
ConvertByte2Int16Aarry(decrypt_data, 0, mcu2PcProto.DataLength / 2, out mcu2PcProto.AngleDatas);
|
||
|
|
|
||
|
|
for (int i = 0; i < mcu2PcProto.AngleDatas.Length; i++)
|
||
|
|
{
|
||
|
|
msg.Append(mcu2PcProto.AngleDatas[i]);
|
||
|
|
if (i != mcu2PcProto.AngleDatas.Length - 1)
|
||
|
|
{
|
||
|
|
msg.Append(",");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (last_time == null)
|
||
|
|
{
|
||
|
|
last_time = DateTime.Now;
|
||
|
|
}
|
||
|
|
data_s = msg.ToString();
|
||
|
|
count++;
|
||
|
|
if (DateTime.Now - last_time > TimeSpan.FromSeconds(1))
|
||
|
|
{
|
||
|
|
Transfer_freq = count;
|
||
|
|
count = 0;
|
||
|
|
last_time = DateTime.Now;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 解密算法 解密得原始数据
|
||
|
|
/// </summary>
|
||
|
|
void decrypt(byte[] arr, short len)
|
||
|
|
{
|
||
|
|
for (int i = 0; i < len; i++)
|
||
|
|
{
|
||
|
|
arr[i] ^= 0x01;
|
||
|
|
arr[i] ^= 0x80;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 将Byte类型数据转换为Ini类型数据
|
||
|
|
/// </summary>
|
||
|
|
public void ConvertByte2Int16Aarry(byte[] buff, int byte_index, int int_length, out short[] data)
|
||
|
|
{
|
||
|
|
data = new short[int_length];
|
||
|
|
for (int i = 0; i < int_length; i++)
|
||
|
|
{
|
||
|
|
Array.Reverse(buff, byte_index, 2);
|
||
|
|
data[i] = BitConverter.ToInt16(buff, byte_index);
|
||
|
|
byte_index += 2;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 关闭设备
|
||
|
|
/// </summary>
|
||
|
|
public void CloseDevice(string mac, bool force)
|
||
|
|
{
|
||
|
|
BluetoothLEHardwareInterface.DisconnectPeripheral(mac,
|
||
|
|
(address) => { Debug.Log("UDE:" + $"Close Device {address}");
|
||
|
|
IsConnect = false;
|
||
|
|
ConnectListener?.Invoke(address, IsConnect);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 设置传递数据的宽度
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="mtu"></param>
|
||
|
|
private void SetMTU(string mac, int mtu)
|
||
|
|
{
|
||
|
|
BluetoothLEHardwareInterface.RequestMtu(mac, mtu,
|
||
|
|
(address, mtu1) => { Debug.Log("UDE:" + $"Set MTU Success {mtu1}!!"); });
|
||
|
|
// ManagerInstance.Call("setMTU", mac,mtu, mtu_callback);
|
||
|
|
}
|
||
|
|
|
||
|
|
public void SetMtu(string mac, int mtu)
|
||
|
|
{
|
||
|
|
SetMTU(mac, mtu);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 获取最大传输单元
|
||
|
|
/// </summary>
|
||
|
|
/// <returns></returns>
|
||
|
|
public int GetMTU(string mac)
|
||
|
|
{
|
||
|
|
return 200;
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 发送给下位机的实际方法
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="data"></param>
|
||
|
|
/// <param name="length"></param>
|
||
|
|
/// <returns></returns>
|
||
|
|
private int Write(string mac, byte[] data, int length)
|
||
|
|
{
|
||
|
|
int len = 0;
|
||
|
|
BluetoothLEHardwareInterface.WriteCharacteristic(mac, serivce_uuid, write_character_uuid, data, length, true,
|
||
|
|
(address) =>
|
||
|
|
{
|
||
|
|
UDE_API.SetConnectByMac(address, true);
|
||
|
|
UDE_API.SetSearchVaild(true);
|
||
|
|
Debug.Log("<color=red>开启了蓝牙</color>:" + $"当前连接状态{true}");
|
||
|
|
SetMTU(address, 200);
|
||
|
|
|
||
|
|
Debug.Log("UDE:" + $"Write Success {mac} {address}!!");
|
||
|
|
BluetoothLEHardwareInterface.SubscribeCharacteristic(mac, serivce_uuid, read_character_uuid,
|
||
|
|
(characteristic) => { }, (characteristic, bytes) =>
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
for (int i = 0; i < bytes.Length; i++)
|
||
|
|
{
|
||
|
|
if (index == 0)
|
||
|
|
{
|
||
|
|
if (bytes[i] != 0xAA)
|
||
|
|
{
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (index == 1)
|
||
|
|
{
|
||
|
|
if (bytes[i] != 0x55)
|
||
|
|
{
|
||
|
|
one_buff.Clear();
|
||
|
|
index = 0;
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
one_buff.Add(bytes[i]);
|
||
|
|
|
||
|
|
if (index == 5)
|
||
|
|
{
|
||
|
|
buff_len = bytes[i];
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
if (index >= buff_len + 6 && buff_len != Int32.MaxValue)
|
||
|
|
{
|
||
|
|
ReadBuffAnalysis(one_buff);
|
||
|
|
one_buff.Clear();
|
||
|
|
index = 0;
|
||
|
|
buff_len = int.MaxValue;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
index++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
catch (Exception)
|
||
|
|
{
|
||
|
|
throw;
|
||
|
|
}
|
||
|
|
});
|
||
|
|
//mac = address;
|
||
|
|
});
|
||
|
|
//Debug.Log("UDE:" + $"Write Data Length {length}");
|
||
|
|
return len;
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 设置串行波特率
|
||
|
|
/// </summary>
|
||
|
|
/// <returns></returns>
|
||
|
|
public bool SetSerialBaud(string mac)
|
||
|
|
{
|
||
|
|
Debug.Log("UDE:" + " Set Serial Baud!!");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 设置串行调制解调器
|
||
|
|
/// </summary>
|
||
|
|
/// <returns></returns>
|
||
|
|
public bool SetSerialModem(string mac)
|
||
|
|
{
|
||
|
|
Debug.Log("UDE:" + "Set Serial Modem!!");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
private void registerSerialModemNotify()
|
||
|
|
{
|
||
|
|
//ModemStatus modemStatus = new ModemStatus();
|
||
|
|
//ManagerInstance.Call("registerSerialModemNotify", modemStatus);
|
||
|
|
Debug.Log("UDE:" + "registerSerialModemNotify Success!!");
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 获取解析出的数据字符串
|
||
|
|
/// </summary>
|
||
|
|
/// <returns></returns>
|
||
|
|
public string GetDeviceData()
|
||
|
|
{
|
||
|
|
return data_s;
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 获取电量
|
||
|
|
/// </summary>
|
||
|
|
/// <returns></returns>
|
||
|
|
public int GetBatteryType()
|
||
|
|
{
|
||
|
|
return BatteryType;
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 开启接收蓝牙数据
|
||
|
|
/// </summary>
|
||
|
|
public void Pc2Mcu_StartReceive(string mac)
|
||
|
|
{
|
||
|
|
SendMessage(mac, Pc2McuProto.HumanAddress.LeftPalm, Pc2McuProto.CommandType.ADC_IMU_16,
|
||
|
|
new byte[] { 0x02, 0x43, 0x56 });
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 停止接收蓝牙数据
|
||
|
|
/// </summary>
|
||
|
|
public void Pc2Mcu_StopReceive(string mac)
|
||
|
|
{
|
||
|
|
SendMessage(mac, Pc2McuProto.HumanAddress.LeftPalm, Pc2McuProto.CommandType.StopDataReceive,
|
||
|
|
new byte[] { 0x01 });
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 接收字符串数据
|
||
|
|
/// </summary>
|
||
|
|
public void Pc2Mcu_StringData(string mac)
|
||
|
|
{
|
||
|
|
SendMessage(mac, Pc2McuProto.HumanAddress.LeftPalm, 0xD0,
|
||
|
|
new byte[] { 0x01 });
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 发送振动反馈
|
||
|
|
/// </summary>
|
||
|
|
public void Pc2Mcu_SendVibration(string mac, byte address, byte time, byte stren)
|
||
|
|
{
|
||
|
|
SendMessage(mac, Pc2McuProto.HumanAddress.LeftPalm, Pc2McuProto.CommandType.SHAKE_CONTROLLER_COMMAND,
|
||
|
|
new byte[] { address, 0x00,time, stren });
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 启动心跳
|
||
|
|
/// </summary>
|
||
|
|
public void OnHeartBeat(string mac)
|
||
|
|
{
|
||
|
|
SendMessage(mac, Pc2McuProto.HumanAddress.LeftPalm, Pc2McuProto.CommandType.HeartBeat, new byte[] { 0x42 });
|
||
|
|
Debug.Log($"[HeartBeat] in {DateTime.Now.ToString("G")}");
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
private void SendMessage(string mac, byte humanAddress, byte commandType, byte[] data)
|
||
|
|
{
|
||
|
|
byte[] message = new byte[6 + data.Length];
|
||
|
|
message[0] = 0x55;
|
||
|
|
message[1] = 0xAA;
|
||
|
|
message[2] = humanAddress;
|
||
|
|
message[3] = commandType;
|
||
|
|
message[4] = (byte)data.Length;
|
||
|
|
for (int i = 0; i < data.Length; i++)
|
||
|
|
{
|
||
|
|
message[5 + i] = data[i];
|
||
|
|
}
|
||
|
|
|
||
|
|
byte crc = Pc2McuProto.check_num(message, message.Length);
|
||
|
|
int crc_index = message.Length - 1;
|
||
|
|
message[crc_index] = crc;
|
||
|
|
|
||
|
|
try
|
||
|
|
{
|
||
|
|
int result = Write(mac, message, message.Length);
|
||
|
|
Debug.Log($"UDE: Write Result---{mac} {message.Length}");
|
||
|
|
}
|
||
|
|
catch (Exception e)
|
||
|
|
{
|
||
|
|
Debug.LogError(e);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|