はじめに
前回の記事(https://qiita.com/yokobonbon/items/f17bac71e9ba02a713ac)
でReact NativeでBLEペリフェラルのスキャンを実現しました。今回はそこから、iBeaconのMajor/Minorデータ取得します。
Manufacture SpecificとiBeacon
以下のページが参考になります。
https://fabo.gitbooks.io/bledocs/content/nordic/beaconadvdata.html
iBeaconはUUID + Major(16ビット) + Minor(16ビット)で一意な端末を識別しますが、その情報は、BLE Advertised PacketのManufacture Specificデータの中に含まれます。Majro番号は25,26バイト目に格納され、Minor番号は26,27バイト目に格納されます。
Manufacture SpecificデータはBleManagerDiscoverPeripheralにおいて、advertisingの中のmanufactureDataに格納されています。
https://github.com/innoveit/react-native-ble-manager
- id - String - the id of the peripheral
- name - String - the name of the peripheral
- rssi - Number - the RSSI value
- advertising - JSON - the advertising payload, here are some examples:
- isConnectable - Boolean
- serviceUUIDs - Array of String
- manufacturerData - JSON - contains the raw bytes and data (Base64 encoded string)
- serviceData - JSON - contains the raw bytes and data (Base64 encoded string)
- txPowerLevel - Int
manufacturerDataはbytesとdataが格納されているようですが、bytesの中の25、26バイト目がMajor番号、27、28バイト目がMinor番号が格納されています。
Major Minor番号の取得と表示
前回の記事に記述しているコードの差分になります。
bleManagerEmitter.addListener(
'BleManagerDiscoverPeripheral',
(args) => {
let major = 0;
let minor = 0;
major = args.advertising.manufacturerData.bytes[25] * 256 + args.advertising.manufacturerData.bytes[26];
minor = args.advertising.manufacturerData.bytes[27] * 256 + args.advertising.manufacturerData.bytes[28];
let peripheral = { 'id': args.id, 'name': args.name, 'major': major, 'minor': minor };
this.discoveredPeripheralList.push(peripheral);
this.setState({peripheralList: this.discoveredPeripheralList});
renderPeripheral({ item }) {
return (
<View style={styles.peripheralList}>
<Text style={styles.id_text}>ID: {item.id}</Text>
<Text style={styles.id_text}>NAME: {item.name}</Text>
<Text style={styles.id_text}>MAJOR: {item.major}</Text>
<Text style={styles.id_text}>MINOR: {item.minor}</Text>
</View>
);
}