iPhone 蓝牙通信编程初步(网上收集)
iPhone 蓝牙通信编程初步
iOS 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
2
3 #import
4
5 @interface BluetoothViewController : UIViewController {
6
7 GKSession * currentSession;
8
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 "
2
3 #import
4
5 @implementation BluetoothViewController
6
7 @synthesize currentSession;
8
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 {
2
3 [connect setHidden:NO];
4
5 [disconnect setHidden:YES];
6
7 [super viewDidLoad];
8
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 "
2
3 #import
4
5 @implementation BluetoothViewController
6
7 @synthesize currentSession;
8
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 {
2
3 picker = [[GKPeerPickerController alloc] init];
4
5 picker.delegate = self;
6
7 picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;
8
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
2
3 didConnectPeer:(NSString * )peerID
4
5 toSession:(GKSession * ) session {
6
7 self.currentSession = session;
8
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
2
3 {
4
5 picker.delegate = nil;
6
7 [picker autorelease];
8
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 {
2
3 [self.currentSession disconnectFromAllPeers];
4
5 [self.currentSession release];
6
7 currentSession = nil;
8
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
2
3 peer:(NSString * )peerID
4
5 didChangeState:(GKPeerConnectionState)state {
6
7 switch (state)
8
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
2
3 {
4
5 if (currentSession)
6
7 [self.currentSession sendDataToAllPeers:data
8
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
2
3 fromPeer:(NSString * )peer
4
5 inSession:(GKSession * )session
6
7 context:(void * )context {
8
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 蓝牙通信编程初步(网上收集)相关推荐
- android 蓝牙通信编程
http://blog.csdn.net/yudajun/article/details/8362916 公司项目涉及蓝牙通信,所以就简单的学了学,下面是自己参考了一些资料后的总结,希望对大家有帮助. ...
- iPhone蓝牙编程之实现语音聊天 .
感谢原创人.致敬!! [IT168技术]在我之前的iPhone文章中,我们已经介绍过使用GameKit框架在两个设备之间通过蓝牙通信,在这篇文章中,我将为大家介绍GameKit框架另一个很酷的功能 - ...
- 轻松易懂arduino低功耗BLE蓝牙通信
今天我们介绍蓝牙通信的另一种方式--BLE(Bluetooth Low Energy,蓝牙低功耗). 什么是BLE 在<无线通信3:HC05/HC06经典蓝牙BT ...
- STM32CubeIDE开发(二十五), 物联网应用之stm32的蓝牙通信设计
一.蓝牙通信技术 蓝牙技术是一种点对点点对面的网络构架,他可以在限制的范围内以很快的速度传输网络数据,在物联网应用中,支持网状网络的物联网短距离无线通信.目前它还被广泛用于智能可穿戴设备.智能门锁.智 ...
- Windows编程初步
Windows编程初步 目前来说Windows已经家喻户晓,它的历史是Microsoft历史上最辉煌的一页.人们现在已经基本上使用Windows操作系统,因此在编程方面我们有必要从DOS环境编程向Wi ...
- Appinventor 单片机 手机蓝牙通信实现
欢迎大家访问我的github:https://github.com/Iamttp 有问题一起讨论呀! 简介 不会java的小白,在使用的单片机的蓝牙功能时难道只能上百度下载别人的蓝牙app软件吗?幸运 ...
- 在网上收集了一部分关于使用Google API进行手机定位的资料和大家分享
在网上收集了一部分关于使用Google API进行手机定位的资料和大家分享: 关于基站定位方面的介绍: http://tech.c114.net/164/a140837.html 开发方面的帮助: h ...
- android 输出字节数组,Android蓝牙通信字节数组的数据类型转换 求教!
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 单片机和安卓手机进行蓝牙通信,发送电压数据到手机,恰好每次8位数据(1字节)传给上位机.采用以下代码获得16进制字符输出,以下是蓝牙通信接收并显示数据部分 ...
- Android蓝牙通信具体解释
蓝牙通信的大概过程例如以下: 1.首先开启蓝牙 2,搜索可用设备 3,创建蓝牙socket.获取输入输出流 4,读取和写入数据 5.断开连接关闭蓝牙 还要发送配对码发送进行推断! 以下是全部的源码:不 ...
最新文章
- Python3 使用推导式统计字符出现次数
- WGAN-GP 学习笔记
- 王道操作系统考研笔记——2.2.0 交互式系统调度算法
- spring mvc 下载文件链接
- App测试工具大全,收藏这篇就够了
- C++静态代码分析工具横向对比
- box-sizing: border-box的作用
- UBuntu安装配置记录
- 前端预览pdf文件流
- Linux基础 - 服务管理(systemd)
- 【第九章】vim程序编辑器
- Java“菜单“树递归-合并子树
- WPF 延时操作实现 --- Application.DoEvents()
- H.265/HEVC解码器 C 参考代码
- mysql 三个表级联查询,以主表为主数据表为辅
- office打开不了服务器文件,Office常见打开问题及解决 -电脑资料
- 干货分享 | 如何搭建一个虚拟展厅虚拟展厅怎么做?
- 原生ajax如何跨域,封装一个原生js的ajax请求,支持IE9CORS跨域请求
- 利用百度API实现语音合成
- python:PTA try-except-else异常
热门文章
- stored-program Computer/von Neumann Architecture 冯诺依曼体系结构
- 通过selenium抓取新浪微博
- matlab示波器图形导出,(最新整理)Matlab-simulink示波器图形保存
- 《30岁前的每一天》读书笔记
- php怎么控制段落排版,使用p上下分段落的排版,上下段落间距如何设置
- 机器学习中的编码器-解码器结构哲学
- C++程序设计基础之(第三章)函数
- 考研—操作系统—进程管理
- I3D泛读【Que Vadis,Action Recognition?A New Model and the Kinetics Dataset】
- 2014522420145238 《信息安全系统设计基础》 第四次实验