using System;
using System.Collections.Generic;
namespace HDL_ON.Stan
{
#if __IOS__
///
/// IOS蓝牙的逻辑
///
public class HdlBluetoothLogic
{
#region ■ 变量声明___________________________
///
/// 安卓蓝牙的逻辑
///
private static HdlBluetoothLogic m_Current = null;
///
/// 安卓蓝牙的逻辑
///
public static HdlBluetoothLogic Current
{
get
{
if (m_Current == null)
{
m_Current = new HdlBluetoothLogic();
}
return m_Current;
}
}
///
/// 我也不知道这是什么东西
///
private HdlBlufi.HdlBluWi hdlBluWiShare;
///
/// 我也不知道这是什么东西
///
private HdlBlufi.BlufiClient blufiClient;
///
/// 接收事件
///
private Action ReceiveEvent = null;
///
/// 发送状态(0:发送失败 1:发送成功)
///
private int sendStatuValue = -1;
///
/// 蓝牙是否打开
///
private bool IsBlufiOpen = false;
#endregion
#region ■ 初始化___________________________
///
/// 初始化
///
private bool InitHdlBlufi()
{
if (hdlBluWiShare != null) { return true; }
try
{
this.hdlBluWiShare = HdlBlufi.HdlBluWi.Share();
this.blufiClient = new HdlBlufi.BlufiClient();
blufiClient.CentralManagerDelete = new BlueCBCentralManagerDelegate();
//添加回调事件
((BlueCBCentralManagerDelegate)blufiClient.CentralManagerDelete).StateEvent += (div, data) =>
{
//-1:异常 1:正常
if (div == StatuEnum.A异常)
{
//蓝牙没有打开
this.IsBlufiOpen = false;
}
else if (div == StatuEnum.A正常)
{
//蓝牙打开着
this.IsBlufiOpen = true;
}
};
blufiClient.BlufiDelegate = new BlueWifiDelegate();
return true;
}
catch { return false; }
}
#endregion
#region ■ 蓝牙所需功能检测___________________
///
/// 检测是否能够搜索蓝牙(内部会弹出Msg框,因为内部需要检测系统权限,所以参数采用回调的方式)
///
/// 检测结果事件
public void CheckCanScanBluetooth(Action resultEvent)
{
try
{
//先初始化
if (this.InitHdlBlufi() == false)
{
resultEvent?.Invoke(false);
//请打开蓝牙
HdlMessageLogic.Current.ShowMassage(ShowMsgType.Tip, Shared.Language.StringByID(StringId.PleaseTurnOnBluetooth));
return;
}
if (this.IsBlufiOpen == true)
{
//因为是一直监听着,所以如果是true,直接返回
resultEvent?.Invoke(this.IsBlufiOpen);
return;
}
HdlThreadLogic.Current.RunThread(() =>
{
//ios需要监听才能够获得蓝牙的状态
System.Threading.Thread.Sleep(500);
if (this.IsBlufiOpen == false)
{
//请打开蓝牙
HdlMessageLogic.Current.ShowMassage(ShowMsgType.Tip, Shared.Language.StringByID(StringId.PleaseTurnOnBluetooth));
}
HdlThreadLogic.Current.RunMain(() =>
{
resultEvent?.Invoke(this.IsBlufiOpen);
});
}, ShowErrorMode.NO);
}
catch
{
resultEvent?.Invoke(false);
//请打开蓝牙
HdlMessageLogic.Current.ShowMassage(ShowMsgType.Tip, Shared.Language.StringByID(StringId.PleaseTurnOnBluetooth));
}
}
#endregion
#region ■ 蓝牙扫描___________________________
///
/// 搜索蓝牙
///
/// 搜索时间(秒)
/// 搜索结束的事件
public void ScanBluetooth(int waitTime, Action> FinishEvent)
{
HdlThreadLogic.Current.RunMain(() =>
{
//再次检测是否能够搜索蓝牙
this.CheckCanScanBluetooth((result) =>
{
if (result == true)
{
HdlThreadLogic.Current.RunThread(() =>
{
//开始搜索蓝牙
this.DoScanBluetooth(waitTime, FinishEvent);
});
}
});
});
}
///
/// 开始搜索蓝牙
///
/// 搜索时间(秒)
/// 搜索结束的事件
private void DoScanBluetooth(int waitTime, Action> FinishEvent)
{
//蓝牙列表
var listData = new List();
//重复检测
var listCheck = new List();
//实现蓝牙接收事件
var ReceiveBlufiDeviceEvent = new HdlBlufi.FBYBleDeviceBackBlock((arg0) =>
{
var address = arg0.Uuid.ToString();
if (listCheck.Contains(address) == false)
{
listCheck.Add(address);
var data = new BluetoothInfo();
data.Address = address;
data.Name = arg0.Name == null ? string.Empty : arg0.Name;
listData.Add(data);
}
});
HdlThreadLogic.Current.RunMain(() =>
{
//开启蓝牙搜索
this.hdlBluWiShare.StartScan(ReceiveBlufiDeviceEvent);
}, ShowErrorMode.NO);
System.Threading.Thread.Sleep(waitTime * 1000);
HdlThreadLogic.Current.RunMain(() =>
{
//关闭蓝牙搜索
this.hdlBluWiShare.StopScan();
ReceiveBlufiDeviceEvent = null;
}, ShowErrorMode.NO);
//回调事件
FinishEvent?.Invoke(listData);
}
#endregion
#region ■ 蓝牙链接___________________________
///
/// 蓝牙链接(false:连接失败 true:连接成功)
///
/// 需要链接的蓝牙对象
/// 因为需要对方反馈,所以使用回调(链接结果 false:连接失败 true:连接成功)
public void ContectBluetooth(BluetoothInfo bluetooth, Action connectEvent)
{
HdlThreadLogic.Current.RunMain(() =>
{
try
{
//添加事件
((BlueWifiDelegate)blufiClient.BlufiDelegate).StateEvent += (div, data) =>
{
//-1:异常 1:正常 2:发送数据成功 3:发送数据失败
if (div == StatuEnum.A异常)
{
//关闭链接
this.DisContectBluetooth();
connectEvent?.Invoke(false);
//只通知一次
connectEvent = null;
}
else if (div == StatuEnum.A正常)
{
//链接建立成功
connectEvent?.Invoke(true);
//只通知一次
connectEvent = null;
}
else if (div == StatuEnum.A发送成功 || div == StatuEnum.A发送失败)
{
sendStatuValue = div == StatuEnum.A发送成功 ? 1 : 0;
}
else if (div == StatuEnum.A蓝牙反馈)
{
//蓝牙返回的结果
this.ReceiveEvent?.Invoke(data);
}
};
//执行链接
this.blufiClient.Connect(bluetooth.Address);
}
catch
{
connectEvent?.Invoke(false);
connectEvent = null;
}
});
}
#endregion
#region ■ 蓝牙关闭___________________________
///
/// 关闭蓝牙链接
///
public void DisContectBluetooth()
{
HdlThreadLogic.Current.RunMain(() =>
{
this.blufiClient?.Close();
this.blufiClient = null;
this.hdlBluWiShare = null;
}, ShowErrorMode.NO);
}
///
/// 摧毁
///
public void Dispone()
{
//关闭蓝牙链接
this.DisContectBluetooth();
this.ReceiveEvent = null;
m_Current = null;
}
#endregion
#region ■ 发送数据___________________________
///
/// 发送数据给蓝牙
///
/// 发送的数据
/// 等待时间(秒),如果设置为0,则只要发送不出现异常,直接判定为成功
public bool SendData(string i_data, int waiTime = 0)
{
if (this.blufiClient == null)
{
return false;
}
try
{
this.sendStatuValue = -1;
HdlThreadLogic.Current.RunMain(() =>
{
//发送数据
var data = new Foundation.NSData();
data = i_data;
blufiClient.PostCustomData(data);
}, ShowErrorMode.NO);
if (waiTime == 0) { return true; }
waiTime *= 5;
while (this.sendStatuValue == -1 && waiTime > 0)
{
System.Threading.Thread.Sleep(200);
waiTime--;
}
return this.sendStatuValue == 1;
}
catch { return false; }
}
#endregion
#region ■ 一般方法___________________________
///
/// 添加蓝牙的接收事件
///
/// 蓝牙接收事件
public void AddReceiveEvent(Action i_ReceiveEvent)
{
this.ReceiveEvent = i_ReceiveEvent;
}
///
/// 移除蓝牙的接收事件
///
public void RemoveReceiveEvent()
{
this.ReceiveEvent = null;
}
#endregion
#region ■ 系统蓝牙回调_______________________
private class BlueWifiDelegate : HdlBlufi.BlufiDelegate
{
///
/// 状态事件回调 当第一个参数为"A蓝牙反馈"时,第二个参数为蓝牙返回的信息
///
public Action StateEvent = null;
public override void Blufi_didNegotiateSecurity(HdlBlufi.BlufiClient client, HdlBlufi.BlufiStatusCode status)
{
//Console.WriteLine("Blufi_didNegotiateSecurity");
}
public override void Blufi_didPostCustomData(HdlBlufi.BlufiClient client, Foundation.NSData data, HdlBlufi.BlufiStatusCode status)
{
if (status == HdlBlufi.BlufiStatusCode.Success)
{
//发送蓝牙数据成功
StateEvent?.Invoke(StatuEnum.A发送成功, null);
}
else
{
//发送蓝牙数据失败
StateEvent?.Invoke(StatuEnum.A发送失败, null);
}
}
public override void Blufi_didReceiveDeviceScanResponse(HdlBlufi.BlufiClient client, HdlBlufi.BlufiScanResponse[] scanResults, HdlBlufi.BlufiStatusCode status)
{
//Console.WriteLine("Blufi_didReceiveDeviceScanResponse");
}
public override void Blufi_didReceiveDeviceVersionResponse(HdlBlufi.BlufiClient client, HdlBlufi.BlufiVersionResponse response, HdlBlufi.BlufiStatusCode status)
{
//Console.WriteLine("Blufi_didReceiveDeviceVersionResponse");
}
public override void Blufi_didPostConfigureParams(HdlBlufi.BlufiClient client, HdlBlufi.BlufiStatusCode status)
{
//Console.WriteLine("Blufi_didPostConfigureParams");
}
public override void Blufi_didReceiveCustomData(HdlBlufi.BlufiClient client, Foundation.NSData data, HdlBlufi.BlufiStatusCode status)
{
//接收蓝牙发送过来的数据
StateEvent?.Invoke(StatuEnum.A蓝牙反馈, data.ToString());
}
public override void Blufi_didReceiveDeviceStatusResponse(HdlBlufi.BlufiClient client, HdlBlufi.BlufiStatusResponse response, HdlBlufi.BlufiStatusCode status)
{
//Console.WriteLine("Blufi_didReceiveDeviceStatusResponse");
}
public override void Blufi_didReceiveError(HdlBlufi.BlufiClient client, nint errCode)
{
//Console.WriteLine("Blufi_didReceiveError");
}
public override void Blufi_gattPrepared(HdlBlufi.BlufiClient client, HdlBlufi.BlufiStatusCode status, CoreBluetooth.CBService service, CoreBluetooth.CBCharacteristic writeChar, CoreBluetooth.CBCharacteristic notifyChar)
{
if (status == HdlBlufi.BlufiStatusCode.Success)
{
//蓝牙连接成功
StateEvent?.Invoke(StatuEnum.A正常, null);
}
else
{
//蓝牙连接失败
StateEvent?.Invoke(StatuEnum.A异常, null);
}
}
}
private class BlueCBCentralManagerDelegate : CoreBluetooth.CBCentralManagerDelegate
{
///
/// 状态事件回调
///
public Action StateEvent = null;
public override void UpdatedState(CoreBluetooth.CBCentralManager central)
{
//只要没有打开蓝牙,都算异常处理
if (central.State == CoreBluetooth.CBCentralManagerState.PoweredOn)
{
StateEvent?.Invoke(StatuEnum.A正常, null);
}
else
{
StateEvent?.Invoke(StatuEnum.A异常, null);
}
}
}
#endregion
#region ■ 结构体_____________________________
///
/// 蓝牙返回的信息
///
public class BluetoothInfo
{
///
/// 名字(此名字不会null,如果它本身是null,只会是string.empty)
///
public string Name = string.Empty;
///
/// 地址
///
public string Address = string.Empty;
}
///
/// 状态枚举
///
private enum StatuEnum
{
A异常 = -1,
A正常 = 1,
A发送成功 = 2,
A发送失败 = 3,
A蓝牙反馈 = 4
}
#endregion
}
#endif
}