一、添加权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
二、添加引用"Plugin.BLE"
通过nuget添加Plugin.BLE包。
三、获取蓝牙代理
Plugin.BLE.Abstractions.Contracts.IAdapter _adapter = CrossBluetoothLE.Current.Adapter;
四、打开蓝牙
这里假设已手动打开蓝牙。
五、搜索BLE设备
this.btnScan.Click += async (object sender, EventArgs e) => {
await _adapter.StartScanningForDevicesAsync();
};
//订阅设备发现事件
_adapter.DeviceDiscovered += (s, e) =>
{
Console.WriteLine("Discovered device: " + e.Device.Name);
_device = e.Device;
this.Activity.RunOnUiThread(() =>
{
this._listAdapter = new DevicesAdapter(this.Activity, _adapter.DiscoveredDevices);
this.lvLocks.Adapter = this._listAdapter;
});
};
六、连接蓝牙BLE终端设备
//ListView点击事件
this.lvLocks.ItemClick += (object sender, AdapterView.ItemClickEventArgs e) =>
{
Console.Write("ItemClick: " + this._listAdapter.Items[e.Position]);
_adapter.StopScanningForDevicesAsync();//停止扫描
// select the item
this.lvLocks.ClearFocus();
this.lvLocks.Post(() =>
{
this.lvLocks.SetSelection(e.Position);
});
// 连接蓝牙设备
_adapter.ConnectToDeviceAsync(_device);
};
//成功连接设备事件
_adapter.DeviceConnected += (s, e) =>
{
Console.WriteLine("DeviceConnected: " + e.Device.Name);
};
七、启动服务发现
这里我们已经有serviceUUID和characteristicUUID,所以此步省略。
八、获取Characteristic
//连接到指定服务
var service = await _device.GetServiceAsync(ServiceId);
//接收用的特征
var _receive = await service.GetCharacteristicAsync(ReceiveCharId);
//发送用的特征
var _transmit = await service.GetCharacteristicAsync(TransmitCharId);
九、读Characteristic
_receive.ValueUpdated += (ss, ee) =>
{
var bytes = ee.Characteristic.Value;
if (bytes == null || bytes.Length == 0)
return;
lock (readBuffer)
{
if (readBuffer.Count + bytes.Length > 1000)
{
readBuffer.RemoveRange(0, 1000 / 2);
}
readBuffer.AddRange(bytes);
}
};
_receive.StartUpdatesAsync();
十、写Characteristic
//发送数据
await _transmit.WriteAsync(new byte[] { 0x01, 0x02 });
注:蓝牙单次只能最多传输20个字节。