这个莫名其妙的 bug 浪费了我 N 多个小时,为了搞清楚原因俺熬夜到1点。
这个BUG是这样的:
BluetoothLE1 第一个操作是 DiscoverDevice,扫描发现周围的蓝牙设备。扫描后,BluetoothLE1 内部有一个扫描到的设备对象列表;
第二个操作是针对某个设备,执行对该设备提供哪些服务进行一个扫描发现操作:DiscoverServices。执行完成后,BluetoothLE1内部有一个服务对象列表,同时每个服务内还有一个该服务拥有的特征对象列表。
然后,采用 BluetoothLE1.GetCharacteristic(AService, ChaUUID); 就能获得指定UUID的特征对象。我们和 BLE 设备通信的最终目的就是读设备的某个值或者写某个值(接收数据或者发送数据),就是要读写这个特征对象。
BUG 来了:如果不对服务列表做一次 for 循环操作,BluetoothLE1.GetCharacteristic 这个方法一定是返回 nil,也就是找不到你要的特征对象。
解决方法:做 BluetoothLE1.GetCharacteristic 之前,先对它做一个循环:
for i := 0 to AService.Characteristics.Count -1 do