无法从Android 5向蓝牙低功耗模块发送数据。

3
我正在编写一个开源框架,使用BLE Mini模块与Android和iOS移动设备配合使用Unity引擎。该框架应该允许建立移动设备和BLE Mini模块之间的连接,并使用它发送/接收数据。理论上,该框架可以适应任何BLE模块。
本人意图是使现有的BLE Mini框架(适用于iOS和Android)在Unity引擎中运行,因此我正在为iOS和Android编写原生插件,以便Unity应用程序可以使用本地框架。
iOS插件按预期工作,但我在编写Android插件时遇到了问题。
除了无法将数据发送到我的特征之外,其他所有内容都按预期工作。如果我发送数据,则BLE Mini模块不会接收到它。控制BLE Mini数据接收的代码是正确的,因为当iOS发送数据时它可以工作。因此,我确信问题出在Android插件中。
Android插件由Android本机代码组成,可以在此处找到:https://github.com/giomurru/ble-framework/tree/master/AndroidPlugin/src/com/gmurru/bleframework ,以及Unity的c#代码,可以调用公共Java方法:https://github.com/giomurru/ble-framework/blob/master/Unity/Assets/BLE/BLEController.cs 包含在RBLGattAttributes.javaRBLService.java中的代码是正确的,因为它是RedBearLab提供的框架,我测试过,并且在本地Android应用程序中可以正常工作。
我需要帮助的代码(可能包含错误)是BleFramework.java中的代码。BleFramework类包含一系列可以由Unity引擎调用的函数。按照以下顺序调用这些函数:
1. 从Unity调用get static method BleFramework.getInstance(),以获取BleFramework类的单例实例。该方法返回一个且仅返回一个BleFramework类的实例。 2. 获取该类的实例后,可以使用此实例(始终是相同的实例)调用BleFramework方法。 3. 调用函数_InitBLEFramework。该函数应初始化BLE框架。初始化完成后,Android插件会向Unity回复OnBleDidInitialize "Success"消息。

2) 如果Unity收到OnBleDidInitialize "Success"消息,我可以从Unity调用函数_ScanForPeripherals。该函数会扫描可用的BLE模块外设。当发现可用的外设时,插件会以OnBleDidCompletePeripheralScan "Success"消息回答Unity。

3) 如果Unity收到OnBleDidCompletePeripheralScan "Success"消息,我可以调用函数_GetListOfDevices来获取找到的设备列表。

4) 一旦我找到了BLE模块设备的列表,我可以使用函数_ConnectPeripheralAtIndex(int peripheralIndex)尝试连接其中之一。当_mGattUpdateReceiver接收到RBLService.ACTION_GATT_SERVICES_DISCOVERED时,我可以说连接已经建立,然后通过发送OnBleDidConnect "Success"消息来告诉Unity我已经准备好发送/接收数据了。

到这里为止,插件按预期工作,并且连接已建立。

问题在于当我尝试在第5步中发送数据时。

5) 当Unity收到OnBleDidConnect "Success"消息时,它已经准备好通过建立的连接发送数据。因此,我尝试使用插件中的_SendData函数发送数据。不幸的是,它不起作用。

以下是代码:

public void _SendData(byte[] data)
{
    Log.d(TAG,"_SendData: ");

    BluetoothGattCharacteristic characteristic = _map.get(RBLService.UUID_BLE_SHIELD_TX);
    Log.d(TAG, "Set data in the _characteristicTx");
    byte[] tx = hexStringToByteArray("fefefe");
    characteristic.setValue(tx);

    Log.d(TAG, "Write _characteristicTx in the _mBluetoothLeService: " + tx[0] + " " + tx[1] + " " + tx[2]);
    if (_mBluetoothLeService==null)
    {
        Log.d(TAG, "_mBluetoothLeService is null");
    }
    _mBluetoothLeService.writeCharacteristic(characteristic);

}

public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

为了测试目的,我忽略了 byte[] data 参数,并尝试发送 byte[] tx 数据。我在 _SendData 函数中使用 hexStringToByteArray 函数创建了这些数据(该函数是在此 StackOverflow 帖子中找到的:如何使用 Java 将十六进制转换为字节数组?)。

我还尝试创建 tx 数据:

byte tx[] = new byte[] { (byte) 0xfe, (byte) 0xfe, (byte) 0xfe };

或者直接像这样发送数据:
public void _SendData(byte[] data)
{
    Log.d(TAG,"_SendData: ");

    BluetoothGattCharacteristic characteristic = _map.get(RBLService.UUID_BLE_SHIELD_TX);
    Log.d(TAG, "Set data in the _characteristicTx");
    characteristic.setValue(data);

    Log.d(TAG, "Write _characteristicTx in the _mBluetoothLeService: " + data[0] + " " + data[1] + " " + data[2]);
    if (_mBluetoothLeService==null)
    {
        Log.d(TAG, "_mBluetoothLeService is null");
    }
    _mBluetoothLeService.writeCharacteristic(characteristic);

}

在所有的情况中,我都无法发送数据。
我真的不明白为什么会发生这种情况。我用来搜索蓝牙设备、建立连接、发送和接收数据的代码非常类似于ReadBearLab在Github页面上提供的Android原生示例:https://github.com/RedBearLab/Android/tree/master/Examples 唯一的区别是我没有扩展Activity。我试图将BleFramework类作为Activity的扩展,但它没有起作用。我的问题是,当BleFramework活动正在运行时,我无法使用UnityPlayer.UnitySendMessage函数将消息发送回Unity。
1个回答

0
我自己回答了这个问题,只是为了参考,如果有人对我找到的解决方案感兴趣。 我通过更新代码到最新的Android API来修复了这个bug。如果您对修改感兴趣,请查看2019年6月15日至2019年6月22日之间的提交。特别是名为“Android tx/rx works”的提交。 https://github.com/giomurru/ble-framework

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接