




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文由麦可网/course收集整理,转载请注明出处。Windows Phone 8 蓝牙编程蓝牙是手机的近距离无限传输的技术,在之前的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协议连接到StreamSocketbool AllowWiFiDirect指定 PeerFinder 类的此实例是否可以通过使用 Wi-Fi Direct 来连接 ProximityStreamSocket 对象。如果 PeerFinder 的此实例可以通过使用 Wi-Fi Direct 来连接 ProximityStreamSocket 对象,则为 true;否则为false。默认为 true。IDictionary AlternateIdentities获取要与其他平台上的对等应用程序匹配的备用 AppId 值列表。返回要与其他平台的对等类应用程序匹配的备用 AppId 值列表。string DisplayName获取或设置标识计算机到远程对等类的名称。PeerDiscoveryTypes SupportedDiscoveryTypes获取一个值,该值指示哪些发现选项可与 PeerFinder 类一同使用event TypedEventHandler ConnectionRequested远程对等类使用 ConnectAsync 方法请求连接时发生。event TypedEventHandler TriggeredConnectionStateChanged在远程对等类的轻击笔势期间发生。IAsyncOperation ConnectAsync(PeerInformation peerInformation)连接已发现了对 FindAllPeersAsync 方法的调用的对等类。peerInformation:表示连接到的对等类的对等类信息对象。返回通过使用所提供的临近StreamSocket 对象连接远程对等类的异步操作。IAsyncOperationIReadOnlyList FindAllPeersAsync()适用于无线范围内运行相同应用程序的对等计算机的异步浏览。返回通过使用 Wi-Fi直连技术浏览对等类的异步操作。void Start(string peerMessage)向临近设备上的对等类应用程序传递消息。void Stop()停止查找对等类应用程序或广播对等类连接的过程查找蓝牙设备和对等项查找在服务范围内的蓝牙设备和对等项是蓝牙编程的第一步,查找蓝牙设备和对等项中会使用到PeerFinder类的FindAllPeersAsync方法去进行查找,然后以异步的方式返回查找到的对等项列表的信息IReadOnlyList,注意要使查找对等的应用程序时,在调用FindAllPeersAsync方法前必须先调用PeerFinder类的Start方法,主要的目的是启动广播服务,让对方的应用程序也能查找到自己。PeerInformation包含三个属性:一个是DisplayName表示对等项的名字,这个名字一般都是由对方的设备的名称或者查找到的应用程序自身设置的现实名字,一个是HostName表示主机名字或者IP地址,还有一个属性是ServiceName表示服务名称或者TCP协议的端口号。然后可以利用查找到的PeerInformation信息进行连接和通信。查找对等的应用程序的代码示例:async void AppToApp() / 启动查找服务 PeerFinder.Start(); /开始查找 ObservableCollection peers = await PeerFinder.FindAllPeersAsync(); if (peers.Count = 0) /未找到任何的对等项 else /处理查找到的对等项,可以使用PeerFinder类的ConnectAsync方法来连接选择的要进行通信的对等项 查找蓝牙设备的代码示例:private async void AppToDevice() / 设置查找所匹配的蓝牙设备 PeerFinder.AlternateIdentitiesBluetooth:Paired = ; / 开始查找 ObservableCollection 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 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); 实例:实现蓝牙程序对程序的传输下面给出蓝牙程序对程序传输的示例:通过使用蓝牙功能查找周边也要使用改应用的手机,互相建立起连接和发送测试消息。代码清单19-1:蓝牙程序对程序传输(源代码:第19章/Examples_19_1)MainPage.xaml文件主要代码 MainPage.xaml.cs文件主要代码using System;using System.Windows;using System.Windows.Controls;using Microsoft.Phone.Controls;using Windows.Networking.Proximity;using Windows.Networking.Sockets;using Windows.Storage.Streams;namespace BluetoothDemo public partial class MainPage : PhoneApplicationPage private StreamSocket _socket = null; / Socket数据流对象 private DataWriter _dataWriter; / 数据写入对象 private DataReader _dataReader; / 数据读取对象 public MainPage() InitializeComponent(); Loaded += MainPage_Loaded;/页面加载事件 / 查找蓝牙对等项按钮事件处理 private async void btFindBluetooth_Click(object sender, RoutedEventArgs e) try /开始查找对等项 PeerFinder.Start(); / 等待找到的对等项 var peers = await PeerFinder.FindAllPeersAsync(); if (peers.Count = 0) MessageBox.Show(没有发现对等的蓝牙应用); else / 把对等项目绑定到列表中 lbBluetoothApp.ItemsSource = peers; catch(Exception ex) if (uint)ex.HResult = 0x8007048F) MessageBox.Show(Bluetooth已关闭请打开手机的蓝牙开关); else MessageBox.Show(ex.Message); / 连接蓝牙对等项的按钮事件处理 private async void btConnect_Click(object sender, RoutedEventArgs e) Button deleteButton = sender as Button; PeerInformation selectedPeer = deleteButton.DataContext as PeerInformation; / 连接到选择的对等项 _socket = await PeerFinder.ConnectAsync(selectedPeer); / 使用输出输入流建立数据读写对象 _dataReader = new DataReader(_socket.InputStream); _dataWriter = new DataWriter(_socket.OutputStream); / 开始读取消息 PeerFinder_StartReader(); / 读取消息 async void PeerFinder_StartReader() try uint bytesRead = await _dataReader.LoadAsync(sizeof(uint); if (bytesRead 0) / 获取消息内容的大小 uint strLength = (uint)_dataReader.ReadUInt32(); bytesRead = await _dataReader.LoadAsync(strLength); if (bytesRead 0) String message = _dataReader.ReadString(strLength); MessageBox.Show(获取到消息: + message); / 开始下一条消息读取 PeerFinder_StartReader(); else MessageBox.Show(对方已关闭连接); else MessageBox.Show(对方已关闭连接); catch (Exception e) MessageBox.Show(读取失败: + e.Message); / 页面加载事件处理 void MainPage_Loaded(object sender, RoutedEventArgs e) / 订阅连接请求事件 PeerFinder.ConnectionRequested += PeerFinder_ConnectionRequested; / 连接请求事件处理 void PeerFinder_ConnectionRequested(object sender, ConnectionRequestedEventArgs args) / 连接并且发送消息 ConnectToPeer(args.PeerInformation); / 连接并发送消息给对方 async void ConnectToPeer(PeerInformation peer) _socket = await PeerFinder.ConnectAsync(peer); _dataReader = new DataReader(_socket.InputStream); _dataWriter = new DataWriter(_socket.OutputStream); string message = 测试消息; uint strLength = _dataWriter.MeasureString(message); _dataWriter.WriteUInt32(strLength);/写入消息的长度 _dataWriter.WriteString(message);/写入消息的内容 uint numBytesWritten = await _dataWriter.StoreAsync(); 程序的运行效
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度绿色环保地坪材料承包服务合同
- 2025版农业科技园区承包经营合同样本
- 二零二五年度石材园林景观石设计与施工合同
- 2025年度果园生态保护与可持续发展承包服务合同范本
- 2025版房地产估价服务定金合同范本
- 2025版生鲜超市联盟商家合作协议书
- 2025版电力线路巡检电力安全服务合同
- 二零二五年度农产品质量安全追溯购销合同规范
- 2025版二手摩托车二手车鉴定评估机构合作合同
- 2025版火车站站房建筑工程劳务分包合同
- FZ/T 60011-2016复合织物剥离强力试验方法
- 2022大学生就业力调研报告
- 过程审核检查表示例(帮助理解VDA6.3条款)
- GB∕T 37050-2019 紧固螺纹检测体系
- GB 38454-2019 坠落防护 水平生命线装置
- 中征码配码申请表
- 钻孔、剖面、矿体厚度计算表
- 药物流产同意书
- 计量检测项目可行性研究报告(76页)
- 产品报价审批表
- 宁波市公共建筑节能审查备案登记表(共5页)
评论
0/150
提交评论