DataArt, как и весь мир, с интересом наблюдает за новинками в сфере носимой электроники. В этой статье мы хотели бы рассмотреть разработку для Fitbit.

О Fitbit

Сейчас Fitbit выпускает множество самых разных интересных девайсов: клипсы Zip и One, браслеты Flex, Charge, ChargeHR и Surge и умные весы Aria. Последние новинки — ChargeHR и Surge.

Большинство трекеров отслеживают количество пройденных шагов и ступенек, потраченных калорий, преодоленное расстояние, длительность и качество сна, имеют будильник. Новые устройства оснащены также увеличенным дисплеем, поддерживают GPS-трекинг и уведомления, управление музыкой и другое. Данные синхронизируются со смартфоном или компьютером и Fitbit-серверами.

О разработке

В первую очередь нужно отметить, что взаимодействовать с устройством напрямую невозможно. На самом деле, это оказывается серьезным ограничением (об этом еще поговорим ниже). Было бы полезно иметь возможность общаться через Bluetooth LE, но пока это не реализовано. Приходится использовать RESTful-сервисы Fitbit или API клиентских библиотек, доступных для ряда языков.

Для аутентификации нужно использовать протокол OAuth 1.0 (на OAuth 2.0 Fitbit пока еще не перешел). Официальная документация предлагает для этой цели не изобретать велосипед и пользоваться существующими решениями, приводя список надежных и проверенных библиотек.

Рассмотрим Temboo в связке с Java. Для начала нужно зарегистрировать свое приложение на dev.fitbit.com и Temboo (или для другой библиотеки на ваш выбор). Вы получите consumer key и consumer secret, которые понадобятся при авторизации. Необходимо сгенерировать URL авторизации, с которым приложение пройдет первый этап OAuth-процесса:

TembooSession session = new TembooSession(tembooUserName, tenbooAppName, tembooAppKey);
InitializeOAuth initializeOAuthChoreo = new InitializeOAuth(session);

// Get an InputSet object for the choreo
InitializeOAuthInputSet initializeOAuthInputs = initializeOAuthChoreo.newInputSet();

// Set inputs
initializeOAuthInputs.set_ConsumerSecret(consumerSecret);
initializeOAuthInputs.set_ConsumerKey(consumerKey);

InitializeOAuthResultSet initializeOAuthResults = initializeOAuthChoreo.execute(initializeOAuthInputs);


Вывод будет содержать AuthorizationURL, CallbackID и OAuthTokenSecret. Пользователь должен пройти по AuthorizationURL, чтобы разрешить доступ приложению. CallbackID используется для получения callback-данных, которые Temboo сохраняет, как только пользователь авторизовался. Временный OAuthTokenSecret меняется на постоянные токены на следующем шаге.

Когда доступ разрешен, можно закончить авторизацию:
FinalizeOAuth finalizeOAuthChoreo = new FinalizeOAuth(session);

// Get an InputSet object for the choreo
FinalizeOAuthInputSet finalizeOAuthInputs = finalizeOAuthChoreo.newInputSet();

// Set inputs
finalizeOAuthInputs.set_CallbackID(callbackID);
finalizeOAuthInputs.set_OAuthTokenSecret(oAuthTokenSecret);
finalizeOAuthInputs.set_ConsumerSecret(consumerSecret);
finalizeOAuthInputs.set_ConsumerKey(consumerKey);

// Execute Choreo
FinalizeOAuthResultSet finalizeOAuthResults = finalizeOAuthChoreo.execute(finalizeOAuthInputs);


В итоге получаем для пользователя access token и token secret.

Вот и все! Теперь можно читать и обновлять данные. В том числе, используя ту же библиотеку. Например, посмотрим, чем занимался пользователь в определенный день:

GetActivities getActivitiesChoreo = new GetActivities(session);

// Get an InputSet object for the choreo
GetActivitiesInputSet getActivitiesInputs = getActivitiesChoreo.newInputSet();

// Set inputs
getActivitiesInputs.setCredential(yourCredentials);
getActivitiesInputs.set_Date("2013-03-18");
getActivitiesInputs.set_ResponseFormat("json"); // or xml - optional (default is json)
getActivitiesInputs.set_UserID("123123"); // optional (default is the current user)

// Execute Choreo
GetActivitiesResultSet getActivitiesResults = getActivitiesChoreo.execute(getActivitiesInputs);


Результат будет получен в формате json или xml, парсим его и используем в своих целях.

Ввод данных выглядит примерно так же. Запишем съеденную на обед пиццу:

LogFood logFoodChoreo = new LogFood(session);

// Get an InputSet object for the choreo
LogFoodInputSet logFoodInputs = logFoodChoreo.newInputSet();

// Set inputs
logFoodInputs.setCredential(yourCredentials);
logFoodInputs.set_Amount("3");
logFoodInputs.set_MealType("Lunch");
logFoodInputs.set_Date("2011-10-14");
logFoodInputs.set_UnitID("147"); // food units; 147 is for “grams”
logFoodInputs.set_FoodID("10409"); // food id for pizza

// Execute Choreo
logFoodChoreo.execute(logFoodInputs);


Что касается Fitbit API, он включает длинный список URLов (HTTPS), которые также можно использовать для чтения и изменения данных.

We want your feedback!

Но мы хотим выжать максимум из девайсов — найти новые способы взаимодействия с ними или получать нестандартную обратную связь. Большинство Fitbit-устройств оснащены дисплеями или LED-индикаторами, могут вибрировать — все это представляется хорошим механизмом взаимодействия с пользователем.
К сожалению, есть препятствие, обозначенное ранее: нельзя напрямую обращаться к устройству, только через API.
Как можно заставить девайс откликаться? Рассмотрим на примере Fitbit Flex. Устройство вибрирует, когда:
  • достигнута дневная цель;
  • активируется будильник;
  • (де)активируется режим сна.


LEDs загораются:
  • для индикации прогресса по дневной цели;
  • когда активируется будильник;
  • когда (де)активируется режим сна;
  • когда устройство заряжается;
  • когда возникает ошибка при обновлении.


Это некрасивое решение, но можно было бы генерировать такие «искусственные» события для своих целей. Но не будем забывать, что есть еще один момент: после того как пользователь обновил настройки (поставил новую цель или будильник), нужно синхронизироваться с сервером, чтобы обновления вступили в силу. Существует несколько способов синхронизации:
  • через ПК (нужно запустить приложение Fitbit и держать девайс недалеко от компьютера);
  • через смартфон (запустить приложение, разрешить Bluetooth сщединение);
  • через NFC;
  • вручную, нажав кнопку в приложении Fitbit;
  • в бэкграунде (удостоверившись, что все запущено и работает).


Таким образом, получаем две очевидные проблемы. Во-первых, вызывать вибрацию при, допустим, получении нового сообщения в социальной сети через установку будильника довольно странно. Во-вторых, вероятность того, что сразу же после этого устройство синхронизирует данные, очень мала. Как следствие, событие будет потеряно.

Вместо заключения

В вашем приложении вы можете легко читать и писать данные Fitbit, обрабатывать их или просто показывать пользователю. Но вызвать нестандартную реакцию устройства извне крайне затруднительно, в основном потому что невозможно общаться с ним напрямую.

Автор: Вероника Строкова

Комментарии (7)


  1. xSomeonEx
    27.04.2015 17:47
    +2

    Являюсь обладателем сего чуда. По сравнению с xiaomi mi band трекер fitbit flex — сплошное разочарование.


    1. bolk
      28.04.2015 07:29
      -1

      Вы бы написали подробности что ли. У меня Fitbit Surge, очень доволен — удобные, ноские, всё что мне нужно — меряют (пульс, пройденное, лестничные пролёты), минус только одни — нет «умного» будильника.


      1. xSomeonEx
        28.04.2015 11:37
        +3

        Все просто.
        Flex: батарейка ~ 5 дней, шагомер есть, умного будильника нет, в качестве дисплейчика светодиоды, уведомлений с планшета получать не умеет, будильников можно поставить много(точно больше 3), чтобы отметить, что ложишься спать/встаешь — нужно стучать по браслету 5 раз или лезть в планшет и тыкать кнопки, имеются косяки синхронизации — нужно правильно настраивать время на браслете(чтобы часовой пояс совпадал с временем на планшете), при синхронизации с планшетом вроде бы нужен интернет.
        Mi band: первый раз включил — автоматом скачал прошивку и синхронизировал время, уход в сон и пробуждение контролируется самим браслетом(можно конечно потыкать в планшете), также имеются светодиоды(отображение прогресса шагов по спец. движению), в наличии умный будильник, всего 3 будильника можно выставить, разблокировка планшетика через браслет, есть уведомления(вибра) при звонке + можно через левые программы настраивать события для уведомлений, можно мыться в душе с ним, батарейка лично у меня живет 50+ дней, очень быстрая синхронизация с планшетом, стоит в 4 раза дешевле flex.


        1. werwooolf
          29.04.2015 03:10

          Аналогичный опыт. Купил девушке Fitbit flex за $90, себе miBand за $12. И чувствую, скоро у меня его отберут. Умный будильник, за 49 дней разряд всего лишь до 32%, возможность настраивать вибрацию и цвет ЛЕД с твикнутой аппликашкой под любые события на телефоне, водонепроницаемость. В последнем обновлении добавили gps tracker для отслеживания маршрута, возможность подсчета количества упражнений на пресс и прыжков со скакалкой.


    1. galk_in
      28.04.2015 19:12

      Хотелось бы услышать отзыв от владельца FitBit ChargeHR. Сам сейчас пользуюсь Xaomi Mi Band не хватает пульса и API


      1. zBear
        28.04.2015 21:22
        +1

        у меня был Surge
        сдал обратно его после одного дня использования
        пульс измерял нормально только в покое, при нагрузге привирал (показывал на 15-20 ударов меньше)
        насколько я понял из отзывов, в Charge HR с измерением пульса всё ещё хуже

        из всех устройств, максимально точно показывали польс только те, которые идут с лентами на грудь, все остальные (из моего опыта) подходят только для обобщения данных за какой-то промежуток времени, но никак ни для получения точных значений в данный момент

        сейчас тоже использую Xaomi Mi Band и не страдаю от отсутствия данных по пульсу :-)


  1. Supoved
    28.04.2015 20:05
    +1

    Пользуюсь Flex.
    Из хорошего: отлично меряет шаги, информативная статистика, не боится воды (можно спокойно принимать душ).
    Из плохого: я часто езжу не велосипеде flex во время поездки часто переходит в режим «сна», режим сна нужно включать самому, что жутко напрягает(перестаешь играться на вторую неделю), не умеет синхронизировать смену часового пояса через девайс, с которым париться(все нужно делать вручную), а самое главный минус все данные фитбит забирает себе не умеет обмениваться ими (кроме как через ручной экспорт, который платный).
    Хороший надежный девайс, но скучный =)

    В следующий раз буду определенно смотреть на что-то более открытое как для обмена данными так и для разработчиков и api взаимодействия.