当iOS应用程序以Xamarin为背景时,如何通知蓝牙连接?

时间:2017-08-10 15:43:13

标签: ios xamarin bluetooth core-bluetooth

我们需要我们的应用程序在连接或断开蓝牙音频设备(特别是他们的汽车中的设备)时从操作系统接收通知。

当BT设备最初连接时,应用会收到通知,但它会立即断开并记录错误:

  

BTCentralManager :: DisconnectedPeripheral> SoundCore mini(ATT)   ERROR错误域= CBErrorDomain代码= 7 “指定的设备已与我们断开连接。”

...并且“DisconnectedPeripheral”事件从未实际触发过。

我们不确定如何在应用程序背景化时简单地接收连接和断开事件。

我们是否需要将外围设备与中央管理器连接?我们只需知道音频设备是否已连接 - 我们无需以任何方式与其进行交互。

在获得断开连接外围设备后,事件永远不会从后台调用第二次。大概是因为我们收到的错误信息。

以下示例代码:

public class BTCentralManager : CBCentralManagerDelegate
{
    public CBCentralManager centralManager;
    public static CBPeripheral peripheral;

    public BTCentralManager()
    {
        System.Diagnostics.Debug.WriteLine("BTCentralManager::Constructor > ");

        centralManager = new CBCentralManager(this, new DispatchQueue("myqueue"),
            new CBCentralInitOptions { ShowPowerAlert = true, RestoreIdentifier = "myRestoreIdentifier" });

        NSUuid[] arr = { new NSUuid("7e9002be-547f-42bc-8d56-209736f70aa2") }; //Sound core mini          

        var devices = centralmanager.retrieveperipheralswithidentifiers(arr);
        peripheral = devices.firstordefault();

        //is the only way to trigger the events, we need to first connect the peripheral to central manager???
       centralManager.connectPeripheral(peripheral, new PeripheralConnectionOptions
       {
           NotifyOnConnection = true,
           NotifyOnDisconnection = true,
           NotifyOnNotification = true
       });

    }

    //Always is triggered inclusive in background
    public override void UpdatedState(CBCentralManager central)
    {
        System.Diagnostics.Debug.WriteLine("BTCentralManager::UpdatedState > " + central.State.ToString());
    }

    //Only is triggered when the device is first time connected  ( Inclusive in background)
    public override void ConnectedPeripheral(CBCentralManager central, CBPeripheral peripheral)
    {
        System.Diagnostics.Debug.WriteLine("BTCentralManager::ConnectedPeripheral > " + peripheral.Name);

        //After the connect made successfully I receive this error, and never connect again to the device
        //Error Domain=CBErrorDomain Code=7 "The specified device has disconnected from us."
    }

    public override void DisconnectedPeripheral(CBCentralManager central, CBPeripheral peripheral, NSError error)
    {
        System.Diagnostics.Debug.WriteLine("BTCentralManager::DisconnectedPeripheral > " + peripheral.Name + " ERROR>" + error.Description);
    }

    public override void DiscoveredPeripheral(CBCentralManager central, CBPeripheral peripheral, NSDictionary advertisementData, NSNumber RSSI)
    {
        System.Diagnostics.Debug.WriteLine("BTCentralManager::DiscoveredPeripheral > " + peripheral.Name);
        //   base.DiscoveredPeripheral(central, peripheral, advertisementData, RSSI);
    }
}

1 个答案:

答案 0 :(得分:0)

据我了解您的问题,您需要观察蓝牙音频设备的可用性。几年前我对此进行了一些调查,结果并不令我满意。这是我的结论:

1。)CoreBluetooth仅用于蓝牙4.0 /蓝牙低功耗设备。许多蓝牙耳机甚至汽车收音机仍然没有蓝牙4.x.因此,除非您可以依赖用户的蓝牙音频设备为4.x,否则CoreBluetooth可能会浪费时间。

2。)当您的应用处于后台时,您的应用不会收到有关正在连接的音频设备的通知。

到目前为止还不好。但是,可能有一些方法可能有所帮助。

1。)通过使用CLLocationManager,您可以开始观察例如指南针(不是节省电池的位置),以便在手机移动时收到通知。当应用程序调用CLLocationManagerDelegate时,只需检查连接的音频设备。这当然不是很有效,但它可能会有效。

2.)使用iBeacons和CLBeaconRegions(如果可用)。将iBeacon放在用户的车内并开始观察信标。

我知道,这不是你想听到的,但我担心你的问题没有直接的解决方案。

欢呼声, 彼得