0

我的桌子上有两个面:

A) 一个 Broadcom 评估模块BCM920737TAG,带有一个 Broadcom 蓝牙 LE 芯片和一个小型 cortex M0 MCU。我还运行了一个终端程序,显示模块的跟踪文本输出。这是使用 Broadcom 的“ WICED Smart IDE ”编程的。有一些示例随它一起提供。我目前正在使用 speed_test 示例。

B) Xamarin iOS,来自 VisualStudio 2013(和 Mac 作为构建主机),使用他们的跨平台 BluetoothLE 库Monkey.Robotics

我想要实现的目标:我的最终目标是从iPhone(BLE 客户端)自定义设备(BLE 服务器)发送大量数据(~ 500 KB - 我知道它会很慢)。由于我不能只在没有来自接收器的某种 ACK 的情况下发送 20 字节的数据包而不会破坏数据(正确吗?),并且 Broadcom speed_test示例提供在指定数量的接收数据包后通过控制特性发送 ACK ,我用那个例子。由于 iOS(1) 上的 Monkey.Robotics 中的特征描述符目前似乎已损坏,因此我注释掉了 broadcom speed_test 中检查配置是否设置为 ACK 的部分。

(1) 发现的特性中的该属性仍然为空;Xamarin 论坛上有一个相应的帖子,没有修复

    else if (handle == HANDLE_SPEED_TEST_CHARACTERISTIC_DATA_VALUE)
{
    if (++speed_test.received_unacked == speed_test.num_to_receive_before_ack)
    {
        // TEST: do ACK notify w/o this config // if (speed_test.control_client_configuration & CCC_NOTIFICATION)
        {
            UINT8 result[1] = {0x01};
            bleprofile_sendNotification(HANDLE_SPEED_TEST_CHARACTERISTIC_CONTROL_VALUE, result, 1);
        }
        speed_test.received_unacked = 0;

- 我还在 speed_test 中注意到控制特性没有“可读”标志,所以我添加了它们。

    //CHARACTERISTIC_UUID128_WRITABLE
CHARACTERISTIC_UUID128(HANDLE_SPEED_TEST_CHARACTERISTIC_CONTROL, HANDLE_SPEED_TEST_CHARACTERISTIC_CONTROL_VALUE,
        UUID_SPEED_TEST_CHARACTERISTIC_CONTROL_POINT,
    LEGATTDB_CHAR_PROP_NOTIFY | LEGATTDB_CHAR_PROP_WRITE | LEGATTDB_CHAR_PROP_READ,
    LEGATTDB_PERM_WRITE_REQ | LEGATTDB_PERM_READABLE, 2),

-

我修改了 Monkey.Robotics BLEExplorer 示例。我添加了我自己的页面,该页面在选择发现的设备、发现其服务和特征时显示,当它们具有正确的 UUID 时,将“开始测试”命令发送到 Broadcom 模块。然后它会通过数据特性发送多个 20 字节的数据包,然后发送“结束测试”命令。speed_test 的开始和结束在我的串行终端的跟踪输出中得到确认,即 Broadcom 模块正确地得到了这个。只要我盲目地在下一个数据包之后发送一个数据包,这就会起作用(2),并带有一个有效禁用 ACK 的“开始测试”命令参数。一旦我将其设置为 ACK 每个数据包,然后尝试在 ICHaracteristic 上执行 ReadAsync(),问题就开始了。

(2) 好吧,程序结束得太早了,即所有数据可能都没有真正收到——因此我认为我需要来自服务器端的 ACK,speed_test 通过在控制特性中写回一个值来实现。

但是,我无法读取控制特性。Xamarin 项目中的异常被抛出,因为该特性没有设置 CanRead 标志 - 尽管我在 Broadcom 端添加了这个。我尝试通过 ICharacteristic.ReadAsync() 阅读。

我究竟做错了什么?我很乐意在必要时提供更多细节。

4

1 回答 1

0

呃。我现在可以阅读这些特征,而无需在软件中进一步更改任何内容。原来 iPhone 仍在缓存有关 Broadcom 模块特征的信息,并且不知道我添加的“可读”标志。所以我在 iPhone 上这样做了: - 在系统设置中禁用蓝牙 - 完全关闭 iPhone - 再次启动 iPhone - 再次启用蓝牙 然后它就可以工作了......

这里提出了类似的建议,但只执行其中一个步骤对我没有用: https ://bluegiga.zendesk.com/entries/22662197--TROUBLESHOOTING-GATT-database-service-and-characteristic-caching-on -iOS 和 Android

于 2015-06-09T13:04:59.617 回答