BLE機器を開発中に、テスト用アプリを作っていた時に引っかかったメモ。
BLE機器のデバイス名を変えたのに、変更前の名前になっている
確かに変更したはずと思い、自分のiOSアプリを疑う。
そこで、持っていたBLExplrでスキャンしてみたところ、見えていた情報が食い違っていることに気づく。
iOS、デバイス情報のキャッシュ
あれこれ調べたところ、データの取り方によってはiOSが持っているキャッシュのデバイス名を取り出してしまう模様。
(BLEのUUIDとひも付けているっぽい?)
当初のコードでは、didDiscoverPeripheralに渡ってきたCBPeripheralのnameを参照していた。
- (void) centralManager:(CBCentralManager *)central
didDiscoverPeripheral:(CBPeripheral *)peripheral
advertisementData:(NSDictionary *)advertisementData
RSSI:(NSNumber *)RSSI
{
// キャッシュからデバイス名を取り出す場合がある
NSLog(@"Device name: %@", peripheral.name);
}
一度接続しなおす、などでキャッシュを書き換えることも可能だが、このままではBLE機器のデバッグが面倒なので違う手段にしたいところ。
対策
peripheralではなく、advertisementDataのkCBAdvDataLocalNameに入っている名前を取り出して使う。
こんな感じ。
- (void) centralManager:(CBCentralManager *)central
didDiscoverPeripheral:(CBPeripheral *)peripheral
advertisementData:(NSDictionary *)advertisementData
RSSI:(NSNumber *)RSSI
{
// キャッシュじゃないところからデバイス名を取り出し
NSLog(@"Device name: %@", advertisementData[@"kCBAdvDataLocalName"]);
}
思ったことなどなど
- ありものの機器を使って開発するなら前者の方法でも別に問題なさそう
- デバイス名ころころ変わらないだろうし。
- peripheralからキャッシュ側の名前を取り出す場合の利点ってなんだろう?