Pull to refresh

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

Reading time2 min
Views18K
Здраствуй, Хабраюзер! Возникла у меня на работе ситуация, что нужно было спроектировать устройство для 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


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

Tags:
Hubs:
+20
Comments24

Articles