设备连接稳定性

This commit is contained in:
lishuo 2022-06-08 13:05:56 +08:00
parent 383fed4966
commit 02d2dcdbf7
5 changed files with 47 additions and 10 deletions

View File

@ -24,6 +24,7 @@ public class BluetoothDeviceScript : MonoBehaviour
public Action<string, byte[]> PeripheralReceivedWriteDataAction; public Action<string, byte[]> PeripheralReceivedWriteDataAction;
public Action<string> ConnectedPeripheralAction; public Action<string> ConnectedPeripheralAction;
public Action<string> ConnectedDisconnectPeripheralAction { get; set; } public Action<string> ConnectedDisconnectPeripheralAction { get; set; }
public Action<string,string> ConnectErrorAction { get; set; }
public Action<string> DisconnectedPeripheralAction; public Action<string> DisconnectedPeripheralAction;
public Action<string> DeviceBleStatusDisconnectedAction; public Action<string> DeviceBleStatusDisconnectedAction;
public Action<string, string> DiscoveredServiceAction; public Action<string, string> DiscoveredServiceAction;
@ -53,10 +54,11 @@ public class BluetoothDeviceScript : MonoBehaviour
void Update () void Update ()
{ {
} }
const string connectionError = "ConnectionError";
const string deviceInitializedString = "Initialized"; const string deviceInitializedString = "Initialized";
const string deviceDeInitializedString = "DeInitialized"; const string deviceDeInitializedString = "DeInitialized";
const string deviceErrorString = "Error"; const string deviceErrorString = "Error";
const string deviceConnectErrorString = "ConnectionError";
const string deviceServiceAdded = "ServiceAdded"; const string deviceServiceAdded = "ServiceAdded";
const string deviceStartedAdvertising = "StartedAdvertising"; const string deviceStartedAdvertising = "StartedAdvertising";
const string deviceStoppedAdvertising = "StoppedAdvertising"; const string deviceStoppedAdvertising = "StoppedAdvertising";
@ -77,6 +79,7 @@ public class BluetoothDeviceScript : MonoBehaviour
public void OnBluetoothMessage (string message) public void OnBluetoothMessage (string message)
{ {
Debug.Log(message);
if (message != null) if (message != null)
{ {
char[] delim = new char[] { '~' }; char[] delim = new char[] { '~' };
@ -242,6 +245,10 @@ public class BluetoothDeviceScript : MonoBehaviour
DisconnectedPeripheralAction(parts[1]); DisconnectedPeripheralAction(parts[1]);
} }
} }
else if (message.Length > connectionError.Length && message.Substring(0,connectionError.Length) == connectionError){
if (ConnectErrorAction != null)
ConnectErrorAction(parts[1], parts[2]);
}
else if (message.Length >= deviceDiscoveredService.Length && message.Substring (0, deviceDiscoveredService.Length) == deviceDiscoveredService) else if (message.Length >= deviceDiscoveredService.Length && message.Substring (0, deviceDiscoveredService.Length) == deviceDiscoveredService)
{ {
if (parts.Length >= 3 && DiscoveredServiceAction != null) if (parts.Length >= 3 && DiscoveredServiceAction != null)

View File

@ -604,7 +604,7 @@ public class BluetoothLEHardwareInterface
#endif #endif
} }
public static void ConnectToPeripheral (string name, Action<string> connectAction, Action<string, string> serviceAction, Action<string, string, string> characteristicAction, Action<string> disconnectAction = null) public static void ConnectToPeripheral (string name, Action<string> connectAction, Action<string, string> serviceAction, Action<string, string, string> characteristicAction, Action<string> disconnectAction = null, Action<string,string> errorAction = null)
{ {
#if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR #if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR
@ -618,6 +618,7 @@ public class BluetoothLEHardwareInterface
bluetoothDeviceScript.DiscoveredCharacteristicAction = characteristicAction; bluetoothDeviceScript.DiscoveredCharacteristicAction = characteristicAction;
bluetoothDeviceScript.ConnectedDisconnectPeripheralAction = disconnectAction; bluetoothDeviceScript.ConnectedDisconnectPeripheralAction = disconnectAction;
bluetoothDeviceScript.DeviceBleStatusDisconnectedAction = disconnectAction; bluetoothDeviceScript.DeviceBleStatusDisconnectedAction = disconnectAction;
bluetoothDeviceScript.ConnectErrorAction = errorAction;
} }
#if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX) #if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX)

View File

@ -106,6 +106,7 @@ namespace Assets.Scripts.Devices.Ble
if (response.Error != null) if (response.Error != null)
{ {
this.State = DeviceState.Disconnected;
if (response.Error.Code == WclBleErrors.WCL_E_BLUETOOTH_LE_DEVICE_NOT_FOUND) if (response.Error.Code == WclBleErrors.WCL_E_BLUETOOTH_LE_DEVICE_NOT_FOUND)
{ {
Debug.Log("未找到设备"); Debug.Log("未找到设备");

View File

@ -9,6 +9,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Timers;
using UnityEngine; using UnityEngine;
namespace Assets.Scripts.Ble namespace Assets.Scripts.Ble
@ -210,30 +211,41 @@ namespace Assets.Scripts.Ble
List<BleServiceInfo> servicelist = new List<BleServiceInfo>(); List<BleServiceInfo> servicelist = new List<BleServiceInfo>();
List<BleCharacteristicInfo> characteristilist = new List<BleCharacteristicInfo>(); List<BleCharacteristicInfo> characteristilist = new List<BleCharacteristicInfo>();
public void ConnectPeripheral(BlePeripheralInfo info, Action<IBleWinHwInterface, BlePeripheralInfo, BleResponse> callback) public void ConnectPeripheral(BlePeripheralInfo info, Action<IBleWinHwInterface, BlePeripheralInfo, BleResponse> callback)
{ {
if (!this.callbacks.ContainsKey(info)) var exsit = this.callbacks.Where(c => c.Key.Address == info.Address).Any();
if (!exsit)
{ {
this.callbacks.Add(info, callback); this.callbacks.Add(info, callback);
} }
else
{
var obj = this.callbacks.Where(c => c.Key.Address == info.Address).FirstOrDefault();
this.callbacks.Remove(obj.Key);
this.callbacks.Add(info, callback);
}
Debug.Log("try connect device" + info.Name + this.callbacks.Count.ToString()); Debug.Log("try connect device" + info.Name + this.callbacks.Count.ToString());
var self = this;
if (this.callbacks.Count == 1) if (this.callbacks.Count == 1)
{ {
BleResponse s = new BleResponse();
s.IsSuccess = true;
s.Error = null;
var self = this;
BluetoothLEHardwareInterface.ConnectToPeripheral(info.Address, (address) => BluetoothLEHardwareInterface.ConnectToPeripheral(info.Address, (address) =>
{ {
BleResponse s = new BleResponse
{
IsSuccess = true,
Error = null
};
callback?.Invoke(self, info, s); callback?.Invoke(self, info, s);
this.callbacks.Remove(info); this.callbacks.Remove(info);
Debug.Log("连接成功!"+info.Name); Debug.Log("连接成功!" + info.Name);
if (this.callbacks.Any()) if (this.callbacks.Any())
{ {
this.ConnectPeripheral(this.callbacks.First().Key, this.callbacks.First().Value); this.ConnectPeripheral(this.callbacks.First().Key, this.callbacks.First().Value);
} }
}, (address, service) => }, (address, service) =>
{ {
Debug.Log("发现服务");
ServicesDiscovered(address, service); ServicesDiscovered(address, service);
}, (address, service, characteristic) => }, (address, service, characteristic) =>
{ {
@ -242,9 +254,25 @@ namespace Assets.Scripts.Ble
{ {
Debug.Log("disconnect device:" + address); Debug.Log("disconnect device:" + address);
PeripheralDisconnected(address, info); PeripheralDisconnected(address, info);
}); },
(address, error) =>
{
BleResponse s = new BleResponse
{
IsSuccess = false,
Error = new BleHwInterfaceError(error)
};
callback?.Invoke(self, info, s);
this.callbacks.Remove(info);
if (this.callbacks.Any())
{
this.ConnectPeripheral(this.callbacks.First().Key, this.callbacks.First().Value);
}
}
);
} }
} }
#region #region
//服务发现 //服务发现
private void ServicesDiscovered(string address, string service) private void ServicesDiscovered(string address, string service)
@ -305,7 +333,7 @@ namespace Assets.Scripts.Ble
} }
var characteristicsDiscoveredCallback = characteristicsDiscoveredCallbacks.Where(c => c.Key.MatchAddress(address)); var characteristicsDiscoveredCallback = characteristicsDiscoveredCallbacks.Where(c => c.Key.MatchAddress(address));
if (serviceCallback.Any()) if (characteristicsDiscoveredCallback.Any())
{ {
characteristicsDiscoveredCallbacks.Remove(characteristicsDiscoveredCallback.First().Key); characteristicsDiscoveredCallbacks.Remove(characteristicsDiscoveredCallback.First().Key);
} }