2017-07-21 82 views
5

Benim hedef-c başvurumun sonlandırılmış bir durumdan uygulamayı uyandırmak için sonlandırıldıktan sonra hemen iBeacon kullanması gereken bir kullanım durumum var. , BLE'ye bağlanın ve cihaza bir komut gönderin. Gerekirse kodumu kontrol edebileceğiniz daha uzun bir post found here çalıştırıyorum.OBJ-C Nasıl Yapılır: Aynı cihazda BLE bağlantısı ve iBeacon kullanarak uygulama

Sorun şu ana kadar

sorun, ben uygulamayı çalıştırdığınızda, önceden eşleştirilmiş cihazlar için arama ve/veya çevre birimleri için tarama, benim BLE cihaz bulmak ve bağlanmak olmuyor. Bir kez bağlandığında, kullanıcı BLE bağlantısını çiftleştirerek, BLE bağlantısı üzerinden şifrelenmiş karakteristik veri gönderebilsinler. Eşleştirme olmadan (aygıtın adlandırma kurallarında auth/bond olarak adlandırılır), kullanıcı verileri aygıta gönderemez. Asla orada yapmaz. En kısa zamanda ... komutunu gönderebilir eşleştirmek

Ben

- (void)applicationWillTerminate:(UIApplication *)application { 
    NSLog(@"*** Application Will Terminate."); 

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    NSNumber *mode = [userDefaults objectForKey:@"deviceConnectedMode"]; 

    if([mode intValue] == CONNECTED_MODE_INDICATOR) { 
     [self.bluetoothManager sendCodeToBTDevice:@"magiccommand1" 
            characteristic:self.bluetoothManager.wipeCharacteristic]; 

//I have been turning this command on and off in testing to see if I can get it to work better while disconnecting in the device rather than in the app... 
//The command magiccommand2 wipes the auth/bond inside of the device   
//  [self.bluetoothManager sendCodeToBTDevice:@"magiccommand2" 
//         characteristic:self.bluetoothManager.disconnectCharacteristic]; 

     //Place where I attempt to stop being connected to BT 
     [self.bluetoothManager disconnectDevice]; 
     [self.beaconManager startMonitoring]; 

     NSLog(@"*** Application terminated from connected mode!"); 

    } else { 
     NSLog(@"*** DriveCare terminated without violation!"); 
    } 
} 

ben başarmaya çalışıyorum ne ... applicationWillTerminate yönteminde, bu kod üzerinden çalıştırmak, uygulamayı sonlandırmak zaman olduğu gibi

magiccommand1 ve magiccommand2 komutları cihazın seri bağlantı noktası üzerinden dinliyor ki (şimdilik 128 bitlik jetonları sonrası) sadece aptalca testi dizelerdir. Komutları aldıklarında, cihazdaki auth/bond'u silmeye ve cihazda BLE'den ayrılmaya çalışarak tepki verirler.

Bu yüzden uygulamanın sonlandırılmış bir durumdan uyanmasını sağlayabildiğim tek yol iBeacon'dur. Bu yüzden bir kare delikte bu yuvarlak peg almak için burada bir sürü kirli şeyler yapmak zorundayım. Uygulamanın yaşam döngüsünde bağlanır ve eşleşir ve sonlandırdığımda BLE'den bağlı bir aygıt olarak tamamen kaldırılmasını istiyorum. Umarız, iBeacon uygulamayı uyandırır, BLE'ye geri bağlanır, iBeacon izlemesini kapatır ve BLE aygıtına sonlandırılmış bir durumdan bir komut gönderir. Bu, iBeacon'dan BLE'ye ve arkaya açıldığında/kapatıldığında veya bağlantıyı keserken/çıkarırken kullanıcının büyük olasılıkla yeniden eşleşmesine neden olur ve ben bunu istemiyorum.

Daha Sorunları

ben [self.centralManager cancelPeripheralConnection:self.thePeripheral]; diyoruz iOS sistem düzeyinde BT yöneticisi oto görünüyor neredeyse anında yeniden (çünkü eşleştirme ait) bu yüzden bağlantı kopmuş olması ve iBeacon alınmayı zaman yoktur tekrar yukarı. Bağlantı kesme komutunu benim kutuya göndermeden önce centralManager örneğimden bağlantıyı kesmeye çalışırsam (kodda göründüğü gibi), açıkça gönderilmeyeceklerdir. Yalnızca bu CBCentralManager bağlantı kesme yöntemini kullanırsam, iOS sistemi hala aygıtla eşleştirildiği için iBeacon'un algılanmaya başlaması yeterli değildir. Son olarak, daha sonra iOS sistem BT yöneticime gidip "Bu cihazı unut" u seçersem, iBeacon tekrar alır ve didEnterRegion yöntem yangınlarım olur!

Bu iBeacon ve BLE arasında bir çok ileri ve geri ve ben sadece uygulamayı uyandırmak için iBeacon'a bile ihtiyaç duymadım. Ben tüm info.plist arka plan BLE ve iBeacon hizmetleri açık. BLE'ye hiç bağlanmadım ve hiçbir zaman bir kez eşleşmiyor ve cihazımı bağlamazsam, yerel uygulama bildirimleri, iBeacon didEnterRegion ve didExitRegion yöntemlerinin sorunsuz bir şekilde tetiklendiğini bildiren bir sorun olmadan kayıyor.

Burada yanlış olan ne yapıyorum?

cevap

1

Bu cevabı çözdüm! Doğru yoldaydım ... iBeacon delegesi yöntemlerini ateşlemeye çalışmak için BT eşleştirmeyi denemek ve bağlantısını kesmek harika bir fikir değil. Bu çok garip kirli kodlara, sıkışık olmamaları gereken şeylere ve daha da kötüye gitmesine neden oluyor ... ... korkulu spagetti kodu. Bunun yerine benim çözümümde 2 Bluetooth yonga içeren bir kart inşa etmekti. Biri adanmış bir iBeacon yongası ve diğeri ise kalıcı bağlı/eşleştirilmiş/auth ve bağlı yonga olarak. Bu şekilde, izlenmesi gereken herhangi bir zamanlanmış bağlantı ve kopma olayları (veya daha kötü ... çözülmüş yarış koşulları) olması gerekmemektedir. Bir cihazın iOS'ta bağlantısının kesilmesini beklemek doğru bir bağlantı kesme değildir, bunun yerine iOS sistemi bağlantısının kesildiğini düşünür (telefonun bazılarında). Periferik sistem içinde devam eden şeyler çok farklı bir resim çiziyor ...

Bu 2 çip yaklaşımı, geliştirme tarafında hayatı çok daha kolay hale getirdi, çünkü artık bir şeyle başa çıkmak için uygulamayı kullanmaya ihtiyacınız var. iBeacon cihazını güç döngüsü ve uygun olayı alın.

Yan not: neredeyse anında didEnterRegion yöntem yangınları iBeacon kullanarak didExitRegion ateş bazen 30 veya daha fazla saniye sürebilir olarak. Bu nedenle, anında işaret algılama çözünürlüğüne ihtiyacınız varsa, iBeacon'un açık olduğundan emin olun ve mümkün değilse bile.