user990967
user990967

Reputation: 444

RFCommConnectionTrigger in Windows Universal Apps To detect Incoming Bluetooth Connection

I am working on a Windows Universal App. I Want to get the Data from a Bluetooth Device to the Windows Phone. I am Using the Concept of RFCommCommunicationTrigger for this Purpose.

Here's the code Snippet I am Using

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

Here the Function of 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();
    }

Here's the code for SetCompletedOnce this will add a Handler only once

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

I have also Written the 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();

    }
    }

The Run Method is Invoked Every Time The Device tries to Open the Connection. The type of the Trigger that is obtained (the type I am debugging in the run method of the RFBackgroundTask.cs) is printed as

Windows.Devices.Bluetooth.Background.RfcommConnectionTriggerDetails

But I am Unable use that because I dont have this Class in the BackgroundLibrary project. The Documentation says that this Provides information about the Bluetooth device that caused this trigger to fire. It has Variables like Socket,RemoteDevice etc.

I think I am Missing something very simple Can you please help me out .

Upvotes: 1

Views: 1043

Answers (1)

Steve Zissou
Steve Zissou

Reputation: 11

Once your background task is launched, simply cast the TriggerDetails object to an RfcommConnectionTriggerDetails object:

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

     }
}

Upvotes: 1

Related Questions