Simple Battery-Level Peripheral
간단한 배터리 수준 주변 장치
This first example programs a central iOS device to look for and connect to a simple remote peripheral.
이 첫 번째 예는 간단한 원격 주변 장치를 찾아 연결하도록 중앙 iOS 장치를 프로그래밍합니다.
The role of the remote peripheral is played by a Bluegiga BLE112 hardware module (see “Bluegiga’s BLE112/BLE113 Modules” on page 81 for more information in this module).
원격 주변 장치 역할은 Bluegiga BLE112 하드웨어 모듈에 의해 수행됩니다 (이 모듈에 대한 자세한 내용은 81페이지의 "Bluegiga의 BLE112/BLE113 모듈" 참조).
The iOS device will act as a GATT client and the peripheral as a GATT server (see “Roles” on page 51).
iOS 장치는 GATT 클라이언트 역할을 하고 주변 장치는 GATT 서버 역할을 합니다 (51페이지의 "역할" 참조).
The Bluegiga BLE112 module evaluation board used here is available from many online suppliers as part of a development kit for the BLE112 module family (part #: DKBLE112).
여기에 사용된 Bluegiga BLE112 모듈 평가 보드는 일부 온라인 공급업체로부터 구할 수 있습니다. BLE112 모듈 제품군용 개발 키트 (부품 번호: DKBLE112).
The kit includes a number of prebuilt sensors and inputs for quick evaluation.
이 키트에는 빠른 평가를 위해 사전 구축된 여러 센서와 입력이 포함되어 있습니다.
Alternatively, Jeff Rowberg’s BLE112 Bluetooth Low Energy board is much less expensive.
또는 Jeff Rowberg의 BLE112 Bluetooth Low Energy 보드는 훨씬 저렴합니다.
This is an open source hardware solution, so all the hardware design details are available from the same source.
이는 오픈소스 하드웨어 솔루션이므로 모든 하드웨어 설계 세부 정보를 동일한 소스에서 얻을 수 있습니다.
The BLE112 module performing the function of the BLE peripheral in this case reads a voltage set by adjusting a small potentiometer (circled in the upper-left corner of Figure 9-1) using the on-board A/D converter and stores that value as the BLE “battery level” characteristic (scaled from 0 to 100%) via the BLE battery_level service.
이 경우 BLE 주변 기기의 기능을 수행하는 BLE112 모듈은 온보드 A/D 컨버터를 사용하여 작은 전위차계 (그림 9-1의 왼쪽 상단 모서리에 동그라미 표시)를 조정하여 설정된 전압을 읽고 BLE battery_level 서비스를 통해 해당 값을 BLE "배터리 수준" 특성 (0~100% 범위)으로 저장합니다.
The iOS app must then to read the “battery level” stored on the BLE peripheral and make it available for use by the app. (For more information on services and characteristics, see Chapter 4).
그런 다음 iOS 앱은 BLE 주변 장치에 저장된 "배터리 수준"을 읽고 이를 앱에서 사용할 수 있도록 해야 합니다. (서비스 및 특징에 대한 자세한 내용은 4장을 참조하세요.).
We are using the term battery level, rather than potentiometer, because a “battery level” peripheral is one of the predefined services and associated characteristics in BLE.
전위차계 대신 배터리 레벨이라는 용어를 사용하는 이유는 "배터리 레벨" 주변 장치가 BLE의 사전 정의된 서비스 및 관련 특성 중 하나이기 때문입니다.
Though there is no requirement to use a predefined profile, doing so is convenient for this discussion.
미리 정의된 프로필을 사용해야 한다는 요구 사항은 없지만 이 논의에서는 그렇게 하는 것이 편리합니다.
For this simple application, the key class references within the Core Bluetooth framework include CBCentralManager (an abstraction of the central manager role in BLE on the iOS device) and CBPeripheral (an abstraction of the remote peripheral on the iOS device).
이 간단한 애플리케이션의 경우, Core Bluetooth 프레임워크 내의 주요 클래스 참조에는 CBCentralManager (iOS 기기의 BLE에서 중앙 관리자 역할에 대한 추상화)와 CBPeripheral(iOS 기기의 원격 주변 장치에 대한 추상화)이 포함됩니다.
The code also includes the supporting classes CBService and CBCharacteristic, because you’ll need to know which services and related characteristics are available on the remote peripheral by discovering them (see “Service and Characteristic Discovery” on page 69).
코드에는 지원 클래스 CBService 및 CBCharacteristic도 포함되어 있습니다. 그 이유는 원격 주변 장치에서 어떤 서비스 및 관련 특성을 검색하여 사용할 수 있는지 알아야 하기 때문입니다 (69페이지의 "서비스 및 특성 검색" 참조).
Figure 9-2 shows the relationship between the services and characteristics programmed into the BLE remote peripheral device and the CBPeripheral objects.
그림 9-2는 BLE 원격 주변 장치와 CBPeripheral 객체에 프로그래밍된 서비스 및 특성 간의 관계를 보여줍니다.
For convenience, the code in this example includes a few predefined services and characteristics (e.g., the Battery Service) from the BLE specification, which use 16-bit UUIDs instead of vendor-specific 128-bit UUIDs (see “UUIDs” on page 52).
편의를 위해 이 예제의 코드에는 공급업체별 128비트 UUID 대신 16비트 UUID를 사용하는 BLE 사양의 몇 가지 사전 정의된 서비스 및 특성 (예: 배터리 서비스)이 포함되어 있습니다 (52페이지의 "UUID" 참조).
For more information on SIG-specified services and characteristics, the Bluetooth Developer Portal provides a complete list of all predefined services and adopted characteristics.
SIG 지정 서비스 및 특성에 대한 자세한 내용은 Bluetooth 개발자 포털에서 사전 정의된 모든 서비스 및 채택된 특성의 전체 목록을 제공합니다.
Scanning for Remote Peripherals
원격 주변 장치 스캔하기
To get started, you’ll first need to allocate an instance of the CBCentralManager and start the BLE scanning (see “Advertising and Scanning” on page 19) operation for the battery level service:
시작하려면 먼저 CBCentralManager 인스턴스를 할당하고 배터리 수준 서비스에 대한 BLE 스캐닝 (19페이지의 "광고 및 스캐닝" 참조) 작업을 시작해야 합니다.
First, you use Core Bluetooth framework to create a list (NSarray) of the service UUIDs of interest, named services in this case.
먼저, Core Bluetooth 프레임워크를 사용하여 관심 있는 서비스 UUID 목록 (NSarray)을 생성합니다. 이 경우 서비스라는 이름이 붙습니다.
You will need to convert the UUID strings into CBUUID objects corresponding to UUIDs using the UUIDWithString method.
UUIDWithString 메소드를 사용하여 UUID 문자열을 UUID에 해당하는 CBUUID 객체로 변환해야 합니니다.
CBUUID also converts the predefined 16-bit service and characteristic UUIDS into the their fully formed 128-bit equivalents (for more information, see “UUIDs” on page 52).
CBUUID는 또한 사전 정의된 16비트 서비스 및 특성 UUIDS를 완전히 구성된 128비트 서비스로 변환합니다 (자세한 내용은 52페이지의 "UUID" 참조).
Next, the CBCentralManager object is instantiated and the list of UUID objects is provided as the first parameter for its scanForPeripheralsWithServices method.
다음으로 CBCentralManager 객체가 인스턴스화하고 UUID 객체 목록이 해당 scanForPeripheralsWithServices 메서드의 첫 번째 매개 변수로 제공됩니다.
In this case, the app scans for just two services, the device info service (UUID16=0x180A) and the battery level service (UUID16=0x180f).
이 경우 앱은 장치 정보 서비스 (UUID16=0x180A)와 배터리 수준 서비스 (UUID16=0x180f)라는 두 가지 서비스만 검색합니다.
Only peripherals that include the required service UUIDs in their advertising data (see Table 3-3) will be returned as found.
광고 데이터 (표 3-3 참조)에 필수 서비스 UUID를 포함하는 주변 장치만 찾은 대로 반환됩니다.
Note that if the scanForPeripheralsWithSevices method were given nil for the first parameter instead of the list of CBUUIDs of interest (services), it would return all BLE peripherals in range.
scanForPeripheralsWithSevices 메서드의 첫 번째 매개변수에 관심 있는 CBUUID (서비스) 목록 대신 nil이 지정된 경우 범위 내의 모든 BLE 주변 장치가 반환됩니다.
This is generally not a good practice, unless you really want to explore all the possible peripherals with services, because it works the BLE radio hardware more, which decreases battery life.
서비스를 통해 가능한 모든 주변 장치를 실제로 탐색하려는 경우가 아니면 일반적으로 이는 좋은 방법이 아닙니다. BLE 무선 하드웨어를 더 많이 작동시켜 배터리 수명을 단축시키기 때문입니다.
Connecting to Remote Peripherals
원격 주변 장치에 연결
When a peripheral of interest is discovered in the scanning process, the centralManager invokes didDiscoverPeripheral, which is where you include the delegate method connectPeripheral.
스캐닝 프로세스에서 관심 있는 주변 기기가 발견되면 centralManager는 didDiscoverPeripheral을 호출하는데, 여기에 delegate 메서드 connectPeripheral을 포함합니다.
This method returns associated instances of peripheral objects that can be examined later using CBPeripheral methods:
이 메서드는 나중에 CBPeripheral 메서드를 사용하여 검사할 수 있는 주변 체의 연결된 인스턴스를 반환합니다.
It is good practice to stop scanning (using [self.centralManager stopScan]) after the peripheral of interest is found, again because it preserves battery power.
관심 있는 주변 장치를 찾은 후에는 스캔을 중지하는 것이 좋습니다 ([self.centralManager stopScan] 사용). 이는 배터리 전원을 절약하기 때문입니다.
Of course, if you need to find more than one peripheral, modify the logic in this example.
물론 둘 이상의 주변 장치를 찾아야 하는 경우 이 예의 논리를 수정하십시오.
Looking Up Services Associated with a Remote Peripheral
원격 주변 장치와 관련된 서비스 검색
After the peripherals are discovered and the peripheral object instantiated, you need to create related service objects and associated characteristics:
주변 장치가 검색되고 주변 체가 인스턴스화되면 관련 서비스 객체 및 관련 특성을 생성해야 합니다.
In this code, the centralManager calls didConnectPeripheral and instantiates it when a connection has been established.
이 코드에서 centralManager는 didConnectPeripheral을 호출하고 연결이 설정되면 이를 인스턴스화합니다.
The delegate is set for the peripheral and noted in the log.
대리인은 주변 장치에 대해 설정되고 로그에 기록됩니다.
Associated with Services Core Bluetooth creates a CBService object for each discovered service by calling didDiscoverServices.
서비스 코어와 연결됨 Bluetooth는 didDiscoverServices를 호출하여 검색된 각 서비스에 대해 CBService 객체를 생성합니다.
The following code discovers characteristics (see “Service and Characteristic Discovery” on page 69) and stores them in an array of CBCharacteristic objects using the discoverCharacteristics method from the CBPeripheral class:
다음 코드는 특성을 검색하고 (69페이지의 "서비스 및 특성 검색" 참조) CBPeripheral 클래스의 discoverCharacteristics 메서드를 사용하여 이를 CBCharacteristic 객체 배열에 저장합니다.
Use caution if you pass nil as a parameter to [peripheral discoverServices:nil] and [peripheral discoverCharacteristics:nil forService:service], because the iOS device will then try to discover all the services and all the characteristics on the peripheral.
[peripheral discoverServices:nil] 및 [peripheral discoverCharacteristics:nil forService:service]에 매개변수로 nil을 전달하는 경우 iOS 기기가 주변 기기의 모든 서비스와 모든 특성을 검색하려고 시도하므로 주의하세요.
This can waste battery power and time if the remote peripheral implements many more services and associated characteristics than the ones you’re looking for.
원격 주변 장치가 사용자가 원하는 것보다 더 많은 서비스 및 관련 특성을 구현하는 경우 배터리 전력과 시간이 낭비될 수 있습니다.
That’s not a problem in this case, because we’re implementing only the ones of interest on the peripheral side.
이 경우에는 문제가 되지 않습니다. 왜냐하면 우리는 주변 장치 측에서 관심 있는 항목만 구현하기 때문입니다.
But if it could be a problem in your particular application, use lists of services and characteristics instead.
그러나 특정 애플리케이션에서 문제가 될 수 있는 경우 대신 서비스 및 특성 목록을 사용하십시오.
Once the services of interest and the associated characteristics are discovered, you need to read the characteristic’s values and make them available to the app.
관심 있는 서비스 및 관련 특성이 발견되면 특성의 값을 읽고 이를 앱에서 사용할 수 있도록 해야 합니다.
You can get the values directly using the readValueForCharacteristic: method, which is a good approach if the remote peripheral characteristic is static.
readValueForCharacteristic: 메서드를 사용하여 값을 직접 얻을 수 있습니다. 이는 원격 주변 장치 특성이 정적인 경우 좋은 접근 방식입니다.
However, if the characteristic changes over time, as the battery level does, you should use the BLE notifications feature, described in “Server-Initiated Updates” on page 72.
하지만 배터리 수준과 같이 시간이 지남에 따라 특성이 변하는 경우 72페이지의 "서버 시작 업데이트"에 설명된 BLE 알림 기능을 사용해야 합니다.
When this is done for the battery level characteristic, the application will be notified only when the value of the battery level changes.
배터리 잔량 특성에 대해 이를 수행하면 배터리 잔량 값이 변경되는 경우에만 애플리케이션에 알림이 전달됩니다.
This avoids periodically polling the remote peripheral for changes, which can be hard on the battery life of the central iOS device because it creates unnecessary radio traffic.
이렇게 하면 원격 주변 기기에서 변경 사항을 주기적으로 폴링하는 작업을 피할 수 있습니다. 폴링 작업으로 인해 불필요한 무선 트래픽이 생성되어 중앙 iOS 기기의 배터리 수명이 짧아질 수 있습니다.
You enable BLE notifications for a particular characteristic on the remote peripheral using the setNotifyValue:forCharacteristic: method (which writes to the corresponding CCCD on the peripheral, as explained in “Client Characteristic Configuration Descriptor” on page 62), as shown in the following code for the battery level Simple Battery-Level Peripheral characteristic (again, because the manufacturing data is static, it makes sense to use readValueForCharacteristic: for that):
다음 코드에서 배터리 수준 Simple Battery-Level Peripheral 특성에 대해 표시된 것처럼, setNotifyValue:forCharacteristic: 메서드를 사용하여 원격 주변 기기의 특정 특성에 대한 BLE 알림을 활성화합니다 (62페이지의 "클라이언트 특성 구성 설명자"에서 설명한 대로 주변 기기의 해당 CCCD에 쓰기). (다시 말하지만, 제조 데이터는 정적이므로 readValueForCharacteristic:를 사용하는 것이 합리적입니다):
Now, the didUpdateValueForCharacteristic method will be invoked whenever the peripheral has sent a notification, allowing the app to read the value of the battery level characteristic only when it changes:
이제 주변 장치가 알림을 보낼 때마다 didUpdateValueForCharacteristic 메서드가 호출되어 앱이 변경될 때만 배터리 잔량 특성 값을 읽을 수 있도록 합니다:
To this point, the code has created services and characteristics objects associated with the remote peripheral.
지금까지 코드는 원격 주변 장치와 관련된 서비스 및 특성 체를 생성했습니다.
The next section uses those objects to supply data to the rest of the application.
다음 섹션에서는 해당 객체를 사용하여 나머지 애플리케이션에 데이터를 제공합니다.
Methods for Reading and Decoding Characteristics
특성을 읽고 디코딩하는 방법
This next section of code retrieves the notified battery level value from the characteristic objects for use elsewhere in the app:
다음 코드 섹션은 앱의 다른 곳에서 사용하기 위해 특성 객체에서 알림받은 배터리 수준 값을 검색합니다:
And this code retrieves the manufacturing data for use in the app:
그리고 이 코드는 앱에서 사용할 제조 데이터를 검색합니다:
At this point, the iOS API has enabled the battery level voltage that was measured by the remote peripheral A/D converter to be transferred via BLE onto the iOS device, making it available to display as a graph, present as text, or store in a database.
이 시점에서 iOS API는 원격 주변 장치 A/D 컨버터에서 측정된 배터리 수준 전압을 BLE를 통해 iOS 기기로 전송할 수 있도록 하여 그래프로 표시하거나, 텍스트로 표시하거나, 데이터베이스에 저장할 수 있게 했습니다.