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

时间: 2024-11-12 01:22:44

【iOS与EV3混合机器人编程系列之7】通过蓝牙控制EV3的相关文章

【iOS与EV3混合机器人编程系列之三】编写EV3 Port Viewer 应用监测EV3端口数据

在前两篇文章中,我们对iOS与EV3混合机器人编程做了一个基本的设想,并且介绍了要完成项目所需的软硬件准备和知识准备. 那么在今天这一篇文章中,我们将直接真正开始项目实践. ==第一个项目: EV3 Port Viewer== 项目目的:在iOS设备上通过WiFi连接EV3并且读取EV3每个端口的数据. 大家可以一周之后在App Store上搜索EV3 Port Viewer,那么我已经做了一个范例App发布了,正在审核中 应用的基本使用要求:将EV3和iPhone同时连接到同一个WiFi网络中

【iOS与EV3混合机器人编程系列之二】工欲善其事,必先利其器(准备篇)

在上一篇文章中,我们论述了iOS与EV3结合后机器人开发的无限可能, 那么,大家要不要一起来Hacking一把呢? 为了能够完整地完成我接下来我讲的项目,我们需要做以下准备: 1.一台Mac运行MAC OS X 10.9.3以上的操作系统. 2.Xcode6.这是iOS在Mac上的开发工具.我们将使用Xcode来进行所有的项目程序的编写 3.一两个iOS设备,iPhone或iPad都行.实际上大家最好有两个iOS设备,因为最后的项目中iPhone将和EV3机器人放在一起,而用另一个iOS设备来查

【iOS与EV3混合机器人编程系列之五】iOS_WiFi_EV3_Library 剖析之连接EV3

在上一篇文章中,我们讲解了如何用开源代码库CocoaAsyncSocket来实现iOS上的UDP和TCP数据通信.那么在本文中,我们将介绍在CocoaAsyncSocket的基础如何使用UDP和TCP连接EV3的机制. 之所以我们能够通过无线连接EV3,根本原因在于EV3的源代码内建了一套无线连接通信的机制. 这套机制是这样的: 1)EV3在连接到无线网络后,就不断地从3015端口发送UDP数据,数据的格式如下: Serial-Number: 0016533f0c1ePort: 5555Name

【iOS与EV3混合机器人编程系列之一】iOS要干嘛?EV3可以更酷!

乐高Mindstorm EV3智能机器人(以下简称EV3)自从在2013年的CES(Consumer Electronics Show美国消费电子展)上展出之后,就吸引了全球广大机器人爱好者的眼球!EV3相比其上一代机器人NXT最大的提升就在于其硬件上.除了更强大的ARM处理器,并加载了Linux操作系统之外,EV3还配备了蓝牙,支持外接USB,外接WiFi.因为有了这么多的硬件提升,EV3最酷的特性在于EV3支持iOS设备!!!这使得我们可以使用iOS设备比如iPhone来控制EV3!乐高官方

【iOS与EV3混合机器人编程系列之四】iOS_WiFi_EV3_Library 剖析之一:WiFi UDP和TCP

在上一篇文章中,我们通过编写EV3 Port Viewer项目实现了iOS监测EV3的实时端口数据.程序最核心的部分就是我们的开源代码库iOS_WiFi_EV3_Library.那么,在本文中,我们将详细介绍我们这个库的编写.为了完成这个库,本人参考了网上很多资料,主要包括EV3的源代码,win版本的代码库以及Monobrick相关以及网上的各种资料,在此就不一一列举了.由于水平有限,本代码库还存在各种问题,望使用的读者见谅.大家也可以在这个基础之上自己进行改造完善. 为了详细说明代码库的实现,

【iOS与EV3混合机器人编程系列之四】iOS_WiFi_EV3_Library 剖析之中的一个:WiFi UDP和TCP

在上一篇文章中.我们通过编写EV3 Port Viewer项目实现了iOS监測EV3的实时端口数据. 程序最核心的部分就是我们的开源码库iOS_WiFi_EV3_Library. 那么,在本文中,我们将具体介绍我们这个库的编写.为了完毕这个库,本人參考了网上许多资料,主要包括EV3的源码,win版本号的代码库以及Monobrick相关以及网上的各种资料,在此就不一一列举了. 因为水平有限,本代码库还存在各种问题,望使用的读者见谅. 大家也能够在这个基础之上自己进行改造完好. 为了具体说明代码库的

【iOS与EV3混合机器人编程系列之六】iOS_WiFi_EV3_Library 剖析之发送命令给EV3

在上一篇文章中,我们已经知道了如何通过WiFi将iOS设备和EV3连接起来,那么下一步的工作就是从iOS设备中发送命令给EV3并接收EV3返回的数据.这也是本篇文章将告诉大家的. 首先要明确的一点是本开源代码库只封装了EV3直接命令(Direct Command),也就是无需在EV3上开发任何程序就能使用这些命令对EV3进行控制. 目前库中的API包含以下这些: #pragma mark - EV3 Direct Command // Scan or stop scan each port se

【iOS与EV3混合机器人编程一系列五个】iOS_WiFi_EV3_Library 解剖连接EV3

在上一篇文章中.我们解说了怎样用开源码库CocoaAsyncSocket来实现iOS上的UDP和TCP数据通信.那么在本文中.我们将介绍在CocoaAsyncSocket的基础怎样使用UDP和TCP连接EV3的机制. 之所以我们能够通过无线连接EV3,根本原因在于EV3的源码内建了一套无线连接通信的机制. 这套机制是这种: 1)EV3在连接到无线网络后,就不断地从3015port发送UDP数据.数据的格式例如以下: Serial-Number: 0016533f0c1ePort: 5555Nam

OpenCV for iOS 3 及 玩转EV3 之: 在iPhone上做手势检测 并控制EV3 机器人

1 前言 去年我做了一段时间iPhone和LEGO EV3 机器人的研究,当时已经开发了iOS的EV3 wifi版SDK,能够使得iOS与EV3进行互动,但这还远远达不到我曾经设想的效果,且看我之前的博文: [iOS与EV3混合机器人编程系列之一]iOS要干嘛?EV3可以更酷! http://blog.csdn.net/songrotek/article/details/37652771 iPhone不仅仅要作为EV3 的大脑,还要是EV3的眼睛,脸,还有姿态感觉(陀螺仪).因此,我之后转向视觉