투케이2K

43. (ios/swift) 블루투스 (bluetooth) 신호 활성 수행 - CBPeripheralManager 본문

IOS

43. (ios/swift) 블루투스 (bluetooth) 신호 활성 수행 - CBPeripheralManager

투케이2K 2021. 11. 4. 18:04

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT


[필요 설정]


[소스 코드]

import UIKit

import CoreLocation
import CoreBluetooth

class ViewController: UIViewController , CBPeripheralManagerDelegate {
    
    // MARK: - [클래스 설명]
    /*
    1. 블루투스 신호 활성 및 블루투스 신호 활성 종료 실시
    2. 블루투스 신호 활성 시 블루투스 신호를 스캔할 수 있는 장비 목록에 표시됩니다 (안드로이드 폰 및 기타 하드웨어에서 확인 가능)
    */
    
    
    
    // MARK: - [블루투스 신호 활성 필요 변수 정의]
    var centralManager: CBCentralManager! // [블루투스 활성 상태 확인 및 실시간 블루투스 신호 스캔]
    var peripheralManager: CBPeripheralManager! // [실시간 블루투스 신호 활성]
    
    let sendBleLocal = "TWOK" // 블루투스 신호 활성 시 사용 로컬 이름
    let sendBleUuid = CBUUID(string: "B1428E10-9894-4D5E-BB39-9136E124CA10") // 블루투스 신호 활성 시 사용 UUID

    
    
    // MARK: - [액티비티 메모리 로드 수행 실시]
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        print("")
        print("===============================")
        print("[ViewController >> viewDidLoad() :: 뷰 메모리 로드 수행 실시]")
        print("===============================")
        print("")
        
        // [블루투스 권한 설정 퍼미션 확인 실시]
        self.checkBluePermission()
    }

    
    
    // MARK: - [액티비티 화면 종료 상태]
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        print("")
        print("===============================")
        print("[ViewController >> viewDidDisappear() :: 뷰 종료 상태]")
        print("===============================")
        print("")
        
        // [블루투스 신호 스캔 종료]
        self.bluetoothScanStop()
        
        // [블루투스 신호 활성 종료]
        self.bluetoothSendStop()
    }

    
    
    // MARK: - [블루투스 사용 권한 요청]
    func checkBluePermission(){
        print("")
        print("===============================")
        print("[ViewController >> checkBluePermission() :: 블루투스 사용 권한 요청 실시]")
        print("===============================")
        print("")
        self.centralManager = CBCentralManager(delegate: self, queue: nil)
    }
    
    
    
    // MARK: - [블루투스 신호 스캔 시작 실시]
    func bluetoothScanStart(){
        print("")
        print("===============================")
        print("[ViewController >> bluetoothScanStart() :: 블루투스 신호 스캔 시작 실시]")
        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])
    }
    
    
    
    // MARK: - [블루투스 신호 스캔 종료 실시]
    func bluetoothScanStop(){
        print("")
        print("===============================")
        print("[ViewController >> bluetoothScanStop() :: 블루투스 신호 스캔 종료 실시]")
        print("===============================")
        print("")
        if self.centralManager != nil {
            self.centralManager.stopScan()
        }
    }
    
    
    
    // MARK: - [블루투스 신호 활성 시작 실시]
    func bluetoothSendStart(){
        print("")
        print("===============================")
        print("[ViewController >> bluetoothSendStart() :: 블루투스 신호 활성 시작 실시]")
        print("===============================")
        print("")
        self.peripheralManager = CBPeripheralManager(delegate: self, queue: nil, options: nil)
    }
    
    
    
    // MARK: - [블루투스 신호 활성 종료 실시]
    func bluetoothSendStop(){
        print("")
        print("===============================")
        print("[ViewController >> bluetoothSendStop() :: 블루투스 신호 활성 종료 실시]")
        print("===============================")
        print("")
        if self.peripheralManager != nil {
            self.peripheralManager.stopAdvertising()
            self.peripheralManager.removeAllServices()
        }
    }
    
    
    
    // MARK: - [실제로 블루투스 신호 활성 수행 부분]
    func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
        // [블루투스 활성 상태 체크 실시 및 비콘 신호 활성]
        if peripheral.state == .poweredOn {
            peripheralManager.startAdvertising([
                CBAdvertisementDataServiceUUIDsKey: [self.sendBleUuid],
                CBAdvertisementDataLocalNameKey: self.sendBleLocal
            ])
            print("")
            print("===============================")
            print("[ViewController >> peripheralManagerDidUpdateState() :: 블루투스 활성 상태 >> 실시간 블루투스 신호 활성 성공]")
            print("uuid :: ", self.sendBleUuid)
            print("local :: ", self.sendBleLocal)
            print("===============================")
            print("")
        }
        else if peripheral.state == .poweredOff {
            print("")
            print("===============================")
            print("[ViewController >> peripheralManagerDidUpdateState() :: 블루투스 비활성 상태 >> 실시간 블루투스 신호 활성 실패]")
            print("===============================")
            print("")
            self.peripheralManager.stopAdvertising()
        }
    }


    
    // MARK: - [애플리케이션 설정창 이동 실시 메소드]
    func intentAppSettings(content:String){
        // [메인 큐에서 비동기 방식 실행 : UI 동작 실시]
        DispatchQueue.main.async {
            // 앱 설정창 이동 실시
            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("[ViewController >> 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 팝업창 활성 실시]
            self.present(settingsAlert, animated: false, completion: nil)
        }
    }
    
} // [클래스 종료 실시]


// MARK: - [블루투스 활성 상태 체크 실시]
extension ViewController: CBCentralManagerDelegate {
    // [블루투스 상태 및 권한 부여 확인 실시]
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        switch central.state {
        case .unknown:
            print("")
            print("===============================")
            print("[ViewController >> CBCentralManager :: 블루투스 상태 알수 없음]")
            print("===============================")
            print("")
        case .resetting:
            print("")
            print("===============================")
            print("[ViewController >> CBCentralManager :: 블루투스 서비스 리셋]")
            print("===============================")
            print("")
        case .unsupported:
            print("")
            print("===============================")
            print("[ViewController >> CBCentralManager :: 기기가 블루투스를 지원하지 않습니다]")
            print("===============================")
            print("")
        case .unauthorized:
            print("")
            print("===============================")
            print("[ViewController >> CBCentralManager :: 블루투스 사용 권한 확인 필요]")
            print("===============================")
            print("")
            // [앱 블루투스 권한 사용 설정창 이동]
            self.intentAppSettings(content: "블루투스 사용 권한을 허용해주세요")
        case .poweredOff:
            print("")
            print("===============================")
            print("[ViewController >> CBCentralManager :: 블루투스 비활성 상태]")
            print("===============================")
            print("")
            // [자동으로 시스템에서 비활성 상태 알림 및 팝업창 호출 실시]
        case .poweredOn:
            print("")
            print("===============================")
            print("[ViewController >> CBCentralManager :: 블루투스 활성 상태]")
            print("===============================")
            print("")
            // [블루투스 스캔 실시]
            //self.bluetoothScanStart()
            
            // [블루투스 신호 활성 실시]
            self.bluetoothSendStart()

        @unknown default:
            print("")
            print("===============================")
            print("[ViewController >> CBCentralManager :: 블루투스 CASE DEFAULT]")
            print("===============================")
            print("")
        }
    }
    // [블루투스 스캔 장치를 찾았을 때 실행되는 이벤트]
    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){
        print("")
        print("===============================")
        print("[ViewController >> 블루투스 스캔 수행]")
        print("블루투스 스캔 [UUID] :: \(String(peripheral.identifier.uuidString))]")
        print("블루투스 스캔 [RSSI] :: \(String(RSSI.intValue))]")
        print("블루투스 스캔 [NAME] :: \(String(peripheral.name ?? ""))]")
        print("===============================")
        print("")

        // [특정 UUID 를 찾은 경우 : 스캔 중지]
        let BUUID : String = String(peripheral.identifier.uuidString.uppercased().trim())
        if BUUID == "28B282ED-E609-4582-9224-9E0E93174079" {
            print("")
            print("===============================")
            print("[ViewController >> 블루투스 특정 값 스캔 완료]")
            print("특정 블루투스 [UUID] :: \(String(peripheral.identifier.uuidString))]")
            print("특정 블루투스 [RSSI] :: \(String(RSSI.intValue))]")
            print("특정 블루투스 [NAME] :: \(String(peripheral.name ?? ""))]")
            print("===============================")
            print("")
            
            // [블루투스 스캔 종료 실시]
            self.bluetoothScanStop()
        }
    }
}

 


[결과 출력]


 

반응형
Comments