Соединение «самопальных» устройств по bluetooth с iOS

Здраствуй, Хабраюзер! Возникла у меня на работе ситуация, что нужно было спроектировать устройство для iOS, которое бы посредством bluetooth передавало данные на iPad. Если в кратце- это устройство, которое должно прятаться в обычной пачке сигарет и передавать на ipad данные, на каком ребре она лежит. Я начал штудировать сайт apple на предмет взаимодействия bluetooth- устройств и самого ipad, но предлагались варианты либо использовать GameKit (что нам совсем не подходило), либо вступать в программу Apple MFi ( которая несет кучу ограничений и просто так в нее не вступишь). Начали искать решения, и тут подвернулся мне человек, очень хорошо дружащий с электроникой.

Изначально разработка планировалась на Arduino, но знающий человек отговорил от этой затеи ввиду больших финансовых затрат (нужна была партия около 1000 штук). И мы нашли оптимальное решение- собрать устройство самим. Так как я не силен в электронике, то просто опишу какие компоненты использовались:

  • датчик положения MMA7260QT
  • контроллер ATmega16U4-AU
  • bluetooth BlueGiga


В итоге получился вот такой прототип:


Вид снизу:


Устройство отлично передавало свое положение, но встал самый главный вопрос: как эти данные передать на iPad?

Решение пришло весьма неожиданно- есть такой профиль в SSP — «just works», когда обмен кодами происходит,
но без индикации и участия пользователя. И мы решили использовать его, эмулируя обычную bluetooth- клавиатуру. Прикрутили этот профиль к прототипу, и вот что получилось (извиняюсь за качество видео, но суть думаю будет понятна):



Устройство передает 10 раз в секунду определенную букву в зависимости от местоположения, и при каждой смене положения передает цифру от 0 до 9 которая соответствует заряду аккумулятора.

Ну а на iPad уже перехватить данные с клавиатуры не составило труда. Я создал скрытый UITextField, и просто в нем перехватывал «нажатые» клавиши. Вот краткий код, как это все работает:

@interface ViewController : UIViewController <UITextFieldDelegate>
{
    IBOutlet UITextField *textField;
}

@property (nonatomic, strong) IBOutlet UILabel *currTestLabel;
@property (nonatomic, strong) IBOutlet UILabel *packPositionLabel;
@property (nonatomic, strong) IBOutlet UILabel *batteryPercentageLabel;


@end



@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [textField becomeFirstResponder];
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
       if ([string isEqualToString:@"Z"] || [string isEqualToString:@"z"] || [string isEqualToString:@"Я"] || [string isEqualToString:@"я"])
        {
            _packPositionLabel.text =  @"Плашмя";
        }       
        if ([string isEqualToString:@"9"])
        {
            _batteryPercentageLabel.text = @"100%";
        }
    return NO;
}

@end


Надеюсь данная статья кому то облегчит жизнь. Если кому нибудь нужна будет схема, прошивка устройства или подробности как это в итоге работает- с удовольствием поделюсь!

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 24

    0
    Когда делаете устройство, которое заведомо будет иметь тираж более трех штук, сразу забывайте про ардуино. Если совсем не получается его забыть, залейте в чип его загрузчик, остальной мусор уберите.
    Это общее…

    В частности: вижу, что вы используете литиевый аккумулятор, как Вы контролируете его зарядку и разряд.
    Я остановился на мс MCP101T-315 и MCP73832, любопытно, как у других.
      0
      Ардуино предлагал использовать человек, который изначально предлагал первый макет. Так как у нас в отделе только кодеры, мы нанимали человека со стороны, кто нам разрабатывал прототип устройства. И собственно он и сказал что ардуино использовать нецелесообразно. Я уточню у него подробности как он реализовывал заряд и разряд и Вам отпишусь.
      0
      Немогли бы вы немного рассказать что такое SSP и что там за профили есть? Так как у вас приложение, насколько я понимаю должно попасть в апп стор, таким его не пустят- коннект к девайсу происходит вне приложения. Вообщем интересно все по поводу того как вы будете доводить его до ума, у меня нет опыта работы с bluetooth, но организовать общение точно можно через bonjour.
        0
        Приложение сугубо для персонального использования- в аппстор попасть цели нет, да и ненужно оно. Про SSP- у bluetooth есть профили для соединения с определенными устройствами. В случае с iOS-это HID (клавиатура) и тот профиль, который мы использовали для подключения устройства без ввода пин-кода, как в случае с клавиатурой. Про bonjour- Вы наверное имеете ввиду подключение через wi-fi? В нашем случае это было неприемлемо из за высокого энергопотребления и чуть более сложной схеме коммутации устройства с айпадом ( наша цель была сделать так, что бы человек без особого опыта общения с такими устройствами смог просто включить bluetooth на айпаде, включить само устройство и закоммутировать их, а в случае с wi-fi пришлось бы создавать точку доступа айпадом). Доводить до ума- в принципе в приложении обработчик сигналов полностью готов, осталось его оформить в соответствии с требованиями заказчика и отдавать им. Надеюсь ответил на Ваши вопросы, но если есть еще, не стесняйтесь задавать, с удовольствием отвечу!
          0
          > Приложение сугубо для персонального использования- в аппстор попасть цели нет, да и ненужно оно

          А как вы планируете устанавливать приложение на устройства? Если тираж 1000 штук, то девелоперской лицензии не хватит на всех.
          Jailbreak? А если пользователь случайно обновится на свежую версию iOS, для которой еще нет джейла?
            0
            это уже задача заказчика. наша задача была реализовать.
              +1
              Вы забываете, что есть корпоративная лицензия, без ограничения на кол-во девайсов (но и без возможности публикации в AppStore).
          0
          Тоесть, если не отключить устройство, то у меня начнут набираться символы в других программах? Не кажется очень удобным. Может, лучше тогда сделать по принципу модема и обмениваться тонами прикидываясь гарнитурой?
            0
            Именно так, устройство полностью эмулирует поведение клавиатуры. Это был один из первоначальных вариантов использовать профиль гарнитуры и передавать тона, но у разработчика прототипа устройства возникли какие то проблемы с реализацией этого профиля в устройстве и беспрепятственного подключения к iPad.
            0
            Голь на выдумки хитра )
              0
              Согласен. Решение нестандартное и довольно таки корявое, но к сожалению в сжатые сроки что то более подходящего и придумать не смогли.
              0
              Скажите, а где вы брали такую батарейку? Заказывали из Китая или где-то в России продают?
                0
                Человек, который паял прототип, все элементы покупал в России, включая батарейку. Насколько я знаю с его слов, в Москве с ними проблем нет.
                  +1
                  В любом магазине для моделистов есть. Причем разные. Но если много надо тогда на aliexpress
                    +1
                    На всякий случай напомню — в модельных батареях нет ни контроллера заряда, ни датчика температуры. Два проводка, все остальное на вас. Плюс их в том, что они спокойно принимают заряд на уровне 1С (выше уже не стоит), и запросто отдают до 10С (часто больше), хотя в портативной электронике токи порядков 10А вряд ли часто нужны.
                      0
                      Это смотря какая батарея, в статье обычный литий без контроллера, я думаю вопрос про него и был. Во всяком случае я себе для замены в bluetooth наушниках там брал, батареи один в один
                  +2
                  Это что, какая-то система для карточного шулерства? :)
                    +1
                    Почему ещё никто не спросил, зачем всё это нужно?
                      0
                      Для промо акции. Это не публичный продукт.
                        0
                        0:18
                          0
                          абсолютно в яблочко :)
                      +1
                      Я использовал голубой зуб как гарнитуру- сигнал кодировал синусоидой — за 1 секунду передаю 50 — 70 байт. В качестве примера использовал проект auriotuch с apple сайта.
                        0
                        Ребят, а есть кто-нибудь кто знает поддерживается ли профиль SPP (Serial Port Profile). Потому как противоречивые высказывания есть по этому поводу в сети. На сайте apple оффициально не поддерживается, но на stackoverflow некоторые вроде бы писали что поддерживается, но «ограниченно».
                          0
                          Нет, к сожалению без джейла либо без вступления в программу apple mfi доступ к spp закрыт.

                        Only users with full accounts can post comments. Log in, please.