
- 類型:硬件優(yōu)化測試大�。�13.9M語言:中文 評分:10.0
- 標(biāo)簽:
藍(lán)牙發(fā)送消息
藍(lán)牙編程的發(fā)送消息機(jī)制使用的是TCP的StreamSocket的方式,原理與Socket的一致。在藍(lán)牙連接成功后,可以獲取到一個StreamSocket類的對象,然后我們使用該對象的OutputStream屬性來初始化一個DataWriter對象,通過DataWriter對象來進(jìn)行發(fā)送消息。OutputStream屬性表示的是Socket的輸出流,用于發(fā)送消息給對方。下面來看一下發(fā)送消息的示例:
async void SendMessage(string message) { // 連接選中的對等項(xiàng),selectedPeer為查找到的PeerInformation對象 StreamSocket _socket= = await PeerFinder.ConnectAsync(selectedPeer); // 創(chuàng)建DataWriter DataWriter _dataWriter = new DataWriter(_socket.OutputStream); // 先寫入發(fā)送消息的長度 _dataWriter.WriteInt32(message.Length); await _dataWriter.StoreAsync(); // 最后寫入發(fā)送消息的內(nèi)容 _dataWriter.WriteString(message); await _dataWriter.StoreAsync(); }
藍(lán)牙接收消息
藍(lán)牙編程的接收消息機(jī)制同樣也是使用的是TCP的StreamSocket的方式,原理與Socket的一致。在藍(lán)牙連接成功后,可以獲取到一個StreamSocket類的對象,然后我們使用該對象的InputStream屬性來初始化一個DataReader對象,通過DataReader對象來進(jìn)行接收消息。InputStream屬性表示的是Socket的輸入流,用于接收對方的消息。下面來看一下接收消息的示例:
async Task<string> GetMessage() { // 連接選中的對等項(xiàng),selectedPeer為查找到的PeerInformation對象 StreamSocket _socket= = await PeerFinder.ConnectAsync(selectedPeer); // 創(chuàng)建DataReader DataReader _dataReader = new DataReader(_socket.InputStream); // 先讀取消息的長度 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ù)氖纠和ㄟ^使用藍(lán)牙功能查找周邊也要使用改應(yīng)用的手機(jī),互相建立起連接和發(fā)送測試消息。
代碼清單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="通過藍(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ù)流對象
private DataWriter _dataWriter; // 數(shù)據(jù)寫入對象
private DataReader _dataReader; // 數(shù)據(jù)讀取對象
public MainPage()
{
InitializeComponent();
Loaded += MainPage_Loaded;//頁面加載事件
}
// 查找藍(lán)牙對等項(xiàng)按鈕事件處理
private async void btFindBluetooth_Click(object sender, RoutedEventArgs e)
{
try
{
//開始查找對等項(xiàng)
PeerFinder.Start();
// 等待找到的對等項(xiàng)
var peers = await PeerFinder.FindAllPeersAsync();
if (peers.Count == 0)
{
MessageBox.Show("沒有發(fā)現(xiàn)對等的藍(lán)牙應(yīng)用");
}
else
{
// 把對等項(xiàng)目綁定到列表中
lbBluetoothApp.ItemsSource = peers;
}
}
catch(Exception ex)
{
if ((uint)ex.HResult == 0x8007048F)
{
MessageBox.Show("Bluetooth已關(guān)閉請打開手機(jī)的藍(lán)牙開關(guān)");
}
else
{
MessageBox.Show(ex.Message);
}
}
}
// 連接藍(lán)牙對等項(xiàng)的按鈕事件處理
private async void btConnect_Click(object sender, RoutedEventArgs e)
{
Button deleteButton = sender as Button;
PeerInformation selectedPeer = deleteButton.DataContext as PeerInformation;
// 連接到選擇的對等項(xiàng)
_socket = await PeerFinder.ConnectAsync(selectedPeer);
// 使用輸出輸入流建立數(shù)據(jù)讀寫對象
_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)
{
// 獲取消息內(nèi)容的大小
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("對方已關(guān)閉連接");
}
}
else
{
MessageBox.Show("對方已關(guān)閉連接");
}
}
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)
{
// 連接并且發(fā)送消息
ConnectToPeer(args.PeerInformation);
}
// 連接并發(fā)送消息給對方
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);//寫入消息的內(nèi)容
uint numBytesWritten = await _dataWriter.StoreAsync();
}
}
}
程序的運(yùn)行效果如圖19.2所示。
本文導(dǎo)航
- 第1頁: 首頁
- 第2頁: 藍(lán)牙發(fā)送接收信息
- 第3頁: 實(shí)現(xiàn)藍(lán)牙程序?qū)υO(shè)備的連接