Notice
Recent Posts
Recent Comments
Link
투케이2K
43. (ios/swift) 블루투스 (bluetooth) 신호 활성 수행 - CBPeripheralManager 본문
[개발 환경 설정]
개발 툴 : 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()
}
}
}
[결과 출력]
반응형
'IOS' 카테고리의 다른 글
Comments