Представьте: вы запускаете фитнес-приложение, измеряющее пульс. PPG через камеру выдаёт ±15 уд/мин — артефакты от движения, блики, ограничения частоты кадров на iOS. BLE-датчик теряет соединение из-за неверного парсинга Heart Rate Measurement characteristic. HealthKit требует сложной настройки разрешений, и Apple отклоняет публикацию из-за несоответствия Section 5.1. Мы решаем эти проблемы за 2–4 недели под ключ: от захвата кадра до публикации в сторах. Свяжитесь с нами — получите детальный план интеграции вашего проекта.
Какие проблемы решаем?
Неточность PPG-измерения — основная боль: артефакты движения, изменение освещения, ограничения вспышки на iOS. BLE-интеграция тоже не тривиальна: неверный парсинг флагов, RR-интервалов ведёт к ошибкам HRV. HealthKit/Health Connect — сложности с авторизацией и фоновым сбором. Мы закрываем каждый из этих слоёв: от захвата кадра до публикации.
BLE-датчики точнее PPG в 5–10 раз по стандартному отклонению (±1 против ±10 уд/мин в покое). Для приложений с претензией на спортивный мониторинг или HRV — только BLE.
Как мы реализуем PPG через камеру: пошагово
- Захват видеопотока: AVCaptureVideoDataOutputSampleBufferDelegate (iOS) или CameraX (Android). Частота 30 fps.
- Вычисление среднего зелёного канала: берём центральную область кадра — 1/3 от размеров. Избегаем бликов.
- Фильтрация: пропускаем сигнал через полосовой фильтр 0.67–3.33 Гц (FFT или IIR).
- Детекция пиков: алгоритмы на основе автокорреляции или анализа перехода через ноль.
- Расчёт ЧСС: количество пиков за последние 5 секунд.
- Оценка HRV: если требуется — измеряем RR-интервалы (в BLE это native, в PPG — непрямая оценка).
Детальный расчёт ЧСС и HRV
Частота дискретизации 30 fps => временное разрешение 33 мс. Для ЧСС 180 уд/мин (3 Гц) требуется минимум 6 Гц (теорема Найквиста). Мы используем FFT с окном Ханна длиной 5 секунд (150 точек). Для HRV измеряем SDNN и RMSSD; на PPG они менее точны, чем на BLE.
Почему BLE точнее PPG?
Стандартный профиль Bluetooth LE для датчиков пульса (Polar H10, Wahoo TICKR, Garmin HRM):
- Service UUID:
0x180D(Heart Rate) - Characteristic UUID:
0x2A37(Heart Rate Measurement)
Данные приходят через Notification. Первый байт — флаги: бит 0 определяет формат (UINT8 или UINT16), бит 4 — наличие RR-интервалов.
override fun onCharacteristicChanged( gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic, value: ByteArray ) { val flag = value[0].toInt() val isUint16 = flag and 0x01 != 0 val heartRate = if (isUint16) { ((value[2].toInt() and 0xFF) shl 8) or (value[1].toInt() and 0xFF) } else { value[1].toInt() and 0xFF } // RR-интервалы (если есть) — для HRV if (flag and 0x10 != 0) { var offset = if (flag and 0x08 != 0) 4 else 3 // пропускаем энергозатраты если есть while (offset + 1 < value.size) { val rrRaw = ((value[offset + 1].toInt() and 0xFF) shl 8) or (value[offset].toInt() and 0xFF) val rrMs = rrRaw * 1000 / 1024 // перевод из 1/1024 с в миллисекунды rrIntervals.add(rrMs) offset += 2 } } } RR-интервалы — основа для расчёта HRV (Heart Rate Variability). Если продукт претендует на стресс-мониторинг или восстановление — без RR не обойтись.
Как тестировать BLE-интеграцию пульса?
Типичные ошибки: некорректная обработка флагов, отсутствие переподключения при разрыве, неверный парсинг RR-интервалов. Мы автоматизируем тестирование на 20+ моделях датчиков (Polar, Wahoo, Garmin, Scosche), чтобы гарантировать стабильное соединение и точные данные. Закажите тестирование вашей интеграции — получите отчёт за 2 дня.
Чтение из HealthKit / Health Connect
Для приложений, которые не занимаются прямым измерением, а только отображают данные:
let query = HKAnchoredObjectQuery( type: HKQuantityType(.heartRate), predicate: nil, anchor: lastAnchor, limit: HKObjectQueryNoLimit ) { _, samples, _, newAnchor, _ in self.lastAnchor = newAnchor let bpmValues = (samples as? [HKQuantitySample])?.map { $0.quantity.doubleValue(for: HKUnit(from: "count/min")) } ?? [] } healthStore.execute(query) Данные приходят с источников: Apple Watch Series 4+ даёт ЧСС каждые 5–15 минут в покое и каждую секунду во время тренировки.
Визуализация
Для графика ЧСС в реальном времени: кольцевой буфер последних N значений, обновление раз в секунду. На iOS — Charts (DanielGindi) или Swift Charts (iOS 16+). На Android — MPAndroidChart или Compose Canvas с кастомным рисованием.
Зоны ЧСС рассчитываются от максимального пульса (220 минус возраст или по формуле Кервонена с учётом пульса покоя):
| Зона | % от макс | Цвет |
|---|---|---|
| 1 — восстановление | 50–60% | Серый |
| 2 — аэробная база | 60–70% | Синий |
| 3 — аэробная | 70–80% | Зелёный |
| 4 — анаэробный порог | 80–90% | Оранжевый |
| 5 — максимальная | 90–100% | Красный |
Формула расчета максимального пульса
Наиболее распространенная формула: 220 минус возраст (для мужчин) или 226 минус возраст (для женщин). Для более точного расчета используется формула Кервонена: ЧССмакс = 220 - возраст для неподготовленных, а для спортсменов — 205.8 - 0.685 * возраст.
Что входит в разработку мониторинга пульса под ключ?
- Анализ требований и выбор метода (камера/BLE/платформа или комбинация)
- Реализация сбора данных с очисткой и фильтрацией
- Алгоритмы обработки (FFT, пик-детекция, HRV)
- Визуализация (график, зоны, статистика)
- Интеграция с HealthKit / Health Connect (чтение и запись)
- Работа с фоновым режимом и уведомлениями
- Тестирование на реальных устройствах и датчиках (включая Fitbit, Garmin и др.)
- Документация архитектуры, конфигурация сборки, помощь с публикацией в сторах
Наш опыт и метрики
Имеем многолетний опыт в мобильной разработке. Выполнили 50+ проектов с мониторингом пульса, интегрировали HealthKit в 30 приложений. В портфолио — интеграции с Polar, Wahoo, Garmin, Fitbit, а также HealthKit и Health Connect. Гарантируем стабильное BLE-соединение на 20+ моделях датчиков. Все решения проходят ревью App Store и Google Play без отклонений. Экономия бюджета за счёт оптимизации алгоритмов — обсуждается индивидуально. Получите консультацию инженера и предварительную смету.
Ориентировочные сроки
| Этап | Срок |
|---|---|
| PPG-измерение через камеру (с алгоритмами) | 2–3 недели |
| Bluetooth GATT-интеграция | 1–2 недели |
| HealthKit/Health Connect + визуализация | 5–8 дней |
| Полный цикл под ключ (все методы) | от 4 недель |
Стоимость каждого этапа рассчитывается индивидуально. Свяжитесь с нами для точной оценки вашего проекта — получите пошаговый план реализации и расчет сроков за 2 дня.
Источник: Photoplethysmogram и Bluetooth Heart Rate Profile.







