西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴(lài)的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開(kāi)發(fā)其它知識(shí) → Windows Phone 8藍(lán)牙編程開(kāi)發(fā)

Windows Phone 8藍(lán)牙編程開(kāi)發(fā)

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2013/1/12 13:02:14字體大。A-A+

作者:西西點(diǎn)擊:227次評(píng)論:1次標(biāo)簽: 藍(lán)牙

  • 類(lèi)型:硬件優(yōu)化測(cè)試大。13.9M語(yǔ)言:中文 評(píng)分:10.0
  • 標(biāo)簽:
立即下載
2 頁(yè) 藍(lán)牙發(fā)送接收信息

藍(lán)牙發(fā)送消息

藍(lán)牙編程的發(fā)送消息機(jī)制使用的是TCP的StreamSocket的方式,原理與Socket的一致。在藍(lán)牙連接成功后,可以獲取到一個(gè)StreamSocket類(lèi)的對(duì)象,然后我們使用該對(duì)象的OutputStream屬性來(lái)初始化一個(gè)DataWriter對(duì)象,通過(guò)DataWriter對(duì)象來(lái)進(jìn)行發(fā)送消息。OutputStream屬性表示的是Socket的輸出流,用于發(fā)送消息給對(duì)方。下面來(lái)看一下發(fā)送消息的示例:

async void SendMessage(string message)
{
    // 連接選中的對(duì)等項(xiàng),selectedPeer為查找到的PeerInformation對(duì)象
    StreamSocket _socket= = await PeerFinder.ConnectAsync(selectedPeer);
    // 創(chuàng)建DataWriter
    DataWriter _dataWriter = new DataWriter(_socket.OutputStream);
    // 先寫(xiě)入發(fā)送消息的長(zhǎng)度
     _dataWriter.WriteInt32(message.Length);
     await _dataWriter.StoreAsync();
    // 最后寫(xiě)入發(fā)送消息的內(nèi)容
     _dataWriter.WriteString(message);
     await _dataWriter.StoreAsync();
}

藍(lán)牙接收消息

藍(lán)牙編程的接收消息機(jī)制同樣也是使用的是TCP的StreamSocket的方式,原理與Socket的一致。在藍(lán)牙連接成功后,可以獲取到一個(gè)StreamSocket類(lèi)的對(duì)象,然后我們使用該對(duì)象的InputStream屬性來(lái)初始化一個(gè)DataReader對(duì)象,通過(guò)DataReader對(duì)象來(lái)進(jìn)行接收消息。InputStream屬性表示的是Socket的輸入流,用于接收對(duì)方的消息。下面來(lái)看一下接收消息的示例:

async Task<string> GetMessage()
{
    // 連接選中的對(duì)等項(xiàng),selectedPeer為查找到的PeerInformation對(duì)象
    StreamSocket _socket= = await PeerFinder.ConnectAsync(selectedPeer);
    // 創(chuàng)建DataReader
    DataReader _dataReader = new DataReader(_socket.InputStream);
    // 先讀取消息的長(zhǎng)度
    await _dataReader.LoadAsync(4);
    uint messageLen = (uint)_dataReader.ReadInt32();
    // 最后讀取消息的內(nèi)容
    await _dataReader.LoadAsync(messageLen);
    return _dataReader.ReadString(messageLen); 
}

實(shí)例:實(shí)現(xiàn)藍(lán)牙程序?qū)Τ绦虻膫鬏?/strong>

下面給出藍(lán)牙程序?qū)Τ绦騻鬏數(shù)氖纠和ㄟ^(guò)使用藍(lán)牙功能查找周邊也要使用改應(yīng)用的手機(jī),互相建立起連接和發(fā)送測(cè)試消息。
代碼清單19-1:藍(lán)牙程序?qū)Τ绦騻鬏敚ㄔ创a:第19章\Examples_19_1)

MainPage.xaml文件主要代碼

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
          <StackPanel>
            <Button x:Name="btFindBluetooth" Content="通過(guò)藍(lán)牙查找該應(yīng)用設(shè)備" 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數(shù)據(jù)流對(duì)象
        private DataWriter _dataWriter;  // 數(shù)據(jù)寫(xiě)入對(duì)象
        private DataReader _dataReader; // 數(shù)據(jù)讀取對(duì)象
        public MainPage()
        {
            InitializeComponent();     
            Loaded += MainPage_Loaded;//頁(yè)面加載事件
        }
        // 查找藍(lán)牙對(duì)等項(xiàng)按鈕事件處理
        private async void btFindBluetooth_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                //開(kāi)始查找對(duì)等項(xiàng)
                PeerFinder.Start();   
                // 等待找到的對(duì)等項(xiàng)
                var peers = await PeerFinder.FindAllPeersAsync();
                if (peers.Count == 0)
                {
                    MessageBox.Show("沒(méi)有發(fā)現(xiàn)對(duì)等的藍(lán)牙應(yīng)用");
                }
                else
                {
                    // 把對(duì)等項(xiàng)目綁定到列表中
                    lbBluetoothApp.ItemsSource = peers;               
                }
            }
            catch(Exception ex)
            {
                if ((uint)ex.HResult == 0x8007048F)
                {
                    MessageBox.Show("Bluetooth已關(guān)閉請(qǐng)打開(kāi)手機(jī)的藍(lán)牙開(kāi)關(guān)");
                }
                else
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
        // 連接藍(lán)牙對(duì)等項(xiàng)的按鈕事件處理
        private async void btConnect_Click(object sender, RoutedEventArgs e)
        {
            Button deleteButton = sender as Button;
            PeerInformation selectedPeer = deleteButton.DataContext as PeerInformation;
            // 連接到選擇的對(duì)等項(xiàng)
            _socket = await PeerFinder.ConnectAsync(selectedPeer);
            // 使用輸出輸入流建立數(shù)據(jù)讀寫(xiě)對(duì)象
            _dataReader = new DataReader(_socket.InputStream);
            _dataWriter = new DataWriter(_socket.OutputStream);
            // 開(kāi)始讀取消息
            PeerFinder_StartReader();
        }
        // 讀取消息
        async void PeerFinder_StartReader()
        {
            try
            {
                uint bytesRead = await _dataReader.LoadAsync(sizeof(uint));
                if (bytesRead > 0)
                {
                    // 獲取消息內(nèi)容的大小
                    uint strLength = (uint)_dataReader.ReadUInt32();
                    bytesRead = await _dataReader.LoadAsync(strLength);
                    if (bytesRead > 0)
                    {
                        String message = _dataReader.ReadString(strLength);
                        MessageBox.Show("獲取到消息:" + message);
                        // 開(kāi)始下一條消息讀取
                        PeerFinder_StartReader();
                    }
                    else
                    {
                        MessageBox.Show("對(duì)方已關(guān)閉連接");
                    }
                }
                else
                {
                    MessageBox.Show("對(duì)方已關(guān)閉連接");
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("讀取失敗: " + e.Message);
            }
        }
        // 頁(yè)面加載事件處理
        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            // 訂閱連接請(qǐng)求事件
            PeerFinder.ConnectionRequested += PeerFinder_ConnectionRequested;
        }
        // 連接請(qǐng)求事件處理
        void PeerFinder_ConnectionRequested(object sender, ConnectionRequestedEventArgs args)
        {
            // 連接并且發(fā)送消息
            ConnectToPeer(args.PeerInformation);
        }
        // 連接并發(fā)送消息給對(duì)方
        async void ConnectToPeer(PeerInformation peer)
        {
            _socket = await PeerFinder.ConnectAsync(peer);
            _dataReader = new DataReader(_socket.InputStream);
            _dataWriter = new DataWriter(_socket.OutputStream);
            string message = "測(cè)試消息";
            uint strLength = _dataWriter.MeasureString(message);
            _dataWriter.WriteUInt32(strLength);//寫(xiě)入消息的長(zhǎng)度
            _dataWriter.WriteString(message);//寫(xiě)入消息的內(nèi)容
            uint numBytesWritten = await _dataWriter.StoreAsync();
        }
    }
}

程序的運(yùn)行效果如圖19.2所示。

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(1)

    昵稱(chēng):
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)