
표준 및 비표준(원시 비트) 방식을 모두 지원하는 블루투스 저에너지(BLE) 패킷 스니퍼 및 송신기로, 소프트웨어 정의 라디오(SDR) 기반입니다.
BTLE는 무료 오픈소스 블루투스 저전력(BLE) 소프트웨어 정의 라디오(SDR) 소프트웨어 제품군이자 오픈 BTLE 칩 설계입니다.
다음이 포함됩니다:
이 프로젝트를 실행하기 전에 SDR 하드웨어 환경(드라이버/라이브러리)이 올바르게 설정되어 있는지 확인하십시오.
git clone https://github.com/JiaoXianjun/BTLE.git
cd BTLE/host
mkdir build
cd build
cmake ../ (default. for HackRF)
cmake ../ -DUSE_BLADERF=1 (only for bladeRF)
make
./btle-tools/src/btle_rx
위 명령은 채널 37에서 스니핑합니다. 주변에 BLE 기기(휴대폰/태블릿/노트북)가 있다면 화면에 많은 패킷이 표시될 것입니다.
./btle-tools/src/btle_tx 37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-LOCAL_NAME09-SDR/Bluetooth/Low/Energy r500
위 명령은 ADV 채널에서 디스커버리 패킷을 전송합니다. 다른 BLE 스니퍼 앱(예: LightBlue)에서 "SDR/Bluetooth/Low/Energy"라는 이름의 기기를 볼 수 있을 것입니다.
HACKRF에서 더 빠른 동작 시퀀스를 원한다면 다음을 사용하십시오:
#define TRANSFER_COUNT 4
#define TRANSFER_BUFFER_SIZE 4096
hackrf/host/libhackrf/src/hackrf.c 파일에서 설정합니다. 그런 다음 HACKRF 라이브러리를 다시 컴파일하고 다시 설치하십시오. HACKRF 라이브러리 변경 사항을 적용하려면 BTLE도 다시 컴파일하는 것을 잊지 마십시오.
도구 외에도 matlab 디렉터리에는 알고리즘 평가 및 기타 유용한 스크립트가 포함되어 있습니다
-h --help
모든 인수/사용법을 출력합니다.
-c --chan
채널 번호. 기본값은 37(ADV 채널 중 하나)입니다. 유효한 값은 0~39(모든 ADV 및 DATA 채널)입니다.
-g --gain
수신 이득(dB). HACKRF rxvga 기본값은 6, 유효 범위 0 - 62입니다. bladeRF 기본값은 최대 수신 이득 66dB(유효 범위 0 - 66)입니다. 이득은 환경에서 최상의 성능을 보장하도록 매우 신중하게 조정해야 합니다. 높은 이득은 항상 심각한 왜곡을 일으켜 아무것도 얻지 못하므로 낮은 이득부터 테스트할 것을 권장합니다.
-l --lnaGain
LNA 이득(dB)(HackRF 전용). 기본값 32, 유효 범위 0 - 40. 이득은 환경에서 최상의 성능을 보장하도록 매우 신중하게 조정해야 합니다.
-b --amp
앰프 활성화(HackRF 전용). 기본값은 꺼짐입니다.
-a --access
액세스 주소. ADV 채널 37 38 39의 기본값은 8e89bed6입니다. 캡처된 연결 설정 절차에 따라 데이터 채널에 대한 올바른 값을 지정해야 합니다.
-k --crcinit
ADV 채널의 기본값은 555555입니다. 캡처된 연결 설정 절차에 따라 데이터 채널에 대한 올바른 값을 지정해야 합니다.
-v --verbose
자세한 출력 모드. 오류가 있을 때 더 많은 정보를 출력합니다.
-r --raw
원시 모드. 액세스 주소가 감지된 후 이어지는 원시 42바이트를 출력합니다(디스크램블링, 파싱 없이).
-f --freq_hz (need argument)
이 주파수(Hz)는 채널 설정을 대체합니다(BTLE 이외의 주파수에서 작업하려는 경우. 보다 일반적인 용도).
-m --access_mask (need argument)
이 마스크의 비트가 1이면 액세스 주소의 해당 비트가 패킷 존재 판단에 반영됩니다(더 짧거나 더 성긴 고유 워드로 패킷 감지를 수행하려는 경우. 보다 일반적인 용도).
-o --hop
이 옵션은 ADV 채널의 ADV_CONNECT_REQ 패킷에서 링크 설정 정보가 캡처된 후 데이터 채널 추적(주파수 호핑)을 켭니다.
-s --filename
패킷을 pcap 파일로 저장합니다.
btle_tx packet1 packet2 ... packetX ... rN
또는
btle_tx packets.txt
packets.txt는 명령줄 매개변수(packet1 packet2 ... rN) 텍스트가 포함된 텍스트 파일입니다. 매개변수 하나가 한 줄을 차지합니다. "#"으로 시작하는 줄은 주석으로 간주됩니다. packets.txt 예제를 참조하십시오.
packetX
하나의 패킷을 설명하는 문자열입니다. 모든 패킷이 패킷 시퀀스를 구성합니다.
rN
시퀀스가 N번 반복됨을 의미합니다. 지정하지 않으면 시퀀스는 한 번만 전송됩니다.
packetX 문자열 형식
channel_number-packet_type-field-value-field-value-...-Space-value
각 설명자 문자열은 BTLE 채널 번호(0~39)로 시작하고, 그 다음에 packet_type(RAW/iBeacon/ADV_IND/ADV_DIRECT_IND 등. 모든 형식 예제는 마지막: 부록 참조)이 오며, 그 다음에 packet_type별 필드-값 쌍이 이어집니다. 마지막에는 Space-값 쌍(선택 사항)이 오며, 값은 이 패킷 전송 후 대기할 밀리초 수를 지정합니다.
절대 명령줄 패킷 설명자에 공백 문자 " "를 사용하지 마십시오. txt 파일 패킷 설명자에서는 공백을 사용할 수 있습니다.
절대 각 필드 안에 "-"를 사용하지 마십시오. "-"는 패킷 설명자에서 서로 다른 필드를 구분하는 데 사용되는 특수 문자입니다.
이 명령을 실행하기 전에 iPhone/기기에서 LightBlue 앱(또는 다른 BLE 스니퍼)을 여십시오:
./btle-tools/src/btle_tx ../btle-tools/src/packets_discovery.txt
LightBlue 앱에서 "SDR Bluetooth Low Energy"라는 이름의 기기를 볼 수 있을 것입니다.
해당 명령줄:
./btle-tools/src/btle_tx 37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-LOCAL_NAME09-SDR/Bluetooth/Low/Energy r40
참고: 공백 " "은 명령줄에서 지원되지 않으므로 "/"로 대체됩니다.
btle_tx 37-ADV_IND-TxAdd-0-RxAdd-0-AdvA-90D7EBB19299-AdvData-0201050702031802180418-Space-1 37-CONNECT_REQ-TxAdd-0-RxAdd-0-InitA-001830EA965F-AdvA-90D7EBB19299-AA-60850A1B-CRCInit-A77B22-WinSize-02-WinOffset-000F-Interval-0050-Latency-0000-Timeout-07D0-ChM-1FFFFFFFFF-Hop-9-SCA-5-Space-1 9-LL_DATA-AA-60850A1B-LLID-1-NESN-0-SN-0-MD-0-DATA-XX-CRCInit-A77B22-Space-1
위는 기기 1과 기기 2 사이의 연결 설정 절차를 시뮬레이션합니다. 해당 설명자 파일은 BTLE/host/btle-tools/src/packets.txt입니다.
1번째 패킷 -- 기기 1이 채널 37에서 ADV_IND 패킷을 전송합니다.
2번째 패킷 -- 스캔 상태의 기기 2가 기기 1로부터 ADV 패킷을 수신한 후, 기기 2는 기기 1과의 연결 설정을 요청하는 CONNECT_REQ 패킷을 전송합니다. 이 요청 패킷에는 기기 2의 MAC 주소(InitA), 대상 MAC 주소(기기 1의 MAC 주소 AdvA), 기기 1이 이후 데이터 채널에서 패킷 전송에 사용할 액세스 주소(AA), 이후 기기 1이 전송하는 패킷의 CRC 초기화 값, 기기 1이 사용하는 데이터 채널의 호핑 채널 정보(ChM 및 Hop) 등이 포함됩니다.
3번째 패킷 -- 기기 1이 기기 2로부터 받은 연결 요청 정보에 따라 채널 9에서 빈 링크 계층 데이터 PDU를 전송합니다(호핑 방식에 따라 결정됨). ("DATA" 필드 뒤의 "XX"는 이 필드에 데이터가 없음을 의미합니다.)
패킷 사이의 시간 간격은 1초(1000ms)입니다. TI의 패킷 스니퍼를 채널 37에 맞추면 위의 설정 절차가 캡처될 것입니다.
./btle-tools/src/btle_tx 37-iBeacon-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5-Space-100 r100
위 명령은 iBeacon 패킷을 전송하고 100ms 시간 간격으로 100회 반복합니다. 해당 설명자 파일은 BTLE/host/btle-tools/src/packets_ibeacon.txt입니다. BLE 스니퍼 동글을 사용하여 패킷을 확인할 수 있습니다.
패킷 설명자 문자열:
37-iBeacon-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5-Space-100
37
채널 37(BTLE 광고 채널 37 38 39 중 하나)
iBeacon
iBeacon 형식을 의미하는 패킷 형식 키워드입니다. (실제로는 Core_V4.0.pdf의 ADV_IND 형식입니다.)
AdvA
010203040506으로 설정된 광고 주소(MAC 주소)입니다 (Core_V4.0.pdf 참조)
UUID
여기서는 Estimote의 고정 UUID: B9407F30F5F8466EAFF925556B57FE6D로 지정합니다.
Major
iBeacon 형식의 major 번호입니다. (여기서는 0008)
Minor
iBeacon 형식의 minor 번호입니다. (여기서는 0009)
Txpower
iBeacon 형식의 송신 전력 매개변수입니다 (여기서는 C5)
Space
이 패킷 전송 후 대기할 밀리초 수입니다. (여기서는 100ms)
TI의 패킷 스니퍼와의 비교는 여기에서 확인하십시오: http://sdr-x.github.io/BTLE-SNIFFER/
btle_rx 동영상 데모 또는 btle_rx 동영상 데모(중국 내) 및 btle_tx 동영상 데모 1 또는 btle_tx 동영상 데모 2(중국 내)를 확인하십시오.
RAW 패킷: (모든 비트가 GFSK 변조기로 직접 전송됩니다)
37-RAW-aad6be898e8dc3ce338c4cb1207730144f9474e0e15eedb378c3bc
광고 채널 패킷(예: 채널 37):
37-IBEACON-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5
37-ADV_IND-TxAdd-1-RxAdd-0-AdvA-010203040506-AdvData-00112233445566778899AABBCCDDEEFF
37-ADV_DIRECT_IND-TxAdd-1-RxAdd-0-AdvA-010203040506-InitA-0708090A0B0C
37-ADV_NONCONN_IND-TxAdd-1-RxAdd-0-AdvA-010203040506-AdvData-00112233445566778899AABBCCDDEEFF
37-ADV_SCAN_IND-TxAdd-1-RxAdd-0-AdvA-010203040506-AdvData-00112233445566778899AABBCCDDEEFF
37-SCAN_REQ-TxAdd-1-RxAdd-0-ScanA-010203040506-AdvA-0708090A0B0C
37-SCAN_RSP-TxAdd-1-RxAdd-0-AdvA-010203040506-ScanRspData-00112233445566778899AABBCCDDEEFF
37-CONNECT_REQ-TxAdd-1-RxAdd-0-InitA-010203040506-AdvA-0708090A0B0C-AA-01020304-CRCInit-050607-WinSize-08-WinOffset-090A-Interval-0B0C-Latency-0D0E-Timeout-0F00-ChM-0102030405-Hop-3-SCA-4
데이터 채널 패킷(예: 채널 9):
9-LL_DATA-AA-60850A1B-LLID-1-NESN-0-SN-0-MD-0-DATA-XX-CRCInit-A77B22
9-LL_CONNECTION_UPDATE_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-WinSize-02-WinOffset-0e0F-Interval-0450-Latency-0607-Timeout-07D0-Instant-eeff-CRCInit-A77B22
9-LL_CHANNEL_MAP_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-ChM-1FFFFFFFFF-Instant-0201-CRCInit-A77B22
9-LL_TERMINATE_IND-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-ErrorCode-12-CRCInit-A77B22
9-LL_ENC_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-Rand-0102030405060708-EDIV-090A-SKDm-0102030405060708-IVm-090A0B0C-CRCInit-A77B22
9-LL_ENC_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-SKDs-0102030405060708-IVs-01020304-CRCInit-A77B22
9-LL_START_ENC_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-CRCInit-A77B22
9-LL_START_ENC_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-CRCInit-A77B22
9-LL_UNKNOWN_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-UnknownType-01-CRCInit-A77B22
9-LL_FEATURE_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-FeatureSet-0102030405060708-CRCInit-A77B22
9-LL_FEATURE_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-FeatureSet-0102030405060708-CRCInit-A77B22
9-LL_PAUSE_ENC_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-CRCInit-A77B22
9-LL_PAUSE_ENC_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-CRCInit-A77B22
9-LL_VERSION_IND-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-VersNr-01-CompId-0203-SubVersNr-0405-CRCInit-A77B22
9-LL_REJECT_IND-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-ErrorCode-00-CRCInit-A77B22
디스커버리 패킷: (LightBlue와 같은 스캐너 앱에서 임의의 이름이나 서비스를 표시할 수 있습니다):
37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-FLAGS-02-LOCAL_NAME09-CA-TXPOWER-03-SERVICE03-180D1810-SERVICE_DATA-180D40-MANUF_DATA-0001FF-CONN_INTERVAL-0006 (-SERVICE_SOLI14-1811)
FLAGS: 0x01 LE 제한적 발견 가능 모드; 0x02 LE 일반 발견 가능 모드 서비스: 0x02 16비트 서비스 UUID, 추가 16비트 UUID 사용 가능 0x03 16비트 서비스 UUID, 사용 가능한 16비트 UUID의 전체 목록 0x04 32비트 서비스 UUID, 추가 32비트 UUID 사용 가능 0x05 32비트 서비스 UUID, 사용 가능한 32비트 UUID의 전체 목록 0x06 128비트 서비스 UUID, 추가 128비트 UUID 사용 가능 0x07 128비트 서비스 UUID, 사용 가능한 128비트 UUID의 전체 목록