투케이2K

135. (AndroidStudio/android/java) getBluetoothLeScanner 사용해 블루투스 ble 신호 실시간 스캔 실시 본문

Android

135. (AndroidStudio/android/java) getBluetoothLeScanner 사용해 블루투스 ble 신호 실시간 스캔 실시

투케이2K 2021. 5. 7. 18:36

/* =========================== */

[ 개발 환경 설정 ]

개발 툴 : AndroidStudio

개발 언어 : java

/* =========================== */

/* =========================== */

[소스 코드]

[AndroidManifest.xml 파일]

<퍼미션 등록 부분>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />


<액티비티 등록 부분>
<activity
            android:name=".A_BluetoothScan"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustPan"/>

 

[JAVA 파일 : A_BluetoothScan]

    //TODO [전역 변수 등록 부분] 
    BluetoothAdapter mBluetoothAdapter = null;
    ArrayList bleList = new ArrayList<>();




    //TODO [BluetoothAdapter 객체 매핑 부분]
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
​



    //TODO [BLE 스캐닝 시작 명령 : 필수로 사전, 블루투스 활성 상태 체크 필요함] 
    public void BleScanStart(){
        Log.d("---","---");
        Log.w("//===========//","================================================");
        Log.d("","\n"+"[A_BluetoothScan > BleScanStart() 메소드 : 실시간 비콘 스캐닝 시작]");
        Log.w("//===========//","================================================");
        Log.d("---","---");
        try {
            if(bleList != null){
                if(bleList.size() > 0){
                    bleList.clear();
                }
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
        try {
            //mBluetoothAdapter.startScan(mLeScanCallback); //TODO 롤리팝 이하
            mBluetoothAdapter.getBluetoothLeScanner().startScan(leScanCallback); //TODO 롤리팝 이상
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }




    //TODO [BLE 스캐닝 종료 명령]
    public void BleScanStop(){
        Log.d("---","---");
        Log.e("//===========//","================================================");
        Log.d("","\n"+"[A_BluetoothScan > BleScanStop() 메소드 : 실시간 비콘 스캐닝 종료]");
        Log.e("//===========//","================================================");
        Log.d("---","---");
        try {
            if(mBluetoothAdapter != null){
                //mBluetoothAdapter.stopLeScan(mLeScanCallback); //TODO 롤리팝 이하
                mBluetoothAdapter.getBluetoothLeScanner().stopScan(leScanCallback); //TODO 롤리팝 이상
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
​



    // TODO [블루투스 장치 발견 이벤트 - 롤리팝 이하] 
    private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
        @Override
        public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) {
            runOnUiThread(new Runnable() {
                public void run() {
                    Log.d("---","---");
                    Log.d("//===========//","================================================");
                    Log.d("","\n"+"[A_BluetoothScan > mLeScanCallback() 메소드 : 실시간 BLE 스캔 [롤리팝 이하]]");
                    Log.d("","\n"+"[BLE 스캔 Name] "+" ["+String.valueOf(device.getName())+"]");
                    Log.d("","\n"+"[BLE 스캔 Addr] "+" ["+String.valueOf(device.getAddress())+"]");
                    Log.d("","\n"+"[BLE 스캔 UUID] "+" ["+String.valueOf(device.getUuids())+"]");
                    Log.d("","\n"+"[BLE 스캔 RSSI] "+" ["+String.valueOf(rssi)+"]");
                    Log.d("","\n"+"[BLE 스캔 Record] "+" ["+String.valueOf(new String(scanRecord))+"]");
                    Log.d("//===========//","================================================");
                    Log.d("---","---");
                    //TODO [데이터 조합 실시]
                    try {
                        JSONObject jsonObject = new JSONObject();
                        jsonObject.put("NAME",String.valueOf(device.getName()));
                        jsonObject.put("ADDR",String.valueOf(device.getAddress()));
                        bleList.add(jsonObject.toString());
                    }
                    catch (Exception e){
                        e.printStackTrace();
                    }
                }
            });
        }
    };




    // TODO [블루투스 장치 발견 이벤트 - 롤리팝 이상]
    private ScanCallback leScanCallback = new ScanCallback() {
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        @Override
        public void onScanResult(int callbackType, final ScanResult result) {
            super.onScanResult(callbackType, result);
            final BluetoothDevice device = result.getDevice();

            runOnUiThread(new Runnable() {
                public void run() {
                    Log.d("---","---");
                    Log.d("//===========//","================================================");
                    Log.d("","\n"+"[A_BluetoothScan > leScanCallback() 메소드 : 실시간 BLE 스캔 [롤리팝 이상]]");
                    Log.d("","\n"+"[BLE 스캔 Name] "+" ["+String.valueOf(device.getName())+"]");
                    Log.d("","\n"+"[BLE 스캔 Addr] "+" ["+String.valueOf(device.getAddress())+"]");
                    Log.d("","\n"+"[BLE 스캔 UUID] "+" ["+String.valueOf(device.getUuids())+"]");
                    Log.d("","\n"+"[BLE 스캔 RSSI] "+" ["+String.valueOf(result.getRssi())+"]");
                    Log.d("","\n"+"[BLE 스캔 Record] "+" ["+String.valueOf(result.getScanRecord())+"]");
                    Log.d("//===========//","================================================");
                    Log.d("---","---");

                    //TODO [데이터 조합 실시]
                    try {
                        JSONObject jsonObject = new JSONObject();
                        jsonObject.put("NAME",String.valueOf(device.getName()));
                        jsonObject.put("ADDR",String.valueOf(device.getAddress()));
                        String data = jsonObject.toString();
                        data = data.replaceAll("[,]", "/");
                        if(bleList.contains(data) == false){ //TODO 값을 포함하지 않는 경우만 저장
                            bleList.add(data);
                        }
                    }
                    catch (Exception e){
                        e.printStackTrace();
                    }
                }
            });
        }
    };

/* =========================== */

/* =========================== */

[결과 출력]

/* =========================== */

 

반응형
Comments