【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!


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。