日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測(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)簽:
      立即下載

      藍(lán)牙是手機(jī)的近距離無(wú)限傳輸?shù)募夹g(shù),在之前的Windows Phone 7系統(tǒng)手機(jī)里面僅支持藍(lán)牙耳機(jī)功能,并不支持藍(lán)牙文件信息傳輸,那么在Windows Phone 8手機(jī)里面將全面支持藍(lán)牙技術(shù),并且提供了相關(guān)的API來(lái)給開(kāi)發(fā)者使用。開(kāi)發(fā)者可以利用藍(lán)牙的相關(guān)API來(lái)創(chuàng)建應(yīng)用程序,在應(yīng)用程序里面使用手機(jī)的藍(lán)牙技術(shù)來(lái)進(jìn)行近距離的文件傳輸和發(fā)送接收消息,創(chuàng)造出更加有趣和方便的應(yīng)用軟件。

      在Windows Phone 8里面可以在應(yīng)用程序里面利用藍(lán)牙進(jìn)行通信,使用藍(lán)牙相關(guān)的API,可以讓?xiě)?yīng)用程序連接到另外的一個(gè)應(yīng)用程序,也可以讓?xiě)?yīng)用程序連接到一個(gè)設(shè)備上。Windows Phone 8的藍(lán)牙技術(shù)支持兩個(gè)藍(lán)牙方案:一個(gè)是應(yīng)用程序到應(yīng)用程序的通信,另外一個(gè)是應(yīng)用程序到設(shè)備的通信。

      1.應(yīng)用程序到應(yīng)用程序的通信

      應(yīng)用程序到應(yīng)用程序的通信的過(guò)程是,應(yīng)用程序使用藍(lán)牙去查找正在廣播藍(lán)牙服務(wù)的對(duì)等的應(yīng)用程序,如果在應(yīng)用程序提供服務(wù)的范圍內(nèi)發(fā)現(xiàn)一個(gè)應(yīng)用程序,那么該應(yīng)用程序可以發(fā)起連接請(qǐng)求。當(dāng)這兩個(gè)應(yīng)用程序接受連接,它們之間就可以進(jìn)行通信了,通信的過(guò)程是使用socket的消息發(fā)送接收機(jī)制。在Windows Phone 8中使用到應(yīng)用程序到應(yīng)用程序的藍(lán)牙通訊技術(shù),需要在項(xiàng)目的WMAppManifest.xml文件中添加ID_CAP_PROXIMITY的功能選項(xiàng),表示支持臨近的設(shè)備通信能力,否則程序會(huì)出現(xiàn)異常。

      2.應(yīng)用程序到設(shè)備的通信

      在應(yīng)用程序到設(shè)備的通信過(guò)程時(shí),應(yīng)用程序使用藍(lán)牙去查找提供服務(wù)的設(shè)備,如果提供的服務(wù)范圍之內(nèi)發(fā)現(xiàn)一個(gè)可以連接的藍(lán)牙設(shè)備,那么該應(yīng)用程序可以發(fā)起連接請(qǐng)求。當(dāng)應(yīng)用程序和設(shè)備同時(shí)接受該連接,它們之間就可以進(jìn)行通信了,通信的過(guò)程也是使用socket的消息發(fā)送接收機(jī)制,類(lèi)似于應(yīng)用程序到應(yīng)用程序的通信。在Windows Phone 8中使用到應(yīng)用程序到設(shè)備的藍(lán)牙通訊技術(shù),需要在項(xiàng)目的WMAppManifest.xml文件中添加ID_CAP_PROXIMITY和ID_CAP_NETWORKING的功能選項(xiàng),表示支持臨近的設(shè)備通信能力和網(wǎng)絡(luò)通信能力,否則程序會(huì)出現(xiàn)異常。

      藍(lán)牙編程類(lèi)

      在Windows Phone 8里面使用到藍(lán)牙編程主要會(huì)用到PeerFinder類(lèi),PeerInformation類(lèi),StreamSocket類(lèi)和ConnectionRequestedEventArgs類(lèi),這些類(lèi)的說(shuō)明如表19.1所示。因?yàn)樗{(lán)牙也是基于TCP協(xié)議進(jìn)行消息傳遞了,所以需要用到Socket的相關(guān)的編程知識(shí),以及StreamSocket類(lèi)。PeerFinder類(lèi)是藍(lán)牙查找類(lèi),它的主要成員如表19.2所示。

      表19.1 藍(lán)牙編程類(lèi)的說(shuō)明

      類(lèi)名說(shuō)明
      PeerFinder用于去查找附近的設(shè)備是否有運(yùn)行和當(dāng)前應(yīng)用程序相同的應(yīng)用程序,并且可以在兩個(gè)應(yīng)用程序之間建立起socket連接,從而可以進(jìn)行通信。對(duì)等應(yīng)用程序是在其他設(shè)備上運(yùn)行的應(yīng)用程序的另一個(gè)實(shí)例。
      PeerInformation包含對(duì)等應(yīng)用程序或設(shè)備的識(shí)別信息。
      StreamSocket支持使用一個(gè)TCP的Socket流的網(wǎng)絡(luò)通信。
      ConnectionRequestedEventArgs表示傳遞到一個(gè)應(yīng)用程序的ConnectionRequested事件的屬性

      表 19.2 PeerFinder類(lèi)的成員

      成員說(shuō)明
      bool AllowBluetooth指定 PeerFinder 類(lèi)的此實(shí)例是否可以通過(guò)使用 Bluetooth 來(lái)連接 ProximityStreamSocket 對(duì)象。如果PeerFinder 的此實(shí)例可以通過(guò)使用 Bluetooth 來(lái)連接 ProximityStreamSocket 對(duì)象,則為 true;否則為false。默認(rèn)為 true。
      bool AllowInfrastructure是否使用TCP/IP協(xié)議連接到StreamSocket
      bool AllowWiFiDirect指定 PeerFinder 類(lèi)的此實(shí)例是否可以通過(guò)使用 Wi-Fi Direct 來(lái)連接 ProximityStreamSocket 對(duì)象。如果 PeerFinder 的此實(shí)例可以通過(guò)使用 Wi-Fi Direct 來(lái)連接 ProximityStreamSocket 對(duì)象,則為 true;否則為false。默認(rèn)為 true。
      IDictionary<string, string> AlternateIdentities獲取要與其他平臺(tái)上的對(duì)等應(yīng)用程序匹配的備用 AppId 值列表。返回要與其他平臺(tái)的對(duì)等類(lèi)應(yīng)用程序匹配的備用 AppId 值列表。
      string DisplayName獲取或設(shè)置標(biāo)識(shí)計(jì)算機(jī)到遠(yuǎn)程對(duì)等類(lèi)的名稱(chēng)。
      PeerDiscoveryTypes SupportedDiscoveryTypes獲取一個(gè)值,該值指示哪些發(fā)現(xiàn)選項(xiàng)可與 PeerFinder 類(lèi)一同使用
      event TypedEventHandler<object, ConnectionRequestedEventArgs> ConnectionRequested遠(yuǎn)程對(duì)等類(lèi)使用 ConnectAsync 方法請(qǐng)求連接時(shí)發(fā)生。
      event TypedEventHandler<object, TriggeredConnectionStateChangedEventArgs> TriggeredConnectionStateChanged在遠(yuǎn)程對(duì)等類(lèi)的輕擊筆勢(shì)期間發(fā)生。
      IAsyncOperation< StreamSocket> ConnectAsync(PeerInformation peerInformation)連接已發(fā)現(xiàn)了對(duì) FindAllPeersAsync 方法的調(diào)用的對(duì)等類(lèi)。peerInformation:表示連接到的對(duì)等類(lèi)的對(duì)等類(lèi)信息對(duì)象。返回通過(guò)使用所提供的臨近StreamSocket 對(duì)象連接遠(yuǎn)程對(duì)等類(lèi)的異步操作。
      IAsyncOperation<IReadOnlyList<PeerInformation>> FindAllPeersAsync()適用于無(wú)線范圍內(nèi)運(yùn)行相同應(yīng)用程序的對(duì)等計(jì)算機(jī)的異步瀏覽。返回通過(guò)使用 Wi-Fi直連技術(shù)瀏覽對(duì)等類(lèi)的異步操作。
      void Start(string peerMessage)向臨近設(shè)備上的對(duì)等類(lèi)應(yīng)用程序傳遞消息。
      void Stop()停止查找對(duì)等類(lèi)應(yīng)用程序或廣播對(duì)等類(lèi)連接的過(guò)程

      查找藍(lán)牙設(shè)備和對(duì)等項(xiàng)

      查找在服務(wù)范圍內(nèi)的藍(lán)牙設(shè)備和對(duì)等項(xiàng)是藍(lán)牙編程的第一步,查找藍(lán)牙設(shè)備和對(duì)等項(xiàng)中會(huì)使用到PeerFinder類(lèi)的FindAllPeersAsync方法去進(jìn)行查找,然后以異步的方式返回查找到的對(duì)等項(xiàng)列表的信息IReadOnlyList<PeerInformation>,注意要使查找對(duì)等的應(yīng)用程序時(shí),在調(diào)用FindAllPeersAsync方法前必須先調(diào)用PeerFinder類(lèi)的Start方法,主要的目的是啟動(dòng)廣播服務(wù),讓對(duì)方的應(yīng)用程序也能查找到自己。PeerInformation包含三個(gè)屬性:一個(gè)是DisplayName表示對(duì)等項(xiàng)的名字,這個(gè)名字一般都是由對(duì)方的設(shè)備的名稱(chēng)或者查找到的應(yīng)用程序自身設(shè)置的現(xiàn)實(shí)名字,一個(gè)是HostName表示主機(jī)名字或者IP地址,還有一個(gè)屬性是ServiceName表示服務(wù)名稱(chēng)或者TCP協(xié)議的端口號(hào)。然后可以利用查找到的PeerInformation信息進(jìn)行連接和通信。

      查找對(duì)等的應(yīng)用程序的代碼示例:

      async void AppToApp()
      {
          // 啟動(dòng)查找服務(wù)
          PeerFinder.Start();
          //開(kāi)始查找
          ObservableCollection<PeerInformation> peers = await PeerFinder.FindAllPeersAsync();
          if (peers.Count == 0)
          {
              //未找到任何的對(duì)等項(xiàng)
          }
          else
          {
              //處理查找到的對(duì)等項(xiàng),可以使用PeerFinder類(lèi)的ConnectAsync方法來(lái)連接選擇的要進(jìn)行通信的對(duì)等項(xiàng)
          }
      }

      查找藍(lán)牙設(shè)備的代碼示例:

      private async void AppToDevice()
      {
          // 設(shè)置查找所匹配的藍(lán)牙設(shè)備
          PeerFinder.AlternateIdentities["Bluetooth:Paired"] = "";
          // 開(kāi)始查找
          ObservableCollection<PeerInformation> pairedDevices = await PeerFinder.FindAllPeersAsync();
          if (pairedDevices.Count == 0)
          {
              // 沒(méi)有找到可用的藍(lán)牙設(shè)備
          }
          else
          {
              //處理查找到的藍(lán)牙設(shè)備,可以新建一個(gè)StreamSocket對(duì)象,然后使用StreamSocket類(lèi)的ConnectAsync方法通過(guò)HostName和ServiceName來(lái)連接藍(lán)牙設(shè)備
          }
      }

      藍(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所示。

      實(shí)例:實(shí)現(xiàn)藍(lán)牙程序?qū)υO(shè)備的連接

      下面給出藍(lán)牙程序?qū)υO(shè)備連接的示例:查找藍(lán)牙設(shè)備,并對(duì)找到的第一個(gè)藍(lán)牙設(shè)備進(jìn)行連接。
      代碼清單19-2:藍(lán)牙程序?qū)υO(shè)備連接(源代碼:第19章\Examples_19_2)

      MainPage.xaml文件主要代碼

              <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                   <StackPanel>
                      <Button x:Name="btFindBluetooth" Content="連接周?chē)乃{(lán)牙設(shè)備" Click="btFindBluetooth_Click"/>
                  </StackPanel>
              </Grid>

      MainPage.xaml.cs文件主要代碼

              // 查找藍(lán)牙設(shè)備事件處理
              private async void btFindBluetooth_Click(object sender, RoutedEventArgs e)
              {
                  try
                  {
                      // 配置PeerFinder藍(lán)牙服務(wù)的GUID去搜索設(shè)備
                      PeerFinder.AlternateIdentities["Bluetooth:SDP"] = "5bec6b8f-7eba-4452-bf59-1a510745e99d";
                      var peers = await PeerFinder.FindAllPeersAsync();
                      if (peers.Count == 0)
                      {
                          Debug.WriteLine("沒(méi)發(fā)現(xiàn)藍(lán)牙設(shè)備");
                      }
                      else
                      {
                          // 連接找到的第一個(gè)藍(lán)牙設(shè)備
                          PeerInformation selectedPeer = peers[0];
                          StreamSocket socket = new StreamSocket();
                          await socket.ConnectAsync(selectedPeer.HostName, selectedPeer.ServiceName);
                          MessageBox.Show("連接上了HostName:" + selectedPeer.HostName + "ServiceName:" + selectedPeer.ServiceName);
                      }
                  }
                  catch (Exception ex)
                  {
                      if ((uint)ex.HResult == 0x8007048F)
                      {
                          MessageBox.Show("Bluetooth is turned off");
                      }
                  }
              }

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

        相關(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ò)審核才能顯示)