Skip to content
Permalink
Browse files

set addManufacturerData params 0x004c and byte[23], it seems good.

  • Loading branch information...
youten committed Nov 11, 2014
1 parent 3289563 commit e4769a6f910d4b26a120bcf855b4ad1e203f8b65
Showing with 26 additions and 26 deletions.
  1. +1 −10 README.md
  2. +15 −1 src/youten/redo/ble/abeacon/MainActivity.java
  3. +10 −15 src/youten/redo/ble/util/BleUtil.java
@@ -1,16 +1,7 @@
# aBeacon

Android LollipopでBLE Peripheralに対応したので
某iBeaconのAdv packetが再現できるか試してみたものです。

が、LRX21LのNexus9では31octetの計算式がおかしいせいか、
TxPowerが入れられないというなんとも片手落ちなiBeaconしか吹けません。
単純に計算式のミスかその先詰めるところにバグがあるか、
あるいは他のFlagがおかしくてiOSでiBeaconとして受信できないので
あまりがんばる意味もないのか、色々気になる点はあって
申し訳ないのですが差し当たりTxPower0x00版としてcommitしておきます。

また時間があれば。
某iBeaconのAdv packetが再現できるか試してみたものですbou

# License

@@ -1,4 +1,18 @@

/*
* Copyright (C) 2014 youten
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package youten.redo.ble.abeacon;

import java.util.UUID;
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2013 youten
* Copyright (C) 2014 youten
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -63,30 +63,25 @@ public static AdvertiseData createIBeaconAdvertiseData(UUID proximityUuid, short
}
// UUID to byte[]
// ref. http://stackoverflow.com/questions/6881659/how-to-convert-two-longs-to-a-byte-array-how-to-convert-uuid-to-byte-array
byte[] manufacturerData = new byte[24];
byte[] manufacturerData = new byte[23];
ByteBuffer bb = ByteBuffer.wrap(manufacturerData);
bb.order(ByteOrder.BIG_ENDIAN);
// fixed
bb.put((byte) 0x4c);
bb.put((byte) 0x00);
// fixed 4bytes
// ManufacturerIdが正しく入るようになったので先頭2byteの変わりに
// addManufacturerData時に0x004cとbyte[23]の2引数を指定すると一応iBeaconとして認識される気配がします。
// (何をもって"iBeacon"とすべきかは某MFiなNDAの話なので分かりませんが!)
//bb.put((byte) 0x4c);
//bb.put((byte) 0x00);
bb.put((byte) 0x02);
bb.put((byte) 0x15);
bb.putLong(proximityUuid.getMostSignificantBits());
bb.putLong(proximityUuid.getLeastSignificantBits());
bb.putShort(major);
bb.putShort(minor);
//
// !!!CAUTION!!!
//
// 31octetの計算方法にバグがあって、iBeaconに必要な25byte(TxPower)まで埋めると
// AdvertiseCallback#ADVERTISE_FAILED_DATA_TOO_LARGEが返ってきます。
// http://tools.oesf.biz/android-5.0.0_r2.0/xref/frameworks/base/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java#totalBytes
// bb.put(txPower);
// というわけで現時点ではTxPowerなしというかなり片手落ちなiBeaconのAdvしか吹けません…orz
bb.put(txPower);

AdvertiseData.Builder builder = new AdvertiseData.Builder();
// 1つ目の引数がmanufacturerIdって書いてあるんですがAndroidのscanRecordでは読み取れないため適当値です。
builder.addManufacturerData(0, manufacturerData);
builder.addManufacturerData(0x004c, manufacturerData);
AdvertiseData adv = builder.build();
return adv;
}

0 comments on commit e4769a6

Please sign in to comment.
You can’t perform that action at this time.