Android携帯を使用してiBeaconをAdvertiseします。

iBeacon Advertiseアプリの作成

iBeacon Advertiseアプリ「BeaconAdvertise」を作成します。

BeaconAdvertise

package com.example.beaconadvertise;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.bluetooth.le.BluetoothLeAdvertiser;

import android.os.Bundle;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.bluetooth.le.AdvertiseCallback;
import android.bluetooth.le.AdvertiseData;
import android.bluetooth.le.AdvertiseSettings;
import android.bluetooth.le.BluetoothLeAdvertiser;
import android.content.Context;
import android.os.ParcelUuid;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.UUID;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    //private BluetoothLeAdvertiser mBluetoothLeAdvertiser;  // tomo
    private final String TAG = "BeaconAdvertise";

    @SuppressLint("MissingPermission")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        BluetoothManager manager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        BluetoothAdapter adapter = manager.getAdapter();
        BluetoothLeAdvertiser advertiser = adapter.getBluetoothLeAdvertiser();

        // 設定
        AdvertiseSettings.Builder settingBuilder = new AdvertiseSettings.Builder();
        settingBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_POWER);
        settingBuilder.setConnectable(false);
        settingBuilder.setTimeout(0);
        settingBuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_LOW);
        AdvertiseSettings settings = settingBuilder.build();

        // 以下はAdvertiseData
        // 1-5バイト目のフラグはAdvertiseSettingsのsetConnectable(true)で行われています
        // 6-7バイト目の会社コードはaddManufactureDataで後ほど構築します
        // なので残りの23バイトをByteBufferを用いて構築します
        final byte[] manufacturerData = new byte[23];
        ByteBuffer byteBuffer = ByteBuffer.wrap(manufacturerData);
        byteBuffer.order(ByteOrder.BIG_ENDIAN);
        // iBeacon固定値(8バイト目)
        byteBuffer.put((byte) 0x02);
        // iBeaconのデータバイト数(9バイト目)
        byteBuffer.put((byte) 0x15);

        // UUID(10―25バイト目)
        final UUID uuid = UUID.fromString("4853442-4C45-4144-80C0-1800FFFFFFFF");
        // 上位64ビットを追加
        byteBuffer.putLong(uuid.getMostSignificantBits());
        // 下位64ビットを追加
        byteBuffer.putLong(uuid.getLeastSignificantBits());

        // major(26-27バイト目)
        byteBuffer.putShort((short) 0x0A);
        // minor(28-29バイト目)
        byteBuffer.putShort((short) 0x1F);
        // 電波強度を表す2の補数(30バイト目)
        byteBuffer.put((byte) 0x99);

        // 会社コード(6-7バイト目)
        final int appleManufactureId = 0x004C;
        // AdvertiseData作成
        final AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder();
        dataBuilder.addManufacturerData(appleManufactureId, manufacturerData);

        AdvertiseData advertiseData = dataBuilder.build();

        //アドバタイズを開始
        advertiser.startAdvertising(settings, advertiseData, new AdvertiseCallback() {
            @Override
            public void onStartSuccess(AdvertiseSettings settingsInEffect) {
                super.onStartSuccess(settingsInEffect);
                Log.d(TAG, "onStartSuccess");
            }

            @Override
            public void onStartFailure(int errorCode) {
                super.onStartFailure(errorCode);
                Log.d(TAG, "onStartFailure");
            }
        });
    }
}

iBeacon Advertiseアプリの実行

パソコンによるBeacon Scan」で作成したアプリを作成して、作成したiBeacon Advertiseアプリ「BeaconAdvertise」を確認します。