iPhone 掌握蓝牙通信编程

原文地址不详。

 iPhone OS 3.0的最佳功能是GameKit框架,这个框架包括了允许基于蓝牙网络进行通信的API,你可以更轻松地创建点到点的游戏和应用程序。与其它移动平台不一样,在iPhone中使用蓝牙作为一个通信信道比预期的要容易得多,因此,本文将向你展示如何构建一个简单的应用程序,实现iPhone和iPod之间的相互通信。

  注意:如果要测试本文所介绍的内容,需要两部iPhone(3G或3GS),或使用iPhone OS 3.0或更高版本的iPod设备(二代或更新版本)。

  创建一个项目

  使用Xcode,创建一个新的基于视图的应用程序项目,取名为Bluetooth。访问蓝牙的各种API位于GameKit框架中,因此,你需要将这个框架添加到刚刚创建的项目中,在Xcode的框架组上点右键,选择“添加”*“现有框架”,选择GameKit框架,如图1所示。

  

  图 1 添加GameKit框架

  在BluetoothViewController.h文件中,声明下面的对象,outlet和行为:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->1  #import

3   #import

5   @interface BluetoothViewController : UIViewController {

7   GKSession *currentSession;

9   IBOutlet UITextField *txtMessage;
10 
11   IBOutlet UIButton *connect;
12 
13   IBOutlet UIButton *disconnect;
14 
15   }
16 
17   @property (nonatomic, retain) GKSession *currentSession;
18 
19   @property (nonatomic, retain) UITextField *txtMessage;
20 
21   @property (nonatomic, retain) UIButton *connect;
22 
23   @property (nonatomic, retain) UIButton *disconnect;
24 
25   -(IBAction) btnSend:(id) sender;
26 
27   -(IBAction) btnConnect:(id) sender;
28 
29   -(IBAction) btnDisconnect:(id) sender;
30 
31   @end
32 
33

  GKSession对象用于表现两个蓝牙设备之间连接的一个会话,你也可以使用它在两个设备之间发送和接收数据。

  在BluetoothViewController.m文件中,添加下面的代码:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->1 #import "BluetoothViewController.h"

3   #import

5   @implementation BluetoothViewController

7   @synthesize currentSession;

9   @synthesize txtMessage;
10 
11   @synthesize connect;
12 
13   @synthesize disconnect;
14 
15

  双击BluetoothViewController.xib在Interface Builder中编辑它,在视图窗口中添加以下视图,如图2所示。

  文本区域(Text Field)

  圆形按钮(Round Rect Button)

  

  图 2在视图窗口中填充文本区域和圆形按钮视图

  执行以下行为:

  按住CTRL键,在文件所有者项目上点击,将其拖放到文本区域视图上,选择txtMessage;

  按住CTRL键,在文件所有者项目上点击,将其拖放到连接按钮上,选择connect;

  按住CTRL键,在文件所有者项目上点击,将其拖放到断开连接按钮上,选择disconnect;

  按住CTRL键,在发送按钮上点击,将其拖放到文件所有者项目上,选择btnSend;

  按住CTRL键,在连接按钮上点击,将其拖放到文件所有者项目上,选择btnConnect;

  按住CTRL键,在断开连接按钮上点击,将其拖放到文件所有者项目上,选择btnDisconnect;

  在文件所有者项目上点击右键,验证所有连接是否正常,如图3所示。

  

  图 3 验证所有连接是否正常

  返回Xcode,在BluetoothViewController.m文件中,添加以下代码:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->1  - (void)viewDidLoad {

3   [connect setHidden:NO];

5   [disconnect setHidden:YES];

7   [super viewDidLoad];

9   }
10 
11   - (void)dealloc {
12 
13   [txtMessage release];
14 
15   [currentSession release];
16 
17   [super dealloc];
18 
19   }
20 
21

  搜索对等设备

  现在所有准备工作已经就绪,接下来介绍一下访问其它蓝牙设备的API。

  在BluetoothViewController.h文件中,声明一个GKPeerPickerController对象:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->1 #import "BluetoothViewController.h"

3   #import

5   @implementation BluetoothViewController

7   @synthesize currentSession;

9   @synthesize txtMessage;
10 
11   @synthesize connect;
12 
13   @synthesize disconnect;
14 
15   GKPeerPickerController *picker;
16 
17

  GKPeerPickerController类提供了一个标准的UI让你的应用程序发现并连接到其它蓝牙设备,连接方法并不难,首先实现一个btnConnect:类:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->1  -(IBAction) btnConnect:(id) sender {

3   picker = [[GKPeerPickerController alloc] init];

5   picker.delegate = self;

7   picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;

9   [connect setHidden:YES];
10 
11   [disconnect setHidden:NO];
12 
13   [picker show];
14 
15   }
16 
17

  connectionTypesMask属性指出用户可以选择的连接类型,包括两种类型:GKPeerPickerConnectionTypeNearby和GKPeerPickerConnectionTypeOnline。对于蓝牙通信,使用GKPeerPickerConnectionTypeNearby常量,GKPeerPickerConnectionTypeOnline常量表示基于互联网的连接。

  检测到远程蓝牙设备,用户选择并连接到其中一个蓝牙设备时,调用peerPickerController:didConnectPeer:toSession:方法,这个方法的实现如下:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->1 - (void)peerPickerController:(GKPeerPickerController *)picker

3   didConnectPeer:(NSString *)peerID

5   toSession:(GKSession *) session {

7   self.currentSession = session;

9   session.delegate = self;
10 
11   [session setDataReceiveHandler:self withContext:nil];
12 
13   picker.delegate = nil;
14 
15   [picker dismiss];
16 
17   [picker autorelease];
18 
19   }
20 
21

  当用户已经连接到对等蓝牙设备后,可以将GKSession对象保存到currentSession属性中,这样你可以使用GKSession对象与远程设备通信。

  如果用户取消了蓝牙选择器,调用peerPickerControllerDidCancel:方法,其定义如下:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->1  - (void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker

3   {

5   picker.delegate = nil;

7   [picker autorelease];

9   [connect setHidden:NO];
10 
11   [disconnect setHidden:YES];
12 
13   }
14 
15

  如果要从一个设备断开连接,使用来自GKSession对象的disconnectFromAllPeers方法,btnDisconnect:方法的实现如下:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->1  -(IBAction) btnDisconnect:(id) sender {

3   [self.currentSession disconnectFromAllPeers];

5   [self.currentSession release];

7   currentSession = nil;

9   [connect setHidden:NO];
10 
11   [disconnect setHidden:YES];
12 
13   }
14 
15

  连接设备或断开连接时,调用session:peer:didChangeState:方法,其实现如下:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->1 - (void)session:(GKSession *)session

3   peer:(NSString *)peerID

5   didChangeState:(GKPeerConnectionState)state {

7   switch (state)

9   {
10 
11   case GKPeerStateConnected:
12 
13   NSLog(@"connected");
14 
15   break;
16 
17   case GKPeerStateDisconnected:
18 
19   NSLog(@"disconnected");
20 
21   [self.currentSession release];
22 
23   currentSession = nil;
24 
25   [connect setHidden:NO];
26 
27   [disconnect setHidden:YES];
28 
29   break;
30 
31   }
32 
33   }
34 
35

  处理这个事件你将知道连接是什么时候建立的,或断开是什么时候发生的。例如,当建立一个连接时,你可能想要立即向对方发送数据。

  发送数据

  为了向连接的蓝牙设备发送数据,需要使用到GKSession对象的sendDataToAllPeers:方法,你发送的数据是通过NSData对象传输的,因此你可以自定义你的应用程序协议和发送的数据类型(如二进制数据),mySendDataToPeers:方法的定义如下:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->1  - (void) mySendDataToPeers:(NSData *) data

3   {

5   if (currentSession)

7   [self.currentSession sendDataToAllPeers:data

9   withDataMode:GKSendDataReliable
10 
11   error:nil];
12 
13   }
14 
15   再定义btnSend:方法,以便用户输入的数据能够发送到远程设备:
16 
17   -(IBAction) btnSend:(id) sender
18 
19   {
20 
21   //---convert an NSString object to NSData---
22 
23   NSData* data;
24 
25   NSString *str = [NSString stringWithString:txtMessage.text];
26 
27   data = [str dataUsingEncoding: NSASCIIStringEncoding];
28 
29   [self mySendDataToPeers:data];
30 
31   }
32 
33

  接收数据

  当设备接收到数据时,调用receiveData:fromPeer:inSession:context:方法,其实现如下:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->1 - (void) receiveData:(NSData *)data

3   fromPeer:(NSString *)peer

5   inSession:(GKSession *)session

7   context:(void *)context {

9   //---convert the NSData to NSString---
10 
11   NSString* str;
12 
13   str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
14 
15   UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Data received"
16 
17   message:str
18 
19   delegate:self
20 
21   cancelButtonTitle:@"OK"
22 
23   otherButtonTitles:nil];
24 
25   [alert show];
26 
27   [alert release];
28 
29   }
30 
31

  这里接收到的数据是NSData格式,为了使用UIAlertView类显示它,你需要将其转换为NSString对象。

  测试应用程序

  就是这么简单!现在可以开始测试了,在Xcode中按下Command-R,将程序部署到iPhone/iPod上,本文假设你有两部iPhone或两部iPod,为了运行刚刚创建的程序,这两台设备上都需要运行iPhone OS 3.0。

  部署好程序后,在两台设备上启动好程序,在任一设备上点击连接按钮,GKPeerPickerController将会显示标准的UI发现其它设备,如图4所示。

  

  图 4 GKPeerPickerController查找其它设备

  等待一会儿后,两边的程序应该都能够发现对方,如图5所示,当你在发现的设备名称上轻轻点击,程序就会开始连接。

  

  图 5 显示发现的设备名称

  注意:如果你在iPhone模拟器上测试这个程序,应该会检测到两个设备,但却无法连接到任何设备。

  当其它设备试图连接到你的设备时,你将会看到如图6所示的弹出提示,点击“接受”允许其连接,点击“拒绝”拒绝其连接。

  

  图 6 其它设备试图连接到你时的提示

  如果成功与你建立了连接,你就可以输入一些文本信息发给对方了,从其它设备接收到数据将会以一个警告视图显示,如图7所示。

  

  图 7 接收到其它设备发来的数据

  小结

  通过本文的介绍,你会发现使用蓝牙连接两台iPhone/iPod是多么的简单,使用本文所介绍的内容,你可以轻松构建一个网络游戏或其它有趣的应用。在下一篇文章中,我将会介绍如何使用蓝牙连接传输语音数据,请密切关注。

时间: 2024-09-14 00:18:06

iPhone 掌握蓝牙通信编程的相关文章

Android蓝牙通信编程_Android

项目涉及蓝牙通信,所以就简单的学了学,下面是自己参考了一些资料后的总结,希望对大家有帮助.  以下是开发中的几个关键步骤: 1.首先开启蓝牙  2.搜索可用设备  3.创建蓝牙socket,获取输入输出流  4.读取和写入数据 5.断开连接关闭蓝牙  下面是一个蓝牙聊天demo  效果图:  在使用蓝牙是 BluetoothAdapter 对蓝牙开启,关闭,获取设备列表,发现设备,搜索等核心功能  下面对它进行封装:  package com.xiaoyu.bluetooth; import j

Phone 蓝牙通信编程(初级)

原文地址:http://tech.it168.com/a2010/0114/837/000000837727.shtml iPhone OS 3.0的最佳功能是GameKit框架,这个框架包括了允许基于蓝牙网络进行通信的API,你可以更轻松地创建点到点的游戏和应用程序.与其它移动平台不一样,在iPhone中使用蓝牙作为一个通信信道比预期的要容易得多,因此,本文将向你展示如何构建一个简单的应用程序,实现iPhone和iPod之间的相互通信. 注意:如果要测试本文所介绍的内容,需要两部iPhone(

我在做windows下的蓝牙4.0通信编程,想买一个适配器,想问下对适配器有要求吗

问题描述 我在做windows下的蓝牙4.0通信编程,想买一个适配器,想问下对适配器有要求吗 还有程序是怎么与适配器联系的呀,初学,有过开发经验的大神帮帮我吧,急急急,拜托啦 解决方案 没什么要求,京东上30块钱的足够了.注意看清楚支持bluetooth4.0就可以.蓝牙的开发除了配对,其它和网络类似.很简单的.会有一个ip地址.不需要你额外的代码.

蓝牙通信怎么实现?c++

问题描述 蓝牙通信怎么实现?c++ 1.蓝牙通信要满足几个条件?与手机品牌等有关吗?2.安卓应用程序如果可以分两部分编写吗?想用c++和android编写,能实现吗,整合的时候两部分怎么建立关联?有没有好的蓝牙编程的资料,求推荐!太穷了,没有c币哦 解决方案 Android中蓝牙通信的实现蓝牙通信j2me实现蓝牙通信 解决方案二: android上已经封装的很好了,去找本android书看看吧,都会讲的很清楚的.想用c++写也是可以的, 需要使用ndk,了解一下JNI协议就好 解决方案三: an

实现Android和PC之间的蓝牙通信

   这两天想实现PC和安卓手机的通信,限于水平,知道的方法大概有两种:基于数据包的socket和蓝牙.虽然看起来简单,但调也调了两天多.自己测试了下socket,在室内WIFI环境下时延大概是0.1s.而在3G网络下时延居然达3s之多,而且只要不发数据,端口貌似就会断掉,总之,很不爽.于是,便考虑了蓝牙的方法. 实现手机和PC的蓝牙通信,一种是最常用的蓝牙虚拟串口,这种方法可以通过配置非常简单地实现,很多外置蓝牙GPS都用这种做法.但大名鼎鼎的安卓却不支持,因此对大部分外置GPS都不提供支持(

在php串口通信编程时,出现win_serial is not compiled into PHP

问题描述 在php串口通信编程时,出现win_serial is not compiled into PHP 最近想试试php的串口通信,我装的是phpstudy2014,我看了一下apache2.4和php5xx等系列都装在里面,于是下了个对应php版本的php_ser++.dll,并且放在了ext中,并在php.ini中添加了extension=php_ser++.dll,但用php designer8.0调试时,却出现了win_serial不能被编译成PHP,事关紧急,忘大神指导?????

Android蓝牙通信概述

通常情况下,我们对蓝牙的操作主要有:开启和关闭蓝牙.搜索周边设备.能被周边设备所发现.获取配对设备.蓝牙设备间的数据传输. 1.打开蓝牙(当然首先要确保你的手机是有蓝牙设备的) 蓝牙设备主要分为两部分,一部分为本地设备,另一部分为远程设备. BluetoothAdapter--本地设备,对蓝牙操作首先就需要有一个BluetoothAdapter实例.常用的几个方法如下: cancelDiscovery()--取消本地蓝牙设备的搜索操作,如果本地设备正在进行搜索,那么调用该方法后将停止搜索操作.

android-关于Android蓝牙通信的问题

问题描述 关于Android蓝牙通信的问题 想实现Android 和PC之间的蓝牙通信,在网上查找后发现有手机端和PC端两个代码要写,但是我不知道PC端的代码是写在手机端的那个APP里,还是单独再创建一个APP写作新的APP里面 解决方案 最近同学要做一个手机与蓝牙模块的通信的毕业设计,让我帮忙写一个手机端的应用,匆匆的找了些资料,总算是能勉强实现通信,总结一些关键的步骤:首先,android蓝牙通信步骤:1:打开蓝牙2:搜索蓝牙设备3:选择设备进行配对(连接前必须先配对)4:对配对好的设备建立

安卓应用开发-安卓蓝牙通信 基于底层单片机蓝牙模块的通信

问题描述 安卓蓝牙通信 基于底层单片机蓝牙模块的通信 现在在做一个app项目,负责显示由底层单片机蓝牙模块发送过来的数据,单片机 不断循环发送 s234,而我这边显示不全,一会儿显示s,一会儿显示234开发-安卓蓝牙通信 基于底层单片机蓝牙模块的通信-单片机与蓝牙模块通信"> 解决方案 安卓蓝牙通信安卓蓝牙通信安卓蓝牙通信 解决方案二: 可以设置发送接收标志,单片机发送一个标志告诉安卓端应用,准备开始接收有效数据,单片机发送完后再发送结束标志,告诉安卓端应用发送完成. 安卓端的应用如果没收