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

时间:2016-02-28 11:19:47

标签: android unity3d arduino bluetooth-lowenergy

我正在编写一个开源框架,使用BLE Mini module在Android和iOS移动设备上使用Unity engine

此框架应允许在移动设备和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 以及可以调用公共java方法的Unity c#代码:https://github.com/giomurru/ble-framework/blob/master/Unity/Assets/BLE/BLEController.cs

RBLGattAttributes.java RBLService.java 中包含的代码是正确的,因为它是RedBearLab提供的框架,我对其进行了测试,并且可以正常使用原生Android应用

我需要帮助但可能包含错误的代码是BleFramework.java中的代码

BleFramework 类包含一系列可由Unity引擎调用的函数。按照以下顺序调用函数:

  • 调用get静态方法BleFramework.getInstance()以获取BleFramework类的单例实例。此方法返回BleFramework类的一个且仅一个实例。

  • 获得类的实例后,我可以使用此实例(总是相同的实例)调用BleFramework方法。

  • 按照以下顺序调用方法:

1)从Unity调用 _InitBLEFramework 函数。该函数应初始化BLE框架。初始化完成后,Android插件使用OnBleDidInitialize“Success”消息回答Unity。

2)如果Unity收到OnBleDidInitialize“Success”消息,我可以从Unity调用 _ScanForPeripherals 函数。该功能扫描可用的BLE模块外设。当找到可用的外围设备时,插件会回答Unity并带有OnBleDidCompletePeripheralScan“成功”消息。

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

4)一旦我找到了我发现的BLE模块设备列表,我就可以尝试使用函数 _ConnectPeripheralAtIndex(int peripheralIndex)连接到其中一个。当_mGattUpdateReceiver收到RBLService.ACTION_GATT_SERVICES_DISCOVERED时,我可以说连接已建立,我可以通过发送OnBleDidConnect“成功”消息让Unity知道我已准备好发送/接收数据。

到此为止,插件按预期工作,并建立连接。

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

5)当Unity收到OnBleDidConnect“成功”消息时,它已准备好通过已建立的连接发送数据。因此,我尝试使用插件中的_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 参数,我尝试使用hexStringToByteArray函数发送我在_SendData函数内创建的 byte [] tx 数据(我在StackOverflow帖子中找到了:Convert a string representation of a hex dump to a byte array using 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);

}

在所有情况下,我都无法发送数据。

我真的不明白为什么会这样。我用来搜索ble设备,建立连接,发送接收数据的代码非常类似于ReadBearLab github页面中提供的Android原生样本:https://github.com/RedBearLab/Android/tree/master/Examples

唯一的区别是我没有扩展活动。 我试图让BleFramework类成为Activity的扩展,但它没有用。我遇到的问题是,当BleFramework活动正在运行时,我无法使用 UnityPlayer.UnitySendMessage 函数将消息发送回Unity。

1 个答案:

答案 0 :(得分:0)

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