1 前言
在这个系列之前的博客中,我研究觉得在iOS未越狱的情况下,无法使用蓝牙来控制EV3,编写类似Commander的程序。但,最近和网友的研究发现,通过External Accessory 来实现蓝牙的传输比想象的简单。MFI协议的问题比想象的容易很多,关键在于我们可以获取EV3的MFI协议字符串。接下来让我们看看是怎么实现的。
2 具体代码实现
首先Apple官方有个关于External Accessory的demo 叫EAdemo,大家可以下下来,然后在plist文件中改一下协议字符串,如下:
然后运行一下,我们就可以直接连上EV3了。
有了这个基础,我们研究一下实现原理。
Step 1:添加ExternalAccessory.Framework
这一步显而易见。
Step 2:连接到EV3
- (void)connectEV3 { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(accessoryDidConnect:) name:EAAccessoryDidConnectNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(accessoryDidDisconnect:) name:EAAccessoryDidDisconnectNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sessionDataReceived:) name:EADSessionDataReceivedNotification object:nil]; [[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications]; self.sessionController = [EADSessionController sharedController]; accessoryList = [[NSMutableArray alloc] initWithArray:[[EAAccessoryManager sharedAccessoryManager] connectedAccessories]]; NSLog(@"accessory list:%@",accessoryList); if(accessoryList != nil){ [self.sessionController setupControllerForAccessory:[accessoryList firstObject] withProtocolString:@"COM.LEGO.MINDSTORMS.EV3"]; isConnected = [self.sessionController openSession]; } }
- (void)accessoryDidConnect:(NSNotification *)notification { NSLog(@"EV3 did connect!"); EAAccessory *connectedAccessory = [[notification userInfo] objectForKey:EAAccessoryKey]; [self.sessionController setupControllerForAccessory:connectedAccessory withProtocolString:@"COM.LEGO.MINDSTORMS.EV3"]; isConnected = [self.sessionController openSession]; }
在这里我也直接使用了EADemo上的代码来分析。
由于官方例子的EADSessionController把数据传输这部分内容做得很好,我们直接拿来用就好了。
基本过程就是创建实例,建立controller,然后openSession。
Step 3:控制EV3
直接使用之前已经编写好的EV3DirectCommander来实现
简单的例子如下:
- (IBAction)go:(id)sender { if (isConnected) { NSData *data = [EV3DirectCommander turnMotorAtPort:EV3OutputPortB power:50]; [[EADSessionController sharedController] writeData:data]; isGo = YES; } }
3 为什么用蓝牙?
显然之前用Wifi得买额外设备,还得连wifi太麻烦,直接用蓝牙省事很多,可以做得更好的效果!嘿嘿,大家可以自己搞个Commander了!更强大的Commander!
时间: 2024-11-12 01:22:44