蓝牙发送消息
蓝牙编程的发送消息机制使用的是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所示。
本文导航
- 第1页: 首页
- 第2页: 蓝牙发送接收信息
- 第3页: 实现蓝牙程序对设备的连接