首页 > 代码库 > 【iOS与EV3混合机器人编程系列之7】通过蓝牙控制EV3
【iOS与EV3混合机器人编程系列之7】通过蓝牙控制EV3
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!
【iOS与EV3混合机器人编程系列之7】通过蓝牙控制EV3
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。