【问题标题】:Cannot send data from Android 5 to Bluetooth Low Energy module无法从 Android 5 向蓝牙低功耗模块发送数据
【发布时间】:2016-02-28 11:19:47
【问题描述】:

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

此框架应允许在移动设备和 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.javaRBLService.java 中包含的代码是正确的,因为它是 RedBearLab 提供的框架,我对其进行了测试,它可以与原生 Android 应用程序一起正常工作.

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

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

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

  • 获得类的实例后,我可以使用该实例(始终是同一个实例)调用 BleFramework 方法。

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

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

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

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

4) 获得找到的 BLE 模块设备列表后,我可以尝试使用函数 _ConnectPeripheralAtIndex(int peripheralIndex) 连接到其中一个。当 _mGattUpdateReceiver 收到 RBLService.ACTION_GATT_SERVICES_DISCOVERED 时,我可以说连接已建立,我可以通过发送 OnBleDidConnect“成功”消息让 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 参数,并尝试使用 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

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

【问题讨论】:

    标签: android unity3d arduino bluetooth-lowenergy


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 2016-06-14
      相关资源
      最近更新 更多