В этом примере показано, как с помощью Bluetooth ® Low Energy можно собирать и отображать данные с устройств мониторинга фитнеса.
В этом примере используется ремень монитора частоты сердечных сокращений Under Armour ® и пара «умных» ходовых ботинок Under Armour. Оба устройства поддерживают связь Bluetooth с низким энергопотреблением.
Сначала убедитесь, что устройства Bluetooth с низким энергопотреблением поддерживают соединения, найдя их в MATLAB. blelist сканирует близлежащие периферийные устройства Bluetooth Low Energy, которые рекламируют.
blelist
ans=14×5 table
Index Name Address RSSI Advertisement
_____ ___________________ ______________________________________ ____ _____________
1 "" "21996E3A-8F31-496D-B332-79D03B759BC7" -65 [1×1 struct]
2 "" "12377421-4EA3-4F77-9365-EFD580C34DE9" -66 [1×1 struct]
3 "UA E39 MODULE" "8206F662-BA4A-483F-A908-516FF506BFB0" -67 [1×1 struct]
4 "" "CF65AD36-2146-4CA1-BCEA-FED47F6195CA" -76 [1×1 struct]
5 "UA Footpod 239AE2" "CF7B1A17-4104-4D7B-AE70-1837CAE9C9D0" -78 [1×1 struct]
6 "" "67A1A92A-5F1C-4AF8-857A-99F194E9A5F8" -82 [1×1 struct]
7 "" "5609D68D-0EED-41D7-BE19-F3ACAA119C7A" -84 [1×1 struct]
8 "" "5A17DF46-6F71-4DAC-AF0D-0F28E3911187" -85 [1×1 struct]
9 "" "9675A0FA-0394-468B-B908-040696E1C5BC" -88 [1×1 struct]
10 "" "61540D17-C2DD-41D4-B107-E2E7374B11F4" -88 [1×1 struct]
11 "" "C2A5CCC3-CA6C-4688-AAE9-A5BE039561F9" -92 [1×1 struct]
12 "" "AF5E1195-4088-4A4B-ADA5-0BD3C91BFE62" -93 [1×1 struct]
13 "" "83C69EFB-0FAD-4A35-B167-79C51A1F245D" -94 [1×1 struct]
14 "" "993276FD-07EC-433D-85E1-E144B289B648" -95 [1×1 struct]
После обнаружения устройств в MATLAB подключитесь к ним по телефону ble. Укажите имя устройства, если имя уникально, или укажите адрес устройства.
belt = ble("UA E39 MODULE")belt =
ble with properties:
Name: "UA E39 MODULE"
Address: "8206F662-BA4A-483F-A908-516FF506BFB0"
Connected: 1
Services: [4×2 table]
Characteristics: [22×5 table]
Show services and characteristics
shoe = ble("UA Footpod 239AE2")shoe =
ble with properties:
Name: "UA Footpod 239AE2"
Address: "CF7B1A17-4104-4D7B-AE70-1837CAE9C9D0"
Connected: 1
Services: [8×2 table]
Characteristics: [39×5 table]
Show services and characteristics
Доступ к свойству Characteristics ble объектный ремень. Это устройство имеет услугу «Частота сердечных сокращений», которая содержит характеристику «Измерение частоты сердечных сокращений».
belt.Characteristics
ans=22×5 table
ServiceName ServiceUUID CharacteristicName CharacteristicUUID Attributes
____________________ ______________________________________ _____________________________________________________ ______________________________________ ____________
"Heart Rate" "180D" "Heart Rate Measurement" "2A37" {["Notify"]}
"Heart Rate" "180D" "Body Sensor Location" "2A38" {["Read" ]}
"Heart Rate" "180D" "Heart Rate Control Point" "2A39" {["Write" ]}
"Battery Service" "180F" "Battery Level" "2A19" {1×2 string}
"Device Information" "180A" "System ID" "2A23" {["Read" ]}
"Device Information" "180A" "Model Number String" "2A24" {["Read" ]}
"Device Information" "180A" "Serial Number String" "2A25" {["Read" ]}
"Device Information" "180A" "Firmware Revision String" "2A26" {["Read" ]}
"Device Information" "180A" "Hardware Revision String" "2A27" {["Read" ]}
"Device Information" "180A" "Software Revision String" "2A28" {["Read" ]}
"Device Information" "180A" "Manufacturer Name String" "2A29" {["Read" ]}
"Device Information" "180A" "IEEE 11073-20601 Regulatory Certification Data List" "2A2A" {["Read" ]}
"Device Information" "180A" "PnP ID" "2A50" {["Read" ]}
"Custom" "21A51000-4C86-11E2-BCFD-0800200C9A66" "Custom" "21A51011-4C86-11E2-BCFD-0800200C9A66" {1×2 string}
"Custom" "21A51000-4C86-11E2-BCFD-0800200C9A66" "Custom" "21A51021-4C86-11E2-BCFD-0800200C9A66" {1×2 string}
"Custom" "21A51000-4C86-11E2-BCFD-0800200C9A66" "Custom" "21A51022-4C86-11E2-BCFD-0800200C9A66" {["Write" ]}
⋮
Доступ к свойству Characteristics ble обувь предметная. Это устройство имеет услугу «Running Speed and Cadence», которая содержит характеристику «RSC Measurement».
shoe.Characteristics
ans=39×5 table
ServiceName ServiceUUID CharacteristicName CharacteristicUUID Attributes
___________________________ ______________________________________ _____________________________________________________ ______________________________________ ____________
"Device Information" "180A" "System ID" "2A23" {["Read" ]}
"Device Information" "180A" "Model Number String" "2A24" {["Read" ]}
"Device Information" "180A" "Serial Number String" "2A25" {["Read" ]}
"Device Information" "180A" "Firmware Revision String" "2A26" {["Read" ]}
"Device Information" "180A" "Hardware Revision String" "2A27" {["Read" ]}
"Device Information" "180A" "Software Revision String" "2A28" {["Read" ]}
"Device Information" "180A" "Manufacturer Name String" "2A29" {["Read" ]}
"Device Information" "180A" "IEEE 11073-20601 Regulatory Certification Data List" "2A2A" {["Read" ]}
"Device Information" "180A" "PnP ID" "2A50" {["Read" ]}
"Battery Service" "180F" "Battery Level" "2A19" {1×2 string}
"Running Speed and Cadence" "1814" "RSC Measurement" "2A53" {["Notify"]}
"Running Speed and Cadence" "1814" "RSC Feature" "2A54" {["Read" ]}
"Running Speed and Cadence" "1814" "SC Control Point" "2A55" {1×2 string}
"Custom" "21A54000-4C86-11E2-BCFD-0800200C9A66" "Custom" "21A54001-4C86-11E2-BCFD-0800200C9A66" {1×2 string}
"Custom" "21A54000-4C86-11E2-BCFD-0800200C9A66" "Custom" "21A54002-4C86-11E2-BCFD-0800200C9A66" {1×2 string}
"Custom" "21A54000-4C86-11E2-BCFD-0800200C9A66" "Custom" "21A54003-4C86-11E2-BCFD-0800200C9A66" {1×3 string}
⋮
Затем создайте объект для характеристики «Измерение частоты сердечных сокращений», указав ее сервис и характеристическую информацию.
hr = characteristic(belt, "heart rate", "heart rate measurement")
hr =
Characteristic with properties:
Name: "Heart Rate Measurement"
UUID: "2A37"
Attributes: "Notify"
Descriptors: [1x3 table]
DataAvailableFcn: []
Show descriptors
Затем прочитайте текущее измерение сердечного ритма с устройства.
data = read(hr)
data = 1×4
22 96 73 3
Согласно спецификации службы частоты сердечных сокращений в списке спецификаций низкой энергии Bluetooth, значение характеристики «Измерение частоты сердечных сокращений» содержит байт флага, за которым следует одно или несколько значений частоты сердечных сокращений. Формат значения измерения зависит от значения флага. Преобразование необработанных данных в частоту сердечных сокращений в минуту (bpm).
flag = uint8(data(1)); % Get the first bit of the flag, which indicates the format of the heart rate value heartRateValueFormat = bitget(flag, 1); if heartRateValueFormat == 0 % Heart rate format is uint8 heartRate = data(2); else % Heart rate format is uint16 heartRate = double(typecast(uint8(data(2:3)), 'uint16')); end fprintf('Heart rate measurement: %d(bpm)\n', heartRate);
Heart rate measurement: 96(bpm)
Аналогично, создайте объект для характеристики «RSC Measurement», указав ее сервисную и характеристическую информацию.
rsc = characteristic(shoe, "running speed and cadence", "rsc measurement")
rsc =
Characteristic with properties:
Name: "RSC Measurement"
UUID: "2A53"
Attributes: "Notify"
Descriptors: [1x3 table]
DataAvailableFcn: []
Show descriptors
Затем считывайте текущую скорость движения и значение каденции с устройства.
data = read(rsc)
data = 1×10
3 0 0 0 0 0 84 57 0 0
В соответствии со спецификацией Running Speed and Cadence Service в списке спецификаций низкой энергии Bluetooth, значение характеристики «RSC Measurement» содержит 2 байта, которые представляют мгновенную скорость, и 1 байт, которые представляют мгновенную каденцию. Преобразование необработанных данных в скорость движения в метрах в секунду (м/с) и в каденцию в шагах в минуту.
instantaneousSpeed = double(typecast(uint8(data(2:3)), 'uint16'))/256; instantaneousCadence = data(4); fprintf('Instantaneous speed: %.2f(m/s) and instantaneous cadence: %d(steps per minute)\n', instantaneousSpeed, instantaneousCadence);
Instantaneous speed: 0.00(m/s) and instantaneous cadence: 0(steps per minute)
После считывания данных сердечного ритма и RSC отслеживайте живые данные во время сеанса работы и коррелируйте два измерения для анализа производительности фитнеса.
Чтобы показать корреляцию данных фитнеса, сначала создайте два графика для создания анимации путем добавления точек данных в цикл.
% Create a plot for running speed against heart rate axSpeed = axes('XLim', [0, 5], 'YLim', [60, 220]); xlabel(axSpeed, 'Running speed (m/s)'); ylabel(axSpeed, 'Heart rate (bpm)'); subplot(1, 2, 1, axSpeed); hSpeed = animatedline(axSpeed, 'Marker', 'o', 'MarkerFaceColor', 'green'); % Create a plot for running cadence against heart rate axCadence = axes('XLim', [0, 200], 'YLim', [60 220]); xlabel(axCadence, 'Running cadence (steps per minute)'); ylabel(axCadence, 'Heart rate (bpm)'); subplot(1, 2, 2, axCadence); hCadence = animatedline(axCadence, 'Marker', 'o', 'MarkerFaceColor', 'blue');

Затем, прочитайте данные об устройстве в петле и обновите сюжет, в то время как пользователь прогрессирует от ходьбы до бега трусцой к управлению.
for loop = 1:30 % Get heart rate data data = read(hr); flag = uint8(data(1)); heartRateValueFormat = bitget(flag, 1); if heartRateValueFormat == 0 heartRate = data(2); else heartRate = double(typecast(uint8(data(2:3)), 'uint16')); end % Get running speed data data = read(rsc); instantaneousSpeed = double(typecast(uint8(data(2:3)), 'uint16'))/256; instantaneousCadence = data(4); % Update plot with new data addpoints(hSpeed, instantaneousSpeed, heartRate); addpoints(hCadence, instantaneousCadence, heartRate); drawnow; end

Эти графики обычно показывают, что более высокая скорость движения и значения каденции соответствуют увеличению частоты сердечных сокращений.
Очистите объекты устройства после завершения работы с ними.
clear belt shoe