2017-08-10 21 views
5

Chúng tôi cần ứng dụng của chúng tôi để nhận thông báo từ hệ điều hành khi kết nối hoặc ngắt kết nối khỏi thiết bị âm thanh bluetooth (cụ thể là thiết bị âm thanh trong xe của họ).Làm cách nào để được thông báo về kết nối bluetooth khi ứng dụng iOS được chạy trong Xamarin?

Ứng dụng được thông báo khi thiết bị BT ban đầu kết nối, nhưng sau đó có vẻ như ngay lập tức ngắt kết nối và bản ghi lỗi:

BTCentralManager::DisconnectedPeripheral > SoundCore mini(ATT) ERROR Error Domain=CBErrorDomain Code=7 "The specified device has disconnected from us."

... và "DisconnectedPeripheral" sự kiện không bao giờ thực sự bị sa thải.

Chúng tôi không chắc chắn cách đơn giản nhận kết nối và ngắt kết nối sự kiện trong khi ứng dụng được chạy nền.

Chúng ta có cần kết nối thiết bị ngoại vi với trình quản lý trung tâm không? Chúng tôi chỉ cần biết liệu thiết bị âm thanh có được kết nối hay không - chúng tôi không cần phải tương tác với thiết bị đó theo bất kỳ cách nào.

Sự kiện không bao giờ gọi lần thứ hai từ nền sau khi ngắt kết nối ngoại vi. Có lẽ vì thông báo lỗi chúng tôi đang nhận.

Mẫu mã bên dưới:

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

Trả lời

0

như xa như tôi hiểu câu hỏi của bạn, bạn cần phải quan sát sự sẵn có của một thiết bị âm thanh bluetooth. Tôi đã có một số điều tra trong này một vài thời gian trước đây và kết quả là không thực sự đáp ứng cho tôi. Đây là kết luận của tôi:

1.) CoreBluetooth chỉ được sử dụng cho các thiết bị Bluetooth 4.0/Bluetooth Low Energy. Nhiều tai nghe Bluetooth hoặc thậm chí cả radio trên xe vẫn không phải là bluetooth 4.x. Vì vậy, trừ khi bạn có thể dựa vào thiết bị âm thanh bluetooth của người dùng của bạn là 4.x, CoreBluetooth có thể lãng phí thời gian.

2.) Ứng dụng của bạn sẽ không được thông báo về thiết bị âm thanh đang được kết nối khi ứng dụng của bạn ở chế độ nền.

Cho đến nay không tốt. Tuy nhiên, có thể có một số cách tiếp cận có thể hữu ích.

1.) Bằng cách sử dụng CLLocationManager, bạn có thể bắt đầu quan sát ví dụ: la bàn (không phải là vị trí để tiết kiệm pin) để nhận thông báo bất cứ khi nào điện thoại đã được di chuyển. Chỉ cần kiểm tra các thiết bị âm thanh được kết nối khi ứng dụng đang gọi CLLocationManagerDelegate. Đây là khóa học không hiệu quả lắm, nhưng nó có thể hiệu quả.

2.) sử dụng iBeacons và CLBeaconRegions nếu có. Đặt iBeacon vào ô tô của người dùng và bắt đầu quan sát ngọn hải đăng.

Tôi biết, đây không phải là những gì bạn muốn nghe, nhưng tôi e rằng không có giải pháp chuyển tiếp thẳng nào cho vấn đề của bạn.

cổ vũ, Peter

Các vấn đề liên quan