RSSI (Received Signal Strength Indicator) là một chỉ số số đo công suất tín hiệu của thiết bị BLE tính bằng dBm ở phía nhận. Giá trị RSSI dao động từ -30 dBm (thiết bị ở gần) đến -100 dBm (ở giới hạn phát hiện). Bluetooth Core Specification 5.4 (2023) định nghĩa RSSI là tham số tùy chọn có sẵn trong mỗi gói quảng cáo và gói dữ liệu. RSSI được sử dụng để ước lượng khoảng cách và lọc thiết bị theo mức tín hiệu, nhưng là chỉ số không chính xác: nó bị ảnh hưởng bởi vật cản, truyền đa đường và loại ăng-ten. Để định vị chính xác, người ta sử dụng phép tam giác và bộ lọc Kalman.
Những điểm chính
RSSI (Received Signal Strength Indicator) là phép đo công suất tín hiệu vô tuyến mà bộ thu BLE nhận được tại thời điểm nhận gói tin. Trong BLE, RSSI được đo cho mỗi gói quảng cáo và mỗi gói dữ liệu sau khi kết nối. RSSI là thang đo logarit, trong đó mỗi bước 1 dBm tương ứng với khoảng 1,26 lần thay đổi công suất tín hiệu.
RSSI là chỉ số phụ thuộc vào phần cứng: các chip BLE khác nhau (nRF, TI, Dialog, Broadcom) và ăng-ten khác nhau có thể hiển thị giá trị RSSI khác nhau cho cùng một tín hiệu. Do đó, so sánh RSSI giữa các thiết bị khác nhau là không chính xác. Ngay cả hai điện thoại thông minh giống hệt nhau trên cùng một hệ điều hành cũng có thể chênh lệch 2–5 dBm cho cùng một beacon.
Trong gói quảng cáo, RSSI được đo cho từng kênh trong ba kênh (37, 38, 39). Giá trị có thể chênh lệch 3–10 dBm giữa các kênh do nhiễu tần số. Các ngăn xếp BLE hiện đại báo cáo RSSI trung bình trên tất cả các kênh hoặc RSSI riêng cho từng gói. iOS Core Bluetooth cung cấp RSSI trung bình, Android cung cấp RSSI của gói cuối cùng.
Dải RSSI điển hình cho BLE là từ -30 dBm đến -100 dBm. Các giá trị ngoài dải này cực kỳ hiếm: -20 dBm có nghĩa là thiết bị đang chạm vào ăng-ten máy quét, trong khi -105 dBm có nghĩa là hoàn toàn không có tín hiệu. Các nhà sản xuất chip có thể giới hạn dải: ví dụ: nRF52832 báo cáo RSSI từ -40 đến -105 dBm.
| RSSI (dBm) | Chất lượng tín hiệu | Khoảng cách ước tính | Khuyến nghị |
|---|---|---|---|
| -30 – -50 | Xuất sắc | 0–1 m | Thiết bị ở gần |
| -51 – -70 | Tốt | 1–5 m | Trong phòng |
| -71 – -85 | Trung bình | 5–15 m | Chấp nhận được cho beacon |
| -86 – -95 | Yếu | 15–30 m | Kết nối không đáng tin cậy |
| Dưới -95 | Nguy kịch | 30+ m | Ở giới hạn phát hiện |
TX Power Level là công suất máy phát được chỉ định trong gói quảng cáo (AD Type 0x0A) và cho phép điều chỉnh ước tính. RSSI -70 dBm từ thiết bị có TX Power +4 dBm có nghĩa là tín hiệu đã suy hao 74 dB. Nếu không biết TX Power, không thể ước lượng khoảng cách chính xác. iBeacon bao gồm TX Power (1 byte) trong cấu trúc Manufacturer Data để hiệu chỉnh khoảng cách.
Mô hình Path Loss (suy hao đường truyền) được sử dụng để ước lượng khoảng cách từ RSSI. Công thức cơ bản: RSSI = TX_Power - 10 × n × log10(d), trong đó n là hệ số suy hao (2,0 cho không gian tự do, 3,0–4,5 cho môi trường trong nhà có vật cản) và d là khoảng cách tính bằng mét. Trong thực tế, độ chính xác ước lượng là ±2–5 m trong điều kiện thực tế.
Để hiệu chỉnh mô hình, cần đo RSSI ở một khoảng cách đã biết (thường là 1 m) và tính toán giá trị tham chiếu TX Power. Trong iBeacon, tham số này được lưu trữ trong gói tin. Eddystone sử dụng cơ chế tương tự. Sau khi hiệu chỉnh, có thể tính khoảng cách: d = 10 ^ ((TX_Power — RSSI) / (10 × n)).
Theo Hướng dẫn lập trình Core Bluetooth của Apple (2024), độ chính xác ước lượng khoảng cách cho iBeacon là: immediate (<0,5 m) — khi RSSI cao hơn giá trị hiệu chỉnh, near (0,5–3 m) — khi RSSI nằm trong khoảng 3–6 dB so với giá trị hiệu chỉnh, far (>3 m) — với tín hiệu yếu. Không có mô hình toán học nào cung cấp độ chính xác tốt hơn ±1 m mà không có xử lý bổ sung.
RSSI là chỉ số nhiễu và độ chính xác của nó phụ thuộc vào nhiều yếu tố. Các nguồn sai số chính: vật cản (tường, đồ đạc, người) làm suy hao tín hiệu 3–15 dB mỗi cái, truyền đa đường (phản xạ từ tường) có thể khuếch đại tín hiệu ở một số điểm và suy yếu ở những điểm khác, hướng ăng-ten thay đổi RSSI 3–10 dB khi xoay thiết bị.
Cơ thể người là một trong những chất hấp thụ mạnh nhất của tín hiệu BLE. Nếu có người ở giữa beacon và điện thoại thông minh, RSSI có thể giảm 10–20 dB. Nước trong cơ thể người hấp thụ hiệu quả bức xạ vô tuyến ở tần số 2,4 GHz. Do đó, beacon ở cửa hàng có thể hiển thị RSSI khác nhau cho khách hàng có chiều cao và thể trạng khác nhau.
Các yếu tố bổ sung: nhiễu Wi-Fi trên các kênh lân cận có thể làm giảm RSSI 3–5 dB, nhiệt độ của chip BLE ảnh hưởng đến độ chính xác đo RSSI (một số chip trôi tới 1 dB/°C), suy giảm pin trên beacon làm giảm TX Power, dẫn đến RSSI thấp hơn ở bộ thu.
RSSI thô không phù hợp cho tính toán chính xác — nó chứa quá nhiều nhiễu và giá trị ngoại lai. Các phương pháp lọc được sử dụng để có được ước lượng khoảng cách ổn định. Đơn giản nhất là trung bình động: lấy trung bình cộng của N giá trị RSSI gần nhất. N = 5–10 thường đủ để làm mịn các biến động ngắn hạn.
// Bộ lọc Kalman cho RSSI
class RssiKalmanFilter(
private val processNoise: Double = 0.01,
private val measurementNoise: Double = 1.0
) {
private var estimate: Double = 0.0
private var errorCovariance: Double = 1.0
fun filter(rawRssi: Double): Double {
// Dự đoán
errorCovariance += processNoise
// Cập nhật
val kalmanGain =
errorCovariance /
(errorCovariance + measurementNoise)
estimate = estimate +
kalmanGain * (rawRssi - estimate)
errorCovariance =
(1.0 - kalmanGain) * errorCovariance
return estimate
}
}
Bộ lọc Kalman là phương pháp tiên tiến hơn, tính đến động thái thay đổi của RSSI và có độ trễ thấp hơn so với trung bình động. Đối với beacon cố định, trung bình động cho kết quả chấp nhận được. Đối với thiết bị di chuyển, bộ lọc Kalman được ưa chuộng hơn vì nó thích ứng nhanh hơn với các thay đổi. Ngoài ra, có thể sử dụng bộ lọc Trung vị để loại bỏ các giá trị ngoại lai.
iOS Core Bluetooth cung cấp RSSI qua thuộc tính peripheral.rssi (NSNumber) sau khi hoàn tất đọc RSSI. Để lấy RSSI của gói quảng cáo, hãy sử dụng advertisementData[CBAdvertisementDataRSSIKey]. iOS trả về RSSI dưới dạng giá trị trung bình trên ba kênh. Để giám sát RSSI liên tục, hãy gọi readRSSI với khoảng thời gian không quá một lần mỗi giây.
// Lấy RSSI trên iOS
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
let signalStrength = Int(truncating: RSSI)
// Lọc tín hiệu yếu
guard signalStrength > -90 else {
return
}
print("Thiết bị " +
"\(peripheral.name ?? "unknown") " +
"RSSI: \(signalStrength) dBm")
}
Android cung cấp RSSI qua callback onScanResult: result.getRssi(). Giá trị RSSI là RSSI của gói quảng cáo cuối cùng (không phải trung bình). Để có kết quả ổn định, cần tích lũy nhiều giá trị và áp dụng bộ lọc. Android cũng cung cấp TX Power Level qua result.getScanRecord().getTxPowerLevel(), nếu nó được truyền trong gói quảng cáo.
// Lấy RSSI trên Android
private val scanCallback = object : ScanCallback() {
override fun onScanResult(
callbackType: Int,
result: ScanResult
) {
val rssi = result.rssi
val txPower = result.scanRecord?.
txPowerLevel ?: -128
// Áp dụng bộ lọc Kalman
val filtered = kalmanFilter.
filter(rssi.toDouble())
Log.d("BLEScanner",
"RSSI: $rssi, " +
"Filtered: $filtered, " +
"TX: $txPower")
}
}
Khi phát triển ứng dụng sử dụng RSSI để định vị, hãy lưu ý: trên iOS, giá trị RSSI ổn định hơn nhờ hiệu chỉnh phần cứng; trên Android, chúng nhiễu hơn và phụ thuộc vào nhà sản xuất thiết bị. Đối với các dự án đa nền tảng, nên triển khai bộ lọc ở phía ứng dụng với tham số có thể cấu hình cho từng nền tảng.
Câu hỏi thường gặp
Không, RSSI chỉ cung cấp ước lượng gần đúng khoảng cách với độ chính xác ±2–5 m trong điều kiện thực tế. Để định vị chính xác, cần phép tam giác từ nhiều máy quét, bộ lọc Kalman và tính đến TX Power.
Do truyền đa đường và biến động tín hiệu vô tuyến. Phản xạ từ tường và vật thể tạo ra nhiễu khiến tín hiệu xen kẽ mạnh lên và yếu đi. Thay đổi RSSI 5–10 dB trên thiết bị đứng yên là bình thường.
iOS khuyên bạn nên gọi readRSSI không quá một lần mỗi giây. Các yêu cầu quá thường xuyên có thể dẫn đến mất gói dữ liệu. Để giám sát RSSI trong khi quét, hãy sử dụng CBAdvertisementDataRSSIKey, có sẵn cho mỗi gói quảng cáo.
TX Power Level là công suất máy phát tính bằng dBm được chỉ định trong gói quảng cáo. RSSI + TX Power = tổng suy hao tín hiệu từ máy phát đến máy thu. Biết TX Power cho phép ước lượng khoảng cách chính xác hơn: RSSI - TX Power = Path Loss (suy hao đường truyền).
Đối với beacon cố định — trung bình động với cửa sổ 5–10 giá trị. Đối với thiết bị di chuyển — bộ lọc Kalman với nhiễu quy trình thấp (0,01–0,05). Để loại bỏ các giá trị ngoại lai, hãy thêm bộ lọc Trung vị loại bỏ các giá trị nằm ngoài 2 độ lệch chuẩn.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm