蓝牙是手机的近距离无限传输的技术,在之前的Windows Phone 7系统手机里面仅支持蓝牙耳机功能,并不支持蓝牙文件信息传输,那么在Windows Phone 8手机里面将全面支持蓝牙技术,并且提供了相关的API来给开发者使用。开发者可以利用蓝牙的相关API来创建应用程序,在应用程序里面使用手机的蓝牙技术来进行近距离的文件传输和发送接收消息,创造出更加有趣和方便的应用软件。
在Windows Phone 8里面可以在应用程序里面利用蓝牙进行通信,使用蓝牙相关的API,可以让应用程序连接到另外的一个应用程序,也可以让应用程序连接到一个设备上。Windows Phone 8的蓝牙技术支持两个蓝牙方案:一个是应用程序到应用程序的通信,另外一个是应用程序到设备的通信。
1.应用程序到应用程序的通信
应用程序到应用程序的通信的过程是,应用程序使用蓝牙去查找正在广播蓝牙服务的对等的应用程序,如果在应用程序提供服务的范围内发现一个应用程序,那么该应用程序可以发起连接请求。当这两个应用程序接受连接,它们之间就可以进行通信了,通信的过程是使用socket的消息发送接收机制。在Windows Phone 8中使用到应用程序到应用程序的蓝牙通讯技术,需要在项目的WMAppManifest.xml文件中添加ID_CAP_PROXIMITY的功能选项,表示支持临近的设备通信能力,否则程序会出现异常。
2.应用程序到设备的通信
在应用程序到设备的通信过程时,应用程序使用蓝牙去查找提供服务的设备,如果提供的服务范围之内发现一个可以连接的蓝牙设备,那么该应用程序可以发起连接请求。当应用程序和设备同时接受该连接,它们之间就可以进行通信了,通信的过程也是使用socket的消息发送接收机制,类似于应用程序到应用程序的通信。在Windows Phone 8中使用到应用程序到设备的蓝牙通讯技术,需要在项目的WMAppManifest.xml文件中添加ID_CAP_PROXIMITY和ID_CAP_NETWORKING的功能选项,表示支持临近的设备通信能力和网络通信能力,否则程序会出现异常。
蓝牙编程类
在Windows Phone 8里面使用到蓝牙编程主要会用到PeerFinder类,PeerInformation类,StreamSocket类和ConnectionRequestedEventArgs类,这些类的说明如表19.1所示。因为蓝牙也是基于TCP协议进行消息传递了,所以需要用到Socket的相关的编程知识,以及StreamSocket类。PeerFinder类是蓝牙查找类,它的主要成员如表19.2所示。
表19.1 蓝牙编程类的说明
类名 | 说明 |
PeerFinder | 用于去查找附近的设备是否有运行和当前应用程序相同的应用程序,并且可以在两个应用程序之间建立起socket连接,从而可以进行通信。对等应用程序是在其他设备上运行的应用程序的另一个实例。 |
PeerInformation | 包含对等应用程序或设备的识别信息。 |
StreamSocket | 支持使用一个TCP的Socket流的网络通信。 |
ConnectionRequestedEventArgs | 表示传递到一个应用程序的ConnectionRequested事件的属性 |
表 19.2 PeerFinder类的成员
成员 | 说明 |
bool AllowBluetooth | 指定 PeerFinder 类的此实例是否可以通过使用 Bluetooth 来连接 ProximityStreamSocket 对象。如果PeerFinder 的此实例可以通过使用 Bluetooth 来连接 ProximityStreamSocket 对象,则为 true;否则为false。默认为 true。 |
bool AllowInfrastructure | 是否使用TCP/IP协议连接到StreamSocket |
bool AllowWiFiDirect | 指定 PeerFinder 类的此实例是否可以通过使用 Wi-Fi Direct 来连接 ProximityStreamSocket 对象。如果 PeerFinder 的此实例可以通过使用 Wi-Fi Direct 来连接 ProximityStreamSocket 对象,则为 true;否则为false。默认为 true。 |
IDictionary<string, string> AlternateIdentities | 获取要与其他平台上的对等应用程序匹配的备用 AppId 值列表。返回要与其他平台的对等类应用程序匹配的备用 AppId 值列表。 |
string DisplayName | 获取或设置标识计算机到远程对等类的名称。 |
PeerDiscoveryTypes SupportedDiscoveryTypes | 获取一个值,该值指示哪些发现选项可与 PeerFinder 类一同使用 |
event TypedEventHandler<object, ConnectionRequestedEventArgs> ConnectionRequested | 远程对等类使用 ConnectAsync 方法请求连接时发生。 |
event TypedEventHandler<object, TriggeredConnectionStateChangedEventArgs> TriggeredConnectionStateChanged | 在远程对等类的轻击笔势期间发生。 |
IAsyncOperation< StreamSocket> ConnectAsync(PeerInformation peerInformation) | 连接已发现了对 FindAllPeersAsync 方法的调用的对等类。peerInformation:表示连接到的对等类的对等类信息对象。返回通过使用所提供的临近StreamSocket 对象连接远程对等类的异步操作。 |
IAsyncOperation<IReadOnlyList<PeerInformation>> FindAllPeersAsync() | 适用于无线范围内运行相同应用程序的对等计算机的异步浏览。返回通过使用 Wi-Fi直连技术浏览对等类的异步操作。 |
void Start(string peerMessage) | 向临近设备上的对等类应用程序传递消息。 |
void Stop() | 停止查找对等类应用程序或广播对等类连接的过程 |
查找蓝牙设备和对等项
查找在服务范围内的蓝牙设备和对等项是蓝牙编程的第一步,查找蓝牙设备和对等项中会使用到PeerFinder类的FindAllPeersAsync方法去进行查找,然后以异步的方式返回查找到的对等项列表的信息IReadOnlyList<PeerInformation>,注意要使查找对等的应用程序时,在调用FindAllPeersAsync方法前必须先调用PeerFinder类的Start方法,主要的目的是启动广播服务,让对方的应用程序也能查找到自己。PeerInformation包含三个属性:一个是DisplayName表示对等项的名字,这个名字一般都是由对方的设备的名称或者查找到的应用程序自身设置的现实名字,一个是HostName表示主机名字或者IP地址,还有一个属性是ServiceName表示服务名称或者TCP协议的端口号。然后可以利用查找到的PeerInformation信息进行连接和通信。
查找对等的应用程序的代码示例:
async void AppToApp() { // 启动查找服务 PeerFinder.Start(); //开始查找 ObservableCollection<PeerInformation> peers = await PeerFinder.FindAllPeersAsync(); if (peers.Count == 0) { //未找到任何的对等项 } else { //处理查找到的对等项,可以使用PeerFinder类的ConnectAsync方法来连接选择的要进行通信的对等项 } }
查找蓝牙设备的代码示例:
private async void AppToDevice() { // 设置查找所匹配的蓝牙设备 PeerFinder.AlternateIdentities["Bluetooth:Paired"] = ""; // 开始查找 ObservableCollection<PeerInformation> pairedDevices = await PeerFinder.FindAllPeersAsync(); if (pairedDevices.Count == 0) { // 没有找到可用的蓝牙设备 } else { //处理查找到的蓝牙设备,可以新建一个StreamSocket对象,然后使用StreamSocket类的ConnectAsync方法通过HostName和ServiceName来连接蓝牙设备 } }
本文导航
- 第1页: 首页
- 第2页: 蓝牙发送接收信息
- 第3页: 实现蓝牙程序对设备的连接