Notice
Recent Posts
Recent Comments
Link
투케이2K
11. (ios/swift) 실시간 블루투스 목록 스캔 실시 - bluetooth scan 본문
[개발 환경 설정]
개발 툴 : 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)
}
}
[결과 출력]
반응형
'IOS' 카테고리의 다른 글
13. (ios/swift) 실시간 비콘 beacon 신호 활성 실시 (0) | 2021.10.19 |
---|---|
12. (ios/swift) 실시간 비콘 beacon 목록 스캔 실시 (4) | 2021.10.18 |
10. (ios/swift) 퍼미션 권한 요청 수행 실시 - info , permission (0) | 2021.10.17 |
9. (ios/swift) 현재 연결된 네트워크 상태 체크 실시 - NWPathMonitor (0) | 2021.10.17 |
8. (ios/swift) timer 타이머 사용해 실시간 반복 작업 수행 실시 (0) | 2021.10.16 |
Comments