Bluetooth Windows通用应用程序中的RFCommConnectionTrigger,用于检测传入的蓝牙连接
我正在开发一个Windows通用应用程序。我想从蓝牙设备向Windows Phone获取数据。为此,我使用了RFCommCommunicationContriger的概念 下面是我正在使用的代码片段Bluetooth Windows通用应用程序中的RFCommConnectionTrigger,用于检测传入的蓝牙连接,bluetooth,rfcomm,win-universal-app,Bluetooth,Rfcomm,Win Universal App,我正在开发一个Windows通用应用程序。我想从蓝牙设备向Windows Phone获取数据。为此,我使用了RFCommCommunicationContriger的概念 下面是我正在使用的代码片段 var rfTrigger = new RfcommConnectionTrigger(); // Specify what the service ID is rfTrigger.InboundConnection.LocalServiceId
var rfTrigger = new RfcommConnectionTrigger();
// Specify what the service ID is
rfTrigger.InboundConnection.LocalServiceId = RfcommServiceId.FromUuid(new Guid("<some_base_guid>"));
//Register RFComm trigger
var rfReg = RegisterTaskOnce(
"HWRFCommTrigger",
"BackgroundLibrary.RFBackgroundTask",
rfTrigger, null
);
SetCompletedOnce(rfReg, OnTaskCompleted);
下面是SetCompletedOnce的代码,它将只添加一次处理程序
static private void SetCompletedOnce(IBackgroundTaskRegistration reg, BackgroundTaskCompletedEventHandler handler)
{
// Validate
if (reg == null) throw new ArgumentNullException("reg");
if (handler == null) throw new ArgumentNullException("handler");
// Unsubscribe in case already subscribed
reg.Completed -= handler;
// Subscribe
reg.Completed += handler;
}
我还编写了BackgroundLibrary.RFBackgroundTask.cs
public sealed class RFBackgroundTask : IBackgroundTask
{
public async void Run(IBackgroundTaskInstance taskInstance)
{
BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
try
{
Debug.WriteLine(taskInstance.TriggerDetails.GetType());
taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled);
Debug.WriteLine("RFComm Task Running");
Debug.WriteLine(taskInstance.TriggerDetails.GetType().ToString());
}
catch (System.Exception e)
{
Debug.WriteLine("RFComm Task Error: {0}", e.Message);
}
deferral.Complete();
}
}
每次设备尝试打开连接时都会调用Run方法。
获取的触发器类型(在RFBackgroundTask.cs的run方法中调试的类型)打印为
Windows.Devices.Bluetooth.Background.RfcommConnectionTriggerDetails
但是我不能使用它,因为我在BackgroundLibrary项目中没有这个类。
文档中说,这提供了导致触发此触发器的蓝牙设备的相关信息。
它有Socket、RemoteDevice等变量
我想我遗漏了一些非常简单的东西
您能帮我一下吗。启动后台任务后,只需将TriggerDetails对象强制转换为RFCommConnectionTiggerDetails对象:
public sealed class RFBackgroundTask : IBackgroundTask
{
public async void Run(IBackgroundTaskInstance taskInstance)
{
BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
try
{
taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled);
RfcommConnectionTriggerDetails details = (RfcommConnectionTriggerDetails)taskInstance.TriggerDetails;
StreamSocket = details.Socket; // Rfcomm Socket
// Access other properties...
}
catch (System.Exception e)
{
Debug.WriteLine("RFComm Task Error: {0}", e.Message);
}
deferral.Complete();
}
}
public sealed class RFBackgroundTask : IBackgroundTask
{
public async void Run(IBackgroundTaskInstance taskInstance)
{
BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
try
{
taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled);
RfcommConnectionTriggerDetails details = (RfcommConnectionTriggerDetails)taskInstance.TriggerDetails;
StreamSocket = details.Socket; // Rfcomm Socket
// Access other properties...
}
catch (System.Exception e)
{
Debug.WriteLine("RFComm Task Error: {0}", e.Message);
}
deferral.Complete();
}
}