투케이2K

11. (ios/swift) 실시간 블루투스 목록 스캔 실시 - bluetooth scan 본문

IOS

11. (ios/swift) 실시간 블루투스 목록 스캔 실시 - bluetooth scan

투케이2K 2021. 10. 17. 17:29

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT


[방법 설명]


[소스 코드]

import UIKit
import AVFoundation
import Photos
import CoreLocation
import CoreBluetooth

class MainController: UIViewController {

    /*
    MARK: - [블루투스 목록 스캔 및 블루투스 연결 수행]
    1. 필요 권한 요청 [info] :
       - Privacy - Bluetooth Always Usage Description
       - Privacy - Bluetooth Peripheral Usage Description
    
    2. 필요 import :
       - import CoreBluetooth
       - import UIKit
    */
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        print("")
        print("===============================")
        print("[MainController > viewDidLoad() : 뷰 로드 실시]")
        print("===============================")
        print("")
        
        // [블루투스 권한 설정 퍼미션 확인 실시]
        checkBluePermission()
    }


    // [블루투스 사용 권한 요청]
    var centralManager: CBCentralManager!
    var devicePeripheral: CBPeripheral!
    func checkBluePermission(){
        print("")
        print("===============================")
        print("[MainController > checkBluePermission() : 블루투스 사용 권한 요청 실시]")
        print("===============================")
        print("")
        self.centralManager = CBCentralManager(delegate: self, queue: nil)
    }


    // [애플리케이션 설정창 이동 실시 메소드]
    func intentAppSettings(content:String){
        // 앱 설정창 이동 실시
        let settingsAlert = UIAlertController(title: "권한 설정 알림", message: content, preferredStyle: UIAlertController.Style.alert)
        
        let okAction = UIAlertAction(title: "확인", style: .default) { (action) in
            // [확인 버튼 클릭 이벤트 내용 정의 실시]
            if let url = URL(string: UIApplication.openSettingsURLString) {
                print("")
                print("===============================")
                print("[MainController > intentAppSettings() : 앱 설정 화면 이동]")
                print("===============================")
                print("")
                UIApplication.shared.open(url, options: [:], completionHandler: nil)
            }
        }
        settingsAlert.addAction(okAction) // 버튼 클릭 이벤트 객체 연결
        
        let noAction = UIAlertAction(title: "취소", style: .default) { (action) in
            // [취소 버튼 클릭 이벤트 내용 정의 실시]
            return
        }
        settingsAlert.addAction(noAction) // 버튼 클릭 이벤트 객체 연결
        
        // [alert 팝업창 활성 실시]
        present(settingsAlert, animated: false, completion: nil)
    }
}

// [블루투스 상태 체크 실시]
extension MainController: CBCentralManagerDelegate {
    // [블루투스 상태 및 권한 부여 확인 실시]
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        switch central.state {
        case .unknown:
            print("")
            print("===============================")
            print("[MainController > CBCentralManager : 블루투스 상태 알수 없음]")
            print("===============================")
            print("")
        case .resetting:
            print("")
            print("===============================")
            print("[MainController > CBCentralManager : 블루투스 서비스 리셋]")
            print("===============================")
            print("")
        case .unsupported:
            print("")
            print("===============================")
            print("[MainController > CBCentralManager : 기기가 블루투스를 지원하지 않습니다]")
            print("===============================")
            print("")
        case .unauthorized:
            print("")
            print("===============================")
            print("[MainController > CBCentralManager : 블루투스 사용 권한 확인 필요]")
            print("===============================")
            print("")
            // [앱 블루투스 권한 사용 설정창 이동]
            self.intentAppSettings(content: "블루투스 사용 권한을 허용해주세요")
        case .poweredOff:
            print("")
            print("===============================")
            print("[MainController > CBCentralManager : 블루투스 비활성 상태]")
            print("===============================")
            print("")
            // [자동으로 시스템에서 비활성 상태 알림 및 팝업창 호출 실시]
        case .poweredOn:
            print("")
            print("===============================")
            print("[MainController > CBCentralManager : 블루투스 활성 상태]")
            print("===============================")
            print("")
            // [블루투스 스캔 실시]
            //self.centralManager.scanForPeripherals(withServices: nil)
            //self.centralManager.scanForPeripherals(withServices: nil, options: nil)
            //self.centralManager?.scanForPeripherals(withServices: nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey:true])
            self.centralManager?.scanForPeripherals(withServices: nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey:false])
        @unknown default:
            print("")
            print("===============================")
            print("[MainController > CBCentralManager : 블루투스 CASE DEFAULT]")
            print("===============================")
            print("")
        }
    }
    //장치를 찾았을 때 실행되는 이벤트
    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){
        print("")
        print("===============================")
        print("[MainController > 블루투스 스캔 [UUID] : \(String(peripheral.identifier.uuidString))]")
        print("[MainController > 블루투스 스캔 [RSSI] : \(String(RSSI.intValue))]")
        print("[MainController > 블루투스 스캔 [NAME] : \(String(peripheral.name ?? ""))]")
        print("===============================")
        print("")

        // [특정 UUID 를 찾은 경우 : 스캔 중지]
        if String(peripheral.identifier.uuidString).contains("DB809C5F-9598-16BA-563B-E329FDFA17A3") == true {
            // [블루투스 스캔 종료 로직]
            self.centralManager.stopScan()
            print("")
            print("===============================")
            print("[MainController > 블루투스 스캔 종료]")
            print("===============================")
            print("")

            // [블루투스 연결 로직]
            /*self.devicePeripheral = peripheral // 객체 생성
            //self.devicePeripheral.delegate = self // 딜리게이트 지정
            self.centralManager.stopScan() // 블루투스 스캔 종료
            self.centralManager.connect(self.devicePeripheral) // 디바이스 연결 수행
            print("")
            print("===============================")
            print("[MainController >> 블루투스 연결 수행 실시]")
            print("[UUID : \(String(peripheral.identifier.uuidString))]")
            print("===============================")
            print("")*/
        }
    }
    // [장치와 연결 되었을 경우 발생하는 이벤트]
    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        print("")
        print("===============================")
        print("[MainController >> 블루투스 연결 완료 상태]")
        print("[MainController >> 블루투스 연결 [UUID] :: \(String(peripheral.identifier.uuidString))]")
        print("===============================")
        print("")

        // [모든 서비스를 검색 수행 - nil 값]
        self.devicePeripheral.discoverServices(nil)
        
        // [블루투스 연결 끊기]
        self.centralManager.cancelPeripheralConnection(peripheral)
    }
}

 


[결과 출력]


 

반응형
Comments