4.1.4. 2대이상 기기 연결

지금까지 1대의 장치로 부터 정보를 얻는 것을 살펴보았다면, 이제 보다 일반적인 목적을 위해서 여러대의 장치에서 동시에 정보를 받는 방법을 알아보고자 한다. 다만 여기서는 새로운 디바이스를 동일한 바나나 체온계를 사용하여 보여준다.

본 장에서는 2대 이상의 바나나 체온계에 연결하여 온도정보를 수신하는 방법에 대해 서술한다. 기존에 사용했던 코드를 활용해 진행한다.

프로젝트 생성

새로운 프로젝트에서 사용될 파일을 생성하기 위해 홈화면(라즈베리파이의 바탕 화면)에서 우클릭 → New Folder 버튼을 클릭해 폴더를 생성한다. 여기서는 Multi-TS100s-Project 이름을 가진 폴더를 생성한다.

Raspberry Pi 프로젝트 폴더 생성

이후 Visual Studio Code를 열고 Open Folder 버튼을 클릭해 기존에 만들었던 TS100-Project 폴더 선택 후 Open 버튼을 클릭해 폴더를 연다.

Visual Studio Code 폴더 열기

이후 다음과 같이 main.py 파일을 생성한다.

main.py 파일 생성 방법

화면 레이아웃 설정

2대 이상 스캔된 화면을 그리기 위해 코드를 작성한다.

이후 코드를 실행하면 프로젝트 화면이 나타나고, 상단의 Scan 버튼을 클릭하면 Scan Button Click이 콘솔에 출력되는것을 확인할 수 있다.

Raspberry Pi UI 구성
버튼클릭 콘솔 출력

블루투스 기기 Scan

2대의 기기를 연결하기 위해서는 scan_button_click(), Scan 관련 함수를 수정한다. 비동기 처리를 위해 asyncio을 import한다.

이후 코드를 실행하면 Scan된 기기가 좌측에 출력된다. Scan 버튼을 계속 클릭하면 Scan된 기기가 업데이트 되는것을 확인할 수 있다.

바나나 체온계 Scan

지금까지의 내용이 반영된 코드이다.

블루투스 기기 연결

Scan된 Device를 연결하는 connect 함수를 작성한다. 버튼을 클릭했을 때 connect 함수를 호출할 수 있도록 scan_device_button_click 함수도 함께 수정한다.

코드수정 후 실행하면 콘솔에 출력되는것을 확인할 수 있다.

Device 연결 콘솔 출력

연결된 기기를 Temperature Information 영역에 나타내는 코드를 작성한다.

연결된 device를 구분하기 위해 device_info_frame_dict 딕셔너리 변수를 추가한다.

dictionary란 키와 값의 쌍을 저장하는 자료구조로, 키를 통해 값을 빠르게 검색할 수 있다. device_info_frame_dict 딕셔너리 변수는 바나나 체온계 이름이 key, 화면에 나타나는 Text Frame이 value로 이루어진 데이터를 저장한다.

코드수정 후 실행하면 연결된 기기가 Temperature Information 화면에 출력되는것을 확인할 수 있다.

연결 기기 Frame 추가

Device 연결에 성공하면 기존에 좌측화면에서 클릭했던 기기를 삭제할 수 있도록 remove_button_click 함수를 수정한다.

코드수정 후 실행하면 연결한 Device는 Scan TS100 영역에서 사라진것을 확인할 수 있다.

연결된 기기 Scan TS100 List 삭제

지금까지의 내용이 반영된 코드이다.

Service, Characteristic 요청

블루투스 연결이 완료된 후 Service, Characteristic 요청을 위해 함수를 추가한다.

connect 함수에 Service, Characteristic을 검색하는 코드를 추가한 후 프로젝트를 실행하면 전체 Service와 Characteristic을 확인할 수 있다.

바나나 체온계 전체 Service, Characteristic

지금까지의 내용이 반영된 코드이다.

온도정보 가져오기

바나나 체온계의 여러 characteristic 중 온도정보를 받아오는 기능을 구현한다. 다음은 온도 정보에 대한 특성이다.

Service: Health Thermometer(00001809-0000-1000-8000-00805f9b34fb)

Characteristic: Temperature Measurement(00002a1c-0000-1000-8000-00805f9b34fb)

온도정보 수신

여러 Service 중 Health Thermometer와 관련된 service만 수신받기 위해 get_service_and_characteristic 함수를 수정한다.

이후 온도정보 characteristic을 통해 notify를 수신하기 위해 함수를 수정한다.

2대이상의 기기에서 수신된 온도정보를 구분하기 위해 sender_dict라는 dictionary 자료형을 추가하고, get_service_and_characteristic 함수를 수정한다. sender_dict에는 characteristic이 key, 바나나 체온계 이름이 value로 이루어진 데이터를 저장한다.

이후 코드실행 후 바나나 체온계와 연결하면 수신된 온도정보가 콘솔창에 출력되는것을 확인할 수 있다.

온도정보 notify 수신 확인

지금까지의 내용이 반영된 코드이다.

온도정보 변환

바나나 체온계로부터 수신받은 데이터는 온도정보와 날짜정보로 이루어져 있다. 온도정보를 변환하는 temperature_calculate 함수를 작성한다.

기존에 작성했던 notify_callback 함수를 온도정보를 받아와 출력하는 함수로 변경한다.

이후 프로젝트를 실행하면 변환된 온도정보가 출력되는것을 확인할 수 있다.

온도정보 수신 확인

온도정보 화면에 출력

바나나 체온계로부터 수신받은 온도정보를 화면에 출력하기 위해 notify_callback 함수를 수정한다.

다음은 온도정보를 업데이트하는 순서이다.

  1. sender_info dictionary에서 수신된 characteristic을 가진 이름을 획득한다.

  2. device_info_frame_dict에서 바나나 체온계 이름을 key로 가진 온도정보 라벨 프레임을 획득한다.

  3. set() 함수를 통해 온도정보를 업데이트한다.

온도정보 업데이트 순서

코드실행 후 2대 연결과정을 수행하면 온도정보가 화면에 업데이트 되는것을 확인할 수 있다.

온도정보 업데이트

지금까지의 내용이 반영된 코드이다.

블루투스 기기 연결 해제

Temperature Information 영역의 X 버튼을 클릭하면 BLE연결을 해제하는 기능을 구현하기 위해 create_device_info_frame 함수 내 remove_frame, remove_characteristic_by_value 함수를 수정한다.

수정된 코드는 UI에서 삭제, BLE연결 해제, dictionary 값 삭제 기능을 수행한다.

이후 코드를 실행해 X 버튼을 클릭하면 화면에서 사라지고, BLE 연결이 해제되는것을 확인할 수 있다.

블루투스 기기 연결 해제

지금까지의 내용이 반영된 코드이다.

Last updated