개발일기

Python BLE 비콘 연결 테스트 코드 작성 기능 및 구현 본문

카테고리 없음

Python BLE 비콘 연결 테스트 코드 작성 기능 및 구현

한둥둥 2025. 2. 3. 16:04

가장 우선적으로 Beacon 을 사용하기 위하여 라이브러리를 설치해주었다. 해당 프로젝트는 파이썬으로 코드를 구현하였음. 

이 때, 거리를 측정하기 위해서 코드를 작성해주었다.

 

bleAdbReadCalculator.py 

# 거리 계산 함수 (RSSI와 TxPower을 이용)
def calculate_distance(tx_power, rssi, n=2):
    return 10 ** ((tx_power - rssi) / (10 * n))

 

해당 코드는 비콘이 디바이스에서 떨어져 있는 거리를 구하기위하여 만들어주었다. 

아래에 해당하는 블로그를 기준으로 비콘의 거리를 구해주었다. 

RSSI = -10n*log*D+TXpower

 

D = 10 ^ ( (TXpower-RSSI) / (10*n) ) / 20

https://m.blog.naver.com/PostView.nhn?blogId=ithelpter&logNo=220958638454&proxyReferer=undefined

 

비콘으로 거리값 구하기

안녕하세요. 꿈이 현실이 되는 곳. IThelpter입니다. 오늘은 헬프터가  비콘(Beacon)...

blog.naver.com

 

import asyncio
from bleak import BleakScanner
from bleAdbReaderCalculator import calculate_distance

async def scan_beacons():
    print("🔍 Scanning for BLE devices...\n")
    
    try:
        devices = await BleakScanner.discover()
        
        if not devices:
            print("❌ No BLE devices found.")
            return
        
        for device in devices:
            print(f"📡 Device: {device.name or 'Unknown'} | MAC: {device.address} | RSSI: {device.rssi}")
            
            # TxPower 기본값 (-59dBm) 설정
            tx_power = -59
            distance = calculate_distance(tx_power, device.rssi)
            
            print(f"📏 추정 거리: {distance:.2f} m\n")
    
    except Exception as e:
        print(f"🚨 오류 발생: {e}")

# 비동기 실행
asyncio.run(scan_beacons())

위에 코드는 비콘을 통신하기 위한 코드입니다. 

asyncio.run 을 통하여 비콘이 통신되는지 여부를 확인할 수 있습니다. 

해당 코드에서 계산을 구하는 공식을 import 받는데 그 이유는 테스트 코드를 통하여 거리 구하는 공식을 검증하기 위해서 나누어 주었습니다. 

 

import unittest
from bleAdbReaderCalculator import calculate_distance

class TestBleAdbReader(unittest.TestCase):
    def test_calculate_distance(self):
        tw_power = -59
        result = calculate_distance(tw_power, 40)
        self.assertEqual(result, 1.122018454301963e-05)


if __name__ == "__main__":
    unittest.main()

테스트 코드를 작성해주었습니다. tw_power = -59 이고 40기준으로 1.122 가 검증 코드입니다.