我的桌子上有两个面:
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() 阅读。
我究竟做错了什么?我很乐意在必要时提供更多细节。