×
Namespaces

Variants
Actions

Windows Phone 8 蓝牙编程

From Nokia Developer Wiki
Jump to: navigation, search
SignpostIcon XAML 40.png
WP Metro Icon WP8.png
Article Metadata
Compatibility
Platform(s):
Windows Phone 8
Article
Created: ()
Last edited: hamishwillee (11 Sep 2013)

Introduction

蓝牙是手机的近距离无限传输的技术,在之前的Windows Phone 7系统手机里面仅支持蓝牙耳机功能,并不支持蓝牙文件信息传输,那么在Windows Phone 8手机里面将全面支持蓝牙技术,并且提供了相关的API来给开发者使用。开发者可以利用蓝牙的相关API来创建应用程序,在应用程序里面使用手机的蓝牙技术来进行近距离的文件传输和发送接收消息,创造出更加有趣和方便的应用软件。

Summary

在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的功能选项,表示支持临近的设备通信能力和网络通信能力,否则程序会出现异常。


查找蓝牙设备和对等项

查找在服务范围内的蓝牙设备和对等项是蓝牙编程的第一步,查找蓝牙设备和对等项中会使用到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来连接蓝牙设备
}
}


蓝牙发送消息

蓝牙编程的发送消息机制使用的是TCP的StreamSocket的方式,原理与Socket的一致。在蓝牙连接成功后,可以获取到一个StreamSocket类的对象,然后我们使用该对象的OutputStream属性来初始化一个DataWriter对象,通过DataWriter对象来进行发送消息。OutputStream属性表示的是Socket的输出流,用于发送消息给对方。下面来看一下发送消息的示例:

async void SendMessage(string message)
{
// 连接选中的对等项,selectedPeer为查找到的PeerInformation对象
StreamSocket _socket= = await PeerFinder.ConnectAsync(selectedPeer);
// 创建DataWriter
DataWriter _dataWriter = new DataWriter(_socket.OutputStream);
// 先写入发送消息的长度
_dataWriter.WriteInt32(message.Length);
await _dataWriter.StoreAsync();
// 最后写入发送消息的内容
_dataWriter.WriteString(message);
await _dataWriter.StoreAsync();
}

蓝牙接收消息

蓝牙编程的接收消息机制同样也是使用的是TCP的 StreamSocket 的方式,原理与Socket的一致。在蓝牙连接成功后,可以获取到一个StreamSocket类的对象,然后我们使用该对象的InputStream属性来初始化一个DataReader对象,通过DataReader对象来进行接收消息。InputStream属性表示的是Socket的输入流,用于接收对方的消息。下面来看一下接收消息的示例:

async Task<string> GetMessage()
{
// 连接选中的对等项,selectedPeer为查找到的PeerInformation对象
StreamSocket _socket= = await PeerFinder.ConnectAsync(selectedPeer);
// 创建DataReader
DataReader _dataReader = new DataReader(_socket.InputStream);
// 先读取消息的长度
await _dataReader.LoadAsync(4);
uint messageLen = (uint)_dataReader.ReadInt32();
// 最后读取消息的内容
await _dataReader.LoadAsync(messageLen);
return _dataReader.ReadString(messageLen);
}
This page was last modified on 11 September 2013, at 06:42.
75 page views in the last 30 days.
×