Windows Universal Apps中的RFCommConnectionTrigger用于检测传入的蓝牙连接

时间:2014-06-03 17:34:01

标签: bluetooth rfcomm win-universal-app

我正在使用Windows通用应用程序。我想将数据从蓝牙设备获取到Windows Phone。我正在使用RFCommCommunicationTrigger的概念来达到此目的。

这是我正在使用的代码片段

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

这里是RegisterTaskOnce的功能

       static private IBackgroundTaskRegistration RegisterTaskOnce(string taskName, string    entryPoint, IBackgroundTrigger trigger, params IBackgroundCondition[] conditions)
    {

        // Validate
        if (string.IsNullOrEmpty(taskName)) throw new ArgumentException("taskName");
        if (string.IsNullOrEmpty(entryPoint)) throw new ArgumentException("entryPoint");
        if (trigger == null) throw new ArgumentNullException("trigger");

        // Look to see if the name is already registered
        var existingReg = (from reg in BackgroundTaskRegistration.AllTasks
                           where reg.Value.Name == taskName
                           select reg.Value).FirstOrDefault();
        Debug.WriteLine("Background task "+ taskName+" is already running in the Background");
        // If already registered, just return the existing registration
        if (existingReg != null)
        {
            return existingReg;
        }

        // Create the builder
        var builder = new BackgroundTaskBuilder();
        builder.TaskEntryPoint = entryPoint;
        builder.Name = taskName;
        builder.SetTrigger(trigger);

        // Conditions?
        if (conditions != null)
        {
            foreach (var condition in conditions)
            {
                builder.AddCondition(condition);
            }
        }


        // Register
        return builder.Register();
    }

这里是SetCompletedOnce的代码,这只会添加一个Handler一次

     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等变量。

我想我错过了一些非常简单的事情 你能帮帮我吗?

1 个答案:

答案 0 :(得分:1)

启动后台任务后,只需将TriggerDetails对象强制转换为RfcommConnectionTriggerDetails对象:

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

     }
}