「Raspberry piでiBeacon受信」でRaspberry pi 3を使用してiBeaconを受信しましたが、今回はAndroid携帯を使用してiBeaconを受信します。
iPhoneアプリ「 Beacon入門」の設定
iPhoneアプリ「 Beacon入門」を使って次のiBeaconを発生します。
uuid: 48534442-4C45-4144-80C0-1800FFFFFFFF major: 100 minor: 1 power: -56
「micro:bitでiBeaconの作成」で使ったAndroidアプリ「Beacon Scanner」により、iPhoneアプリ「 Beacon入門」で発生したiBeaconを確認します。
BeaconScannerアプリの作成
BeaconScannerアプリは、「Android携帯を使ってBLEモジュールのスキャン」で作成したスキャンアプリをベースに、次のように作成します。99行目で受け取ったスキャンレコードを「Raspberry piでiBeacon受信」で示すiBeaconの仕様に従って編集します。
MainActivity.java
package com.tomosoft.beaconapplication; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.os.Handler; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothManager; import android.bluetooth.le.BluetoothLeScanner; import android.bluetooth.le.ScanCallback; import android.bluetooth.le.ScanResult; import android.bluetooth.le.ScanRecord; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.widget.Toast; import android.widget.TextView; import android.util.Log; public class MainActivity extends AppCompatActivity { private BluetoothAdapter adapter; private BluetoothLeScanner scanner; private MyScancallback scancallback; private final int PERMISSION_REQUEST = 100; private Handler handler; private final int SCAN_PERIOD = 10000; private BluetoothDevice device; private TextView textView; private final String TAG = "Beacon"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.text_view); // テキストを設定 textView.setText("11"); //BLE対応端末かどうかを調べる。対応していない場合はメッセージを出して終了 if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show(); finish(); } //Bluetoothアダプターを初期化する BluetoothManager manager = (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE); adapter = manager.getAdapter(); //bluetoothの使用が許可されていない場合は許可を求める。 if( adapter == null || !adapter.isEnabled() ){ Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(intent,PERMISSION_REQUEST); } else{ scanner = adapter.getBluetoothLeScanner(); scancallback = new MyScancallback(); //スキャニングを10秒後に停止 handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { scanner.stopScan(scancallback); finish(); } }, SCAN_PERIOD); //スキャンの開始 scanner.startScan(scancallback); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d("onActivityResult","start"); super.onActivityResult(requestCode, resultCode, data); if (requestCode == PERMISSION_REQUEST) { Log.d("onActivityResult","permission"); } } class MyScancallback extends ScanCallback{ @Override public void onScanResult(int callbackType, ScanResult result) { super.onScanResult(callbackType, result); // スキャン結果が返ってきます // このメソッドかonBatchScanResultsのいずれかが呼び出されます。 // 通常はこちらが呼び出されます。 if (result == null){ return; } BluetoothDevice bDevice = result.getDevice(); ScanRecord record = result.getScanRecord(); byte[] bytes = record != null ? record.getBytes() : new byte[0]; Log.d(TAG, bDevice.getAddress()); Log.d(TAG, bDevice.toString()); Log.d(TAG, getUUID(bytes)); Log.d(TAG, getMajor(bytes)); Log.d(TAG, getMinor(bytes)); Log.d(TAG, String.valueOf(bytes[29])); Log.d(TAG, String.valueOf(result.getRssi())); textView.append("UUID: "+getUUID(bytes)+" major: "+getMajor(bytes)+" minor: "+getMinor(bytes)+ " Power: "+String.valueOf(bytes[29])+" Rssi: "+String.valueOf(result.getRssi())+"\n"); } private String getUUID(byte[] scanRecord) { String uuid = IntToHex2(scanRecord[9] & 0xff) + IntToHex2(scanRecord[10] & 0xff) + IntToHex2(scanRecord[11] & 0xff) + IntToHex2(scanRecord[12] & 0xff) + "-" + IntToHex2(scanRecord[13] & 0xff) + IntToHex2(scanRecord[14] & 0xff) + "-" + IntToHex2(scanRecord[15] & 0xff) + IntToHex2(scanRecord[16] & 0xff) + "-" + IntToHex2(scanRecord[17] & 0xff) + IntToHex2(scanRecord[18] & 0xff) + "-" + IntToHex2(scanRecord[19] & 0xff) + IntToHex2(scanRecord[20] & 0xff) + IntToHex2(scanRecord[21] & 0xff) + IntToHex2(scanRecord[22] & 0xff) + IntToHex2(scanRecord[23] & 0xff) + IntToHex2(scanRecord[24] & 0xff); return uuid; } private String getMajor(byte[] scanRecord) { String hexMajor = IntToHex2(scanRecord[25] & 0xff) + IntToHex2(scanRecord[26] & 0xff); return String.valueOf(Integer.parseInt(hexMajor, 16)); } private String getMinor(byte[] scanRecord) { String hexMinor = IntToHex2(scanRecord[27] & 0xff) + IntToHex2(scanRecord[28] & 0xff); return String.valueOf(Integer.parseInt(hexMinor, 16)); } private String IntToHex2(int i) { char hex_2[] = { Character.forDigit((i >> 4) & 0x0f, 16), Character.forDigit(i & 0x0f, 16) }; String hex_2_str = new String(hex_2); return hex_2_str.toUpperCase(); } } }
BeaconScannerアプリの実行
「Android携帯を使ってBLEモジュールのスキャン」の「Android携帯の設定」に従って次の設定を行います。
- スマホ側のアプリ実機テスト環境を設定
- Android携帯でアプリの権限設定
Android Studio でBeaconScannerアプリを作成し、ツールバーにある「Run」をクリックします。2,30秒でスキャンアプリがAndroid携帯にロードされて実行され、次のように表示されます。
次のようにAndroid Studio上の「logcat」ビューで出力されたログを確認します。
2021-06-03 14:32:29.609 2620-2911/? I/A: Setting = NOW_CARDS, optedInt = true 2021-06-03 14:32:29.611 1494-1538/? D/ActivityManager: cleanUpApplicationRecord -- 5389 2021-06-03 14:32:29.715 1494-1540/? I/DeviceIdleController: handleMessage(7) 2021-06-03 14:32:29.715 1494-1540/? I/DeviceIdleController: handleMessage(7) 2021-06-03 14:32:30.084 2738-2738/? D/wpa_supplicant: wlan0: Control interface command 'SIGNAL_POLL' 2021-06-03 14:32:30.095 2738-2738/? D/wpa_supplicant: CTRL-DEBUG: global_ctrl_sock-sendto: sock=9 sndbuf=212992 outq=0 send_len=48 2021-06-03 14:32:30.220 6085-6085/com.tomosoft.beaconapplication D/Beacon: 5B:9F:C4:D3:1A:E6 2021-06-03 14:32:30.220 6085-6085/com.tomosoft.beaconapplication D/Beacon: 5B:9F:C4:D3:1A:E6 2021-06-03 14:32:30.221 6085-6085/com.tomosoft.beaconapplication D/Beacon: 48534442-4C45-4144-80C0-1800FFFFFFFF 2021-06-03 14:32:30.221 6085-6085/com.tomosoft.beaconapplication D/Beacon: 100 2021-06-03 14:32:30.221 6085-6085/com.tomosoft.beaconapplication D/Beacon: 1 2021-06-03 14:32:30.221 6085-6085/com.tomosoft.beaconapplication D/Beacon: -56 2021-06-03 14:32:30.221 6085-6085/com.tomosoft.beaconapplication D/Beacon: -36 2021-06-03 14:32:30.233 6085-6085/com.tomosoft.beaconapplication D/Beacon: 5E:B9:80:02:D6:E6 2021-06-03 14:32:30.233 6085-6085/com.tomosoft.beaconapplication D/Beacon: 5E:B9:80:02:D6:E6 2021-06-03 14:32:30.233 6085-6085/com.tomosoft.beaconapplication D/Beacon: 00100503-1C13-A5C9-0000-000000000000 2021-06-03 14:32:30.234 6085-6085/com.tomosoft.beaconapplication D/Beacon: 0 2021-06-03 14:32:30.234 6085-6085/com.tomosoft.beaconapplication D/Beacon: 0 2021-06-03 14:32:30.234 6085-6085/com.tomosoft.beaconapplication D/Beacon: 0 2021-06-03 14:32:30.234 6085-6085/com.tomosoft.beaconapplication D/Beacon: -98 2021-06-03 14:32:30.250 6085-6085/com.tomosoft.beaconapplication D/Beacon: 5B:9F:C4:D3:1A:E6 2021-06-03 14:32:30.250 6085-6085/com.tomosoft.beaconapplication D/Beacon: 5B:9F:C4:D3:1A:E6 2021-06-03 14:32:30.250 6085-6085/com.tomosoft.beaconapplication D/Beacon: 48534442-4C45-4144-80C0-1800FFFFFFFF 2021-06-03 14:32:30.251 6085-6085/com.tomosoft.beaconapplication D/Beacon: 100 2021-06-03 14:32:30.251 6085-6085/com.tomosoft.beaconapplication D/Beacon: 1 2021-06-03 14:32:30.251 6085-6085/com.tomosoft.beaconapplication D/Beacon: -56 2021-06-03 14:32:30.251 6085-6085/com.tomosoft.beaconapplication D/Beacon: -36 2021-06-03 14:32:30.281 6085-6085/com.tomosoft.beaconapplication D/Beacon: 5B:9F:C4:D3:1A:E6 2021-06-03 14:32:30.281 6085-6085/com.tomosoft.beaconapplication D/Beacon: 5B:9F:C4:D3:1A:E6 2021-06-03 14:32:30.282 6085-6085/com.tomosoft.beaconapplication D/Beacon: 48534442-4C45-4144-80C0-1800FFFFFFFF 2021-06-03 14:32:30.282 6085-6085/com.tomosoft.beaconapplication D/Beacon: 100 2021-06-03 14:32:30.282 6085-6085/com.tomosoft.beaconapplication D/Beacon: 1 2021-06-03 14:32:30.282 6085-6085/com.tomosoft.beaconapplication D/Beacon: -56 2021-06-03 14:32:30.282 6085-6085/com.tomosoft.beaconapplication D/Beacon: -36 2021-06-03 14:32:30.292 6085-6090/com.tomosoft.beaconapplication I/art: Do partial code cache collection, code=20KB, data=28KB 2021-06-03 14:32:30.293 6085-6090/com.tomosoft.beaconapplication I/art: After code cache collection, code=20KB, data=28KB