Здраствуй, читатель! Возникла у меня на работе ситуация, что нужно было спроектировать устройство для 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
Надеюсь данная статья кому то облегчит жизнь. Если кому нибудь нужна будет схема, прошивка устройства или подробности как это в итоге работает- с удовольствием поделюсь!
Автор: AlexFreud