西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发其它知识 → Windows Phone 8蓝牙编程开发

Windows Phone 8蓝牙编程开发

相关软件相关文章发表评论 来源:西西整理时间:2013/1/12 13:02:14字体大小:A-A+

作者:西西点击:227次评论:1次标签: 蓝牙

  • 类型:硬件优化测试大小:13.9M语言:中文 评分:10.0
  • 标签:
立即下载
2 页 蓝牙发送接收信息

蓝牙发送消息

蓝牙编程的发送消息机制使用的是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); 
}

实例:实现蓝牙程序对程序的传输

下面给出蓝牙程序对程序传输的示例:通过使用蓝牙功能查找周边也要使用改应用的手机,互相建立起连接和发送测试消息。
代码清单19-1:蓝牙程序对程序传输(源代码:第19章\Examples_19_1)

MainPage.xaml文件主要代码

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
          <StackPanel>
            <Button x:Name="btFindBluetooth" Content="通过蓝牙查找该应用设备" Click="btFindBluetooth_Click"/>
            <ListBox x:Name="lbBluetoothApp"  ItemsSource="{Binding}" >
              <ListBox.ItemTemplate >
                <DataTemplate>
                  <StackPanel>
                    <TextBlock  Text="{Binding DisplayName}" />
                    <TextBlock  Text="{Binding ServiceName}" />     
                    <Button Content="连接" HorizontalAlignment="Left" Width="308" Height="91" Click="btConnect_Click"/>
                  </StackPanel>
                </DataTemplate>
              </ListBox.ItemTemplate>
            </ListBox>
          </StackPanel>
        </Grid>

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();
        }
    }
}

程序的运行效果如图19.2所示。

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(1)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)