iOS 블루투스 개발: 블루투스 연결 및 데이터 읽기 및 쓰기
블루투스 개발은 말하기는 쉽지만 말하기는 조금 어렵습니다. 블루투스를 처음 개발하기 전에 개발자는 먼저 블루투스 개발의 개념을 이해하고 전체 프로세스를 이해하고 숙달해야 합니다. Bluetooth 개발 과정을 통해 Bluetooth 개발을 빠르게 시작할 수 있습니다.
? 블루투스 개발은 관리자 모드와 센터 모드의 두 가지 모드로 구분됩니다. 관리자 모드는 iPhone을 주변 장치로 사용하여 직접 서비스와 기능을 만든 다음 다른 장치를 사용하여 iPhone에 연결하는 것과 동일하며 대부분의 경우 중앙 모드가 사용됩니다. 센터 모드는 상당히 iPhone을 호스트로 사용하여 Bluetooth 주변 장치를 연결합니다. 다음은 센터 모드를 사용하여 Bluetooth 개발 예를 설명합니다.
여기서는 제가 직접 만든 iOS 개발 학습 그룹인 680565220을 추천하고 싶습니다. 그룹의 모든 사람들이 iOS 개발을 배우고 있다면 참여를 환영합니다. 오늘 이 사례는 그룹 파일에 업로드되었습니다. 모두가 소프트웨어 개발자이며 최신 2018 iOS 고급 자료 사본 및 고급 개발 튜토리얼을 포함하여 유용한 정보를 수시로 공유합니다. 혼자서
1. 블루투스 개발에 관한 몇 가지 중요한 이론적 개념:
1. 서비스: 블루투스 주변기기가 외부 세계로 브로드캐스트할 때 하나의 서비스가 있어야 하며 때로는 서비스가 있을 수도 있습니다. 서비스에는 몇 가지 특성이 있으며, 서비스는 모듈의 창으로 이해될 수 있습니다.
2. 특성: 서비스 아래에는 여러 특성이 있을 수 있습니다. 특성은 특정한 것으로 이해될 수 있습니다. 기능을 구현하는 창에서 일반 기능은 특성 값, 즉 기능과 외부 세계 간의 상호 작용을 위한 최소 단위인 값을 갖습니다.
? 3. UUID: 블루투스의 고유 식별자로, 서로 다른 서비스를 구별하기 위해 사용되며 특성은 UUID로 표시됩니다.
2. 블루투스 연결의 주요 단계
?1. 블루투스 관리를 위한 CBCentralManager 인스턴스를 생성합니다.
?2. p>
?3. 주변 장치를 연결합니다.
?4. 서비스 특성을 얻습니다. p>
?6. 주변 장치에서 데이터를 읽습니다.
?7. 주변 장치에 데이터를 보냅니다.
3. 블루투스 연결 및 데이터 읽기 및 쓰기를 위한 구체적인 단계
?1. Apple 시스템 블루투스 프레임워크 가져오기
#import
? 2. 두 개의 Bluetooth 프레임워크와 관련된 프로토콜을 따릅니다.
?3. 두 개의 새로운 인스턴스 속성과 하나의 특성 속성을 만듭니다.
@property(비원자적, 강력함) CBCentralManager *centralManager; //중앙 관리자
@property(비원자, 강함) CBPeripheral *peripheral; //주변 장치에 연결됨
@property(비원자적, 강함) CBCharacteristic *특성
p> p>?4. 블루투스 관리를 위해 CBCentralManager 초기화
- (void)viewDidLoad {
[super viewDidLoad];
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()]; //블루투스 관리를 위한 인스턴스 생성
}
?//센터 관리자가 초기화되면 다음이 트리거됩니다. 이 프록시 메소드는 휴대폰의 블루투스 상태를 확인하는 데 사용됩니다.
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
// 블루투스를 사용할 수 있습니다. 주변 장치 검색 시작
if (central.state == CBManagerStatePoweredOn) {
NSLog(@"Bluetooth available");
//중앙 관리자 이후 성공적으로 켜짐 일부 작업 수행
//주변 장치 검색 및 검색
//SERVICE_UUID를 기반으로 주변 장치 검색 SERVICE_UUID가 설정되지 않은 경우 모든 Bluetooth 장치 검색
/ / [self.centralManager startAdvertising:@{CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:SERVICE_UUID]]}];
[central scanForPeripheralsWithServices:nil options:nil];
} p>
if(central.state == CBManagerStateUnsupported) {
NSLog(@"이 장치는 블루투스를 지원하지 않습니다.");
}
if (central.state == CBManagerStatePoweredOff) {
NSLog(@"블루투스가 꺼졌습니다");
}
if (central.state == CBManagerStateUnknown) {
NSLog(@"현재 블루투스 상태가 불분명합니다.");
}
if (central.state == CBManagerStateUnauthorized) {
NSLog(@"블루투스가 승인되지 않음");
}
}
?
주변 장치 검색
//스캔 작업을 실행한 후 주변 장치를 스캔하면 다음 프로토콜 메서드가 자동으로 호출됩니다.
/** 주변 장치가 요구 사항을 충족하는 경우 콜백 */
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral 광고Data:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
NSLog (@"%@====",peripheral.name);
//주변기기 이름을 기준으로 연결된 블루투스 장치를 선택적으로 필터링
if ( [peripheral.name hasPrefix:@"TEAMOSA"]) {
//주변기기가 전달하는 브로드캐스트 데이터는 여기에서 추가로 처리됩니다.
if ([self.peripheraNames containObject:peripheral. name]) {
//배열에 포함되어 있으면 추가되지 않습니다.
return;
}
//주변 장치 이름에 추가합니다. 배열에
[self.peripheraNames addObject:peripheral.name];
//주변 장치의 수명 주기가 수명 주기와 일치하도록 주변 장치를 표시합니다. 컨트롤러
self.peripheral =peripheral;
// 주변 장치는 이름을 기준으로 필터링할 수 있습니다.
// [central connectPeripheral:peripheral options:nil] ;
}
// 주변 장치 연결
// [central connectPeripheral:주변 장치 옵션:nil];
}
6. 주변 장치 연결
//주변 장치에 연결합니다. 중앙 관리자가 주변 장치에 성공적으로 연결되면 이 프로토콜 메서드가 호출됩니다.
/** 연결 성공*/
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
//연결 성공 후 , 서비스 및 기능을 검색할 수 있습니다. 중앙 관리 장치의 검색 작업을 중지합니다. 그렇지 않으면 연결된 주변 장치와 통신할 때 다른 주변 장치가 브로드캐스트하고 연결 조건을 충족하면 iOS 장치도 이 장치에 연결됩니다. 대다 연결)으로 인해 데이터 혼란이 발생합니다.
//스캐닝 작업 중지
[self.centralManager stopScan];
//주변 장치 프록시 설정
Peripheral.delegate = self;
// UUID를 기반으로 서비스 찾기
// [주변 장치 discoverServices:@[[CBUUID UUIDWithString:SERVICE_UUID]]];
// 주변 장치 검색 서비스, nil 전달은 필터링이 없음을 의미하며 모든 주변 서비스를 한 번에 읽습니다.
[peripheral discoverServices:nil];
NSLog(@"%s, line = %d, % @=연결 성공", __FUNCTION__, __LINE__,peripheral.name);
}
//주변 장치 연결 실패
/** 연결 실패 콜백 */
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)주변 오류:(NSError *)error {
NSLog(@" %s, line = % d, %@=연결 실패", __FUNCTION__, __LINE__,peripheral.name);
}
//연결 끊김 연결 끊김
/** 연결 끊기* /
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)주변 오류:(nullable NSError *)error {
NSLog(@"%s, line = %d, %@=disconnect", __FUNCTION__, __LINE__,peripheral.name);
// 연결 해제를 다시 연결하도록 설정할 수 있습니다.
[central connectPeripheral:peripheral options:nil] ;
}
7. 주변 장치 서비스 및 특성 얻기
/** 검색 서비스*/
- (void)peripheral :(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
// 주변 장치의 모든 서비스를 트래버스합니다.
for (CBService *service in Peripheral.services) {
// NSLog(@"All services: %@",service);
}
/ / 여기에는 서비스가 하나만 있으므로 직접 가져옵니다
}
/ / p>
CBService *service = Peripheral.services.lastObject;
// UUID를 기반으로 서비스의 특성 찾기
// [주변 장치 discoverCharacteristics:@[[CBUUID UUIDWithString :CHARACTERISTIC_UUID]] forService:service];
// [p
eripheral discoverCharacteristics:@[service.UUID] forService:service];
[peripheral discoverCharacteristics:nil forService:service];
}
8. periphery 장치가 데이터를 읽습니다
// 기능 값을 업데이트할 때 호출됩니다(블루투스에서 전송되는 모든 데이터는 이 콜백을 거쳐야 합니다. 간단히 말해서 이 메서드는 data) 주변 장치에서 데이터를 읽을지 여부를 결정할 수 있습니다.
/** 데이터 콜백 수신*/
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error: (NSError *)error {
// if (characteristic == @"원하는 기능 또는 찾은 기능의 UUID") {
// //특성 .value는 원하는 데이터입니다.
// }
if ([peripheral.name hasPrefix:@"TEAMOSA"]){
NSData *data = 특성.값;
NSString *value = [self 16진수 문자열:데이터];
// NSLog(@"characteristic(read): %@, data: %@ , 값 : %@", 특성, 데이터, 값);
}
// 주변 장치에서 보낸 데이터를 가져옵니다
// NSData * 데이터 = 특성.값;
// self.textFild.text = [[NSString alloc] initWithData:data 인코딩:NSUTF8StringEncoding];
}
9 , 주변 장치로 데이터 보내기(쓰기)
//이 메서드를 버튼의 응답에 넣을 수도 있고, 기능을 찾았을 때 쓸 수도 있습니다. 비즈니스 요구에 맞게
p>//[self.peripherale writeValue:_batteryData forCharacteristic:self.characteristic type:CBCharacteristicWriteWithResponse];//첫 번째 매개변수는 연결된 Bluetooth 장치입니다. write to; 이 응답을 통해 쓰기 성공 여부를 기록하는 데 사용되는 매개변수입니다. 특성의 속성이 데이터 쓰기를 지원하는지 여부에 유의해야 합니다.
/** 데이터 콜백 쓰기*/ p>
- (무효) Peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(nonnull CBCharacteristic *)특성 오류:(nullable NSError *)error {
/*
typedef NS_OPTIONS(NSUInteger, CBCharacterist
icProperties) {
CBCharacteristicPropertyBroadcast = 0x01,
CBCharacteristicPropertyRead = 0x02,
CBCharacteristicPropertyWriteWithoutResponse = 0x04,
CBCharacteristicPropertyWrite = 0x08,
CBCharacteristicPropertyNotify = 0x10,
CBCharacteristicPropertyIndicate = 0x20,
CBCharacteristicPropertyAuthenticatedSignedWrites = 0x40,
CBCharacteristicPropertyExtendedProperties = 0x80,
CBCharacteristicPropertyNotifyEncryptionRequired 불가능 (NA, 6_0) = 0x100,
CBCharacteristicPropertyIndicateEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0) = 0x200
};
특성에 대한 권한을 인쇄합니다(characteristic.properties ), 여러 가지 값을 가질 수 있는 NS_OPTIONS의 열거형임을 알 수 있습니다.
일반적인 것은 읽기, 쓰기, 알림, 표시 등입니다. 처음 두 개는 읽기 및 쓰기 권한이고, 후자 두 개는 알림, 두 개의 다른 알림 방법
*/
// NSLog(@"%s, line = %d, char.pro = %d", __FUNCTION__, __LINE__,characteristic.properties);
// 이때 열거형 속성은 NS_OPTIONS이므로 하나의 열거형이 여러 타입에 해당할 수 있으므로 판단할 수는 없다. =으로 만들어졌지만 사용해야 합니다. &
포함 NSLog(@"write value Success(write Success): %@", 특성);
}
10. Bluetooth 주변 장치 쓰기 데이터 메소드에 대한 특정 호출, 여기서의 예는 버튼 클릭 이벤트에서 처리를 호출하는 것입니다.
//버튼 클릭 이벤트 보내기
- (void)sendClick {
if (!self.characteristic) {
return;
}
_tempValue = [NSString stringWithFormat:@"%.0f ", ProgressView.centigradeDegree ];
_timeValue = [NSString stringWithFormat:@"%.0ld", (long)progressView1.timeDegree];
NSString *ttData = [NSString stringWithFormat: @"%@, %@U", _tempValue, _timeValue];
// NSString *aaa = [DataCoverTool CoverFrom
StringToHexStr:ttData];
// NSData 유형을 사용하여 쓰기
// NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arry];
NSData *data = [ttData dataUsingEncoding:NSUTF8StringEncoding];
// NSData *data = [self dataWithString:ttData];
//위 특성을 기반으로 데이터 쓰기 self.characteristic p>
[self.peripheral writeValue:data forCharacteristic:self.characteristic 유형:CBCharacteristicWriteWithResponse];