Bluetooth Windows通用应用程序中的RFCommConnectionTrigger,用于检测传入的蓝牙连接

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

我正在开发一个Windows通用应用程序。我想从蓝牙设备向Windows Phone获取数据。为此,我使用了RFCommCommunicationContriger的概念

下面是我正在使用的代码片段

   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();

     }
}