Connecting to a Remote Device
원격 장치에 연결
Now that the initialization and cleanup are out of the way, we can focus on the real meat of the code.
이제 초기화 및 정리가 끝났으므로 코드의 실제 내용에 집중할 수 있습니다.
The principle tasks associated with BLE you’ll need to handle are scanning and connecting to remote devices, communicating data, and performing any necessary management or security tasks.
처리해야 할 BLE와 관련된 주요 작업은 원격 장치 검색 및 연결, 데이터 통신, 필요한 관리 또는 보안 작업 수행입니다.
When initiating a scanning procedure (see “Advertising and Scanning” on page 19), you let the BLE library know that you want to be notified of any advertising packets it receives from remote devices.
스캐닝 절차를 시작할 때 (19페이지의 "광고 및 스캐닝" 참조) 원격 장치에서 수신하는 모든 광고 패킷에 대한 알림을 받고 싶다는 사실을 BLE 라이브러리에 알립니다.
Whenever a device is found, the BleWrapper makes a call to the uiDeviceFound() callback function with information about the device.
장치가 발견될 때마다 BleWrapper는 장치에 대한 정보와 함께 uiDeviceFound() 콜백 함수를 호출합니다.
You can use the device information to decide if it’s the device you want to connect to.
기기정보를 통해 연결하려는 기기인지 판단할 수 있습니다.
For scanning, you’re going to need to create two buttons: the first to start the scan and the second to stop it.
스캔을 위해서는 두 개의 버튼을 생성해야 합니다. 첫 번째 버튼은 스캔을 시작하고 두 번째 버튼은 스캔을 중지합니다.
To create the buttons, you’ll need to go into the project’s /res/ menu directory and edit the main.xml file.
버튼을 생성하려면 프로젝트의 /res/ 메뉴 디렉터리로 이동하여 main.xml 파일을 편집해야 합니다.
If you double-click that file, Eclipse will take Connecting to a Remote Device you to a GUI interface you can use to add menu items.
해당 파일을 두 번 클릭하면 Eclipse는 메뉴 항목을 추가하는 데 사용할 수 있는 GUI 인터페이스로 원격 장치에 연결을 가져옵니다.
Any menu item in the main.xml file will end up as a button in the Options menu.
main.xml 파일의 모든 메뉴 항목은 결국 옵션 메뉴의 버튼이 됩니다.
You’re going to create two items, one called Start and one called Stop, which will be used to start and stop the scan, respectively.
각각 스캔을 시작하고 중지하는 데 사용되는 시작 항목과 중지 항목이라는 두 개의 항목을 생성할 것입니다.
In the Android Menu GUI, choose Add→Item and use action_scan and ac tion_stop for the names, as shown in Figure 8-7.
Android 메뉴 GUI에서 그림 8-7과 같이 Add→Item을 선택하고 이름에 action_scan 및 action_stop을 사용합니다.
These will be the IDs of the buttons you can use when you write the click handler for the menu buttons.
이는 메뉴 버튼에 대한 클릭 핸들러를 작성할 때 사용할 수 있는 버튼의 ID입니다.
In the Title field of the Menu item, type Scan and Stop, respectively, to supply the text that shows up in the menu item.
메뉴 항목의 제목 필드에 각각 Scan 및 Stop을 입력하여 메뉴 항목에 표시되는 텍스트를 제공합니다.
Once the menu items are created, you’re going to need to process the button-click events.
메뉴 아이템이 생성되면 버튼 클릭 이벤트를 처리해야 합니다.
By default, the Android boilerplate code will use any items in main.xml as the Options menu buttons.
기본적으로 Android 상용구 코드는 main.xml의 모든 항목을 옵션 메뉴 버튼으로 사용합니다.
The boilerplate does not have a click handler, though, so you’ll need to add that in.
하지만 상용구에는 클릭 핸들러가 없으므로 추가해야 합니다.
In Eclipse, if you type onOptionsItemSelected and press Ctrl+Spacebar, it should autocomplete the function, including the @Override keyword.
Eclipse에서 onOptionsItemSelected를 입력하고 Ctrl+스페이스바를 누르면 @Override 키워드를 포함하여 함수가 자동 완성됩니다.
You’ll be overriding the onOptionsItemSelected() method to implement your own handler for click events.
클릭 이벤트에 대한 자체 핸들러를 구현하기 위해 onOptionsItemSelected() 메서드를 재정의하게 됩니다.
When a click occurs on any item in the menu, the onOptionsItemSelected() method gets called.
메뉴의 항목을 클릭하면 onOptionsItemSelected() 메서드가 호출됩니다.
Once you’re inside the method, you need to have a switch statement to handle the event based on whichever menu item was clicked.
메서드 내부로 들어가면 클릭한 메뉴 항목에 따라 이벤트를 처리하는 스위치 문이 있어야 합니다.
The pseudocode will look like this:
의사코드 (pseudocode)는 다음과 같습니다:
This code overrides the OptionsItemSelected() function to install your own handler.
이 코드는 OptionsItemSelected() 함수를 재정의하여 자체 핸들러를 설치합니다.
This method is called only when processing events related to the Options menu.
이 메서드는 옵션 메뉴와 관련된 이벤트를 처리할 때만 호출됩니다.
In the switch statement, you decide which handler to call based on the item ID of the button that was clicked.
switch 문에서는 클릭한 버튼의 항목 ID를 기반으로 호출할 핸들러를 결정합니다.
This item ID is based on the menu item ID of the buttons you created previously.
이 항목 ID는 이전에 생성한 버튼의 메뉴 항목 ID를 기반으로 합니다.
The R.id prefix means that it’s an ID from the resource directory of the internal Android project and not part of the wider android namespace.
R.id 접두사는 내부 Android 프로젝트의 리소스 디렉터리에 있는 ID이고 더 넓은 Android 네임스페이스의 일부가 아니라는 것을 의미합니다.
The two actions in the new handler will either start the scan or stop the scanning procedure, as you can see in the two methods from the BleWrapper.
BleWrapper의 두 가지 방법에서 볼 수 있듯이 새 핸들러의 두 작업은 검색을 시작하거나 검색 절차를 중지합니다.
In fact, starting and stopping the scanning procedure is probably the easiest part of the whole setup to implement the button functionality.
실제로 스캔 절차를 시작하고 중지하는 것은 아마도 버튼 기능을 구현하는 전체 설정 중 가장 쉬운 부분일 것입니다.
The next step is the action to take when a remote device is detected.
다음 단계는 원격 장치가 감지되었을 때 수행할 작업입니다.
A remote device will be advertising it’s there and ready to be connected to.
원격 장치는 연결 준비가 완료되었음을 알리게 됩니다.
When the program goes into scanning mode, it turns on scanning in the BLE radio and lets the Android system know that it wants to be informed if it get any advertisements.
프로그램이 스캐닝 모드로 전환되면 BLE 라디오에서 스캐닝을 켜고 광고가 수신되면 알림을 받고 싶다는 것을 Android 시스템에 알립니다.
The Android Bluetooth library will inform the program via callback.
Android Bluetooth 라이브러리는 콜백을 통해 프로그램에 알립니다.
To make use of the callback, you’re going to revisit the code you wrote in the onCreate() method.
콜백을 활용하려면 onCreate() 메서드에 작성한 코드를 다시 살펴보겠습니다.
Inside that method, you initialized your BleWrapper.
해당 메서드 내부에서 BleWrapper를 초기화했습니다.
Inside the constructor of the BleWrapper, it expects you to provide a list of callbacks.
BleWrapper 생성자 내에서 콜백 목록을 제공할 것으로 예상됩니다.
You previously left that empty, but now you’re going to start implementing the callbacks.
이전에는 비워 두었지만 이제 콜백 구현을 시작하겠습니다.
The first one will override the uiDeviceFound() callback, which will get called by the library whenever a device is found during the scan:
첫 번째는 uiDeviceFound() 콜백을 재정의합니다. 이 콜백은 검색 중에 장치가 발견될 때마다 라이브러리에서 호출됩니다.
This code posts a toast message box whenever it finds a device.
이 코드는 장치를 찾을 때마다 토스트 메시지 상자를 게시합니다.
It’s not very practical, but it’s an easy way to indicate when a device is found and display information about the device.
그다지 실용적이지는 않지만 장치가 발견된 시기를 표시하고 장치에 대한 정보를 표시하는 쉬운 방법입니다.
In a real use case, you’d be outputting any found devices to a device list that people could click to initiate a connection.
실제 사용 사례에서는 발견된 장치를 사람들이 클릭하여 연결을 시작할 수 있는 장치 목록에 출력하게 됩니다.
The toast message displays two pieces of information from the advertising packet: the device name (see “Advertising Data Format” on page 48) and the RSSI.
토스트 메시지는 광고 패킷의 두 가지 정보, 즉 장치 이름 (48페이지의 "광고 데이터 형식" 참조)과 RSSI를 표시합니다.
RSSI (a wireless term that stands for received signal strength indicator) is a way to indicate how strong the received signal (in this case the average of all the bits contained in the advertising packet) is.
RSSI (수신 신호 강도 표시기를 나타내는 무선 용어)는 수신 신호(이 경우 광고 패킷에 포함된 모든 비트의 평균)가 얼마나 강한지를 나타내는 방법입니다.
In some cases, the RSSI can be used to give a rough approximation of distance.
어떤 경우에는 RSSI를 사용하여 대략적인 거리를 추정할 수 있습니다.
Another key piece of information that would likely be useful is the device address (which is included with every advertising packet), but the device name alone is fine for now.
유용할 수 있는 또 다른 주요 정보는 장치 주소 (모든 광고 패킷에 포함됨)이지만 지금은 장치 이름만으로도 괜찮습니다.
The code not only outputs the same information to the toast message box, but it also logs it via the Log command, which is an Android library.
코드는 토스트 메시지 상자에 동일한 정보를 출력할 뿐만 아니라 Android 라이브러리인 Log 명령을 통해 이를 기록합니다.
The Log messages show up in the Eclipse IDE during debug using the logcat too.
로그 메시지는 logcat을 사용하여 디버그하는 동안 Eclipse IDE에도 표시됩니다.
When you use the Log command, you also specify a tag.
로그 명령을 사용할 때 태그도 지정합니다.
The good thing about this is that you can filter on the tag to remove extraneous information.
이것의 좋은 점은 태그를 필터링하여 불필요한 정보를 제거할 수 있다는 것입니다.
By now, the code should have been able to verify that it could detect a remote device sending advertising packets.
이제 코드는 광고 패킷을 보내는 원격 장치를 감지할 수 있는지 확인할 수 있어야 합니다.
Once it’s able to do that, it needs to be able to connect to it.
그렇게 할 수 있게 되면 연결이 가능해야 합니다.
Normally, you’d save all the detected devices and display them to the user in list form, as explained in “Connection establishment procedures” on page 41.
일반적으로 41페이지의 "연결 설정 절차"에 설명된 대로 검색된 모든 장치를 저장하고 목록 형식으로 사용자에게 표시합니다.
The user would then be able to click on the device she wants to connect to.
그러면 사용자는 연결하려는 장치를 클릭할 수 있습니다.
In order to avoid the GUI complexities, we’re going to simplify the use case a bit by making assumptions.
GUI 복잡성을 피하기 위해 가정을 통해 사용 사례를 약간 단순화하겠습니다.
We’ll assume we want to connect to a SensorTag device.
SensorTag 장치에 연결한다고 가정하겠습니다.
The following code checks for advertising packets with the device name “SensorTag” and automatically initiates a connection request to any device with that name:
다음 코드는 장치 이름이 "SensorTag"인 광고 패킷을 확인하고 해당 이름을 가진 모든 장치에 대한 연결 요청을 자동으로 시작합니다:
This automatic connection process avoids going into some Android GUI complexities and lets us focus on the BLE library we’re working with.
이 자동 연결 프로세스는 일부 Android GUI 복잡성을 방지하고 작업 중인 BLE 라이브러리에 집중할 수 있게 해줍니다.
The previous callback code for uiDeviceFound() has been modified to remove the popup message box.
이전 uiDeviceFound() 콜백 코드는 팝업 메시지 상자를 제거하도록 수정되었습니다.
After finding a device with a name equal to “SensorTag,” the code instructs the BleWrapper to connect to the device and pass in the device’s address (introduced in “Bluetooth Device Address” on page 19) in string format.
이름이 "SensorTag"와 동일한 장치를 찾은 후 코드는 BleWrapper에 장치에 연결하고 장치 주소 (19페이지의 "블루투스 장치 주소"에 소개됨)를 문자열 형식으로 전달하도록 지시합니다.
The BleWrapper will use the address to send a unicast connection request to the device.
BleWrapper는 이 주소를 사용하여 장치에 유니캐스트 연결 요청을 보냅니다.
It will then inform you via the uiDeviceConnected() callback if the connection was successful.
그런 다음 연결이 성공하면 uiDeviceConnected() 콜백을 통해 알려줍니다.
You will need to override this callback and add handler code.
이 콜백을 재정의하고 핸들러 코드를 추가해야 합니다.
If the connection was not successful for some reason, the status of the method call will return false.
어떤 이유로 연결이 실패하면 메서드 호출 상태가 false를 반환합니다.
You can use this to log a message to the logcat console for debugging.
이를 사용하여 디버깅을 위해 logcat 콘솔에 메시지를 기록할 수 있습니다.