最近在使用Bluetooth+LE+for+iOS+and+Android+v2.3这个插件开发基于安卓设备的蓝牙模块。
蓝牙模块大概分成七步:
1.建立中心角色2.扫描外设(discover)
3.连接外设(connect)
4.扫描外设中的服务和特征(discover)
4.1 获取外设的services
4.2 获取外设的Characteristics,获取Characteristics的值,获取Characteristics的Descriptor和Descriptor的值5.与外设做数据交互(explore and interact)
6.订阅Characteristic的通知
7.断开连接(disconnect)
权限
安卓设备的软件开发首先要配置权限,找到AndroidManifest.xml文件。
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>申请蓝牙权限,安卓6.0以后可能需要特殊处理。
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>初始化蓝牙
/// <summary>
/// 初始化蓝牙
/// </summary>
public void InitBluetooth()
{
BluetoothLEHardwareInterface.Initialize(true, false, delegate
{
Show("蓝牙初始化成功!");
Invoke("ScanBluetooth", 0.1f);
}, delegate (string errorInfo)
{
Show("蓝牙初始化失败!");
});
}我们通常把app设置为centeral端,第一个参数表示是否把app设置为centeral端,第二个参数表示是否设置为peripheral端。
搜索蓝牙设备
蓝牙初始化成功后,开始搜索蓝牙设备,第一个参数表示是否根据UUID来搜索制定的蓝牙设备,null表示搜索所有蓝牙设备。
/// <summary>
/// 搜索蓝牙设备
/// </summary>
public void ScanBluetooth()
{
Show("开始搜索蓝牙设备...");
BluetoothLEHardwareInterface.ScanForPeripheralsWithServices(null, (address, name) =>
{
Show("已搜索到蓝牙设备");
AddPeripheral(name, address);
},
(address, name, rssi, advertisingInfo) =>
{
Show("新信息");
if (advertisingInfo != null)
BluetoothLEHardwareInterface.Log(string.Format("Device: {0} RSSI: {1} Data Length: {2} Bytes: {3}", name, rssi, advertisingInfo.Length, BytesToString(advertisingInfo)));
//log address name rssi advertisingInfo
});
}检查蓝牙合法性
搜索到蓝牙设备后,我们需要检查一下是不是我们想要连接的蓝牙设备
/// <summary>
/// 检查蓝牙合法性
/// </summary>
void AddPeripheral(string name, string address)
{
bleName = name.ToString();
bleAddress = address.ToString();
if (bleName == "Thingy")
{
Show("遥控器已上线");
ConnectBluetooth();
}
else
{
Show("错误的设备,重新搜索");
ScanBluetooth();
}
}连接到蓝牙设备
确定是我们要连接的设备后,开始连接
/// <summary>
/// 连接到蓝牙
/// </summary>
public void ConnectBluetooth()
{
Show("开始连接到蓝牙:");
BluetoothLEHardwareInterface.ConnectToPeripheral(bleAddress, (address) =>
{
Show("蓝牙连接成功!");
SubscribeBluetoothMsg();
},(address, serviceUUID) =>
{
},(address, serviceUUID, characteristicUUID) =>
{
}, delegate { });
}第一个回调函数只会在第一次连接到设备后被调用,在收到广告数据的情况下第二个回调会被调用。
输出信息 方便观察
把信息加上时间头,输出到UI上,方便我们观察进度。
public Text debug;
/// <summary>
/// 将信息输出到UI上 方便观察
/// </summary>
/// <param name="str">输出的值 不需要加换行符</param>
void Show(string str)
{
debug.text += (DateTime.Now.ToString("hh:mm:ss") + ":\t" + str + "\n");
}版权声明:本文为Testiness_Wind原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。