2012-03-28 6 views
13

मैंने अभी आईओएस के लिए कोर ब्लूटूथ फ्रेमवर्क के साथ शुरुआत की है और मैं एक ऐप विकसित कर रहा हूं जिसे लगातार बीएलई उपकरणों के लिए स्कैन करने की आवश्यकता है ताकि मैं हर मिनट अपने आरएसएसआई नंबर को पुनः प्राप्त कर सकूं या इसलिए।कोर ब्लूटूथ - इन-रेंज उपकरणों के निरंतर आरएसएसआई अपडेट

वर्तमान में मेरे पास है:

manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; 
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:FALSE], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 
[manager scanForPeripheralsWithServices:nil options:options]; 

इस BLE उपकरणों के लिए मेरे एप्लिकेशन स्कैनिंग शुरू होता है और इस प्रतिनिधि विधि है जब कोई उपकरण की खोज की है कॉल:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { 
    NSLog(@"Did discover peripheral. peripheral: %@ rssi: %@, UUID: %@ advertisementData: %@ ", peripheral, RSSI, peripheral.UUID, advertisementData); 
    //Do something when a peripheral is discovered. 

    rssiLabel.text = [RSSI stringValue]; 

    [manager retrievePeripherals:[NSArray arrayWithObject:(id)peripheral.UUID]];} 

इस विधि मुझे परिधीय के RSSI नंबर प्राप्त करता है जो मैं प्रदर्शित कर सकता हूँ

- (void) centralManager:(CBCentralManager *)central didRetrievePeripherals:(NSArray *)peripherals { 

    NSLog(@"Currently known peripherals :"); 
    int i = 0; 
    for(CBPeripheral *peripheral in peripherals) { 
     NSLog(@"[%d] - peripheral : %@ with UUID : %@",i,peripheral,peripheral.UUID); 

    } 

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:FALSE], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 
    [manager scanForPeripheralsWithServices:nil options:options]; 

} 

इस कोड को काम करने और एक स्कैन मोटे तौर पर हर 1 मिनट कर किया जा रहा है, लेकिन मैं वास्तव में नहीं जानता कि क्यों यह काम कर रहा ...

प्रलेखन: अंतिम पंक्ति तो यह प्रतिनिधि प्रणाली को बुलाती है कोर ब्लूटूथ पर बहुत स्पैस है इसलिए अगर किसी को यह कैसे करना है, इस बारे में कोई विचार है, या जो करने की कोशिश कर रहा हूं, उसे करने का बेहतर तरीका है, तो मैं मदद की सराहना करता हूं!

+0

काम करने ... RSSI कितनी बार अद्यतन किया जाता है लगता है? संपादित करें: एक बार एक मिनट?मुझे लगता है कि जब आप कनेक्ट नहीं होते हैं तो एक समय बाहर होता है, ताकि यह स्कैन फिर से शुरू हो जाए। – chwi

+0

मैंने अभी खुद को प्रलेखन पढ़ना शुरू कर दिया है, इसलिए आप I से आगे हैं। प्रश्न, आप स्कैनफोरफेरफेल्स को क्यों कॉल कर रहे हैं प्रतिनिधि पद्धति में रीट्रीव पेरिफेरल्स? CBCentralManager आवंटित होने के बाद आप इसे पहले ही कॉल करते हैं। यह आपके द्वारा वर्णित दोहराव वाले स्कैन का कारण बन सकता है। – mkr707

+0

सिर्फ मेरे दो सेंट> = 7.0 के लिए: पुनर्प्राप्ति PeripheralsWithIdentifiers अब से उपयोग करने की आवश्यकता है। –

उत्तर

20

क्या आपने YES को स्कैन विकल्प बदलने का प्रयास किया है?

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 
[manager scanForPeripheralsWithServices:nil options:options]; 

आप ऐसा करते हैं तो आप हर विज्ञापन पैकेट कि आपके iPhone द्वारा देखा जाता है, जो आम तौर पर के बारे में हर 100ms होगा (हालांकि मैं इस कॉलबैक समय उसी के लिए एक बहुत परिवर्तन देख के साथ अपने "didDiscoverPeripheral" कॉलबैक मिल जाएगा डिवाइस)। इसमें प्रत्येक डिवाइस के आरएसएसआई शामिल हैं जो इसे देखता है।

यह आपके ~ 1 मिनट की अद्यतन दर से बहुत तेज़ होना चाहिए।

@Anders समाधान के
+1

उन दो लाइनों के लिए स्विफ्ट समतुल्य क्या है? – Gerard

+0

@ गेरार्ड: नीचे मेरा जवाब देखें। – kbpontius

+1

स्विफ्ट 3: 'manager.scanForPeripherals (सेवा के साथ: [सेंसरटाग विज्ञापन विज्ञापन], विकल्प: [सीबीसीएन्ट्रल मैनेजरस्कैनऑप्शनअलोव डुप्लिकेट्सके: एनएसएनंबर (मूल्य: सत्य)])' – nablahero

3

जहाँ तक मैं देख सकता हूं, यह वही करना चाहिए जो आप चाहते हैं।

जब आपने मूल कॉल के साथ परिधीय के लिए स्कैनिंग शुरू की, तो जब भी कोई बीएलई डिवाइस खोजा जाता है तो आपके प्रतिनिधि को कॉल प्राप्त करना शुरू कर देना चाहिए। didRetrievePeripherals विधि के बाद से, स्कैनिंग नहीं करता है, के रूप में तक मुझे पता है: यह जब तक आप

[manager stopScan]; 

के लिए एक कॉल के साथ स्कैन रोक मुझे नहीं लगता कि आप वास्तव में अपने centralManager में scanForPeripheralsWithServices को दूसरी कॉल की आवश्यकता है के लिए जारी रहेगा जब तक आप इसे नहीं बताते तब तक रुकें। मैं अभी भी इस पर शुरू कर रहा हूं, हालांकि, और ऐसा समय भी हो सकता है जो मुझे नहीं मिला है।

मुझे यकीन है कि आपको एक मिनट में एक बार कॉल करने का कारण यह है क्योंकि बीएलई डिवाइस केवल विज्ञापन ही होता है। यदि यह खोज मोड में डिवाइस की तरह अधिक बार विज्ञापन करता है, तो मुझे लगता है कि आपको कॉल अधिक बार मिलेंगे। यदि आप इसकी पुष्टि कर सकते हैं तो मैं दिलचस्प होगा। यदि डिवाइस में डिस्कवरी मोड है, तो आप यह देखने के लिए ट्रिगर कर सकते हैं कि नोटिस तेज हो गया है या नहीं।

2

आपको लगातार स्कैनिंग नहीं करना चाहिए क्योंकि यह शक्ति के लिए बहुत महंगा है। एक बार जब आप डिवाइसों की खोज कर लेंगे तो आपके पास सीबीपीरफेरल ऑब्जेक्ट्स की एक सरणी आपके पास लौट आएगी। सीबीपीरिफेरल पर आप आरएसएसआई पढ़ सकते हैं और आरएसएसआई बदलते समय कॉलबैक प्राप्त कर सकते हैं। निम्नलिखित दस्तावेज देखें: http://developer.apple.com/library/mac/#documentation/CoreBluetooth/Reference/CBPeripheralDelegate_Protocol/translated_content/CBPeripheralDelegate.html

+0

क्या '- [readRSSI]' परिधीय कनेक्ट होने की आवश्यकता है? –

+2

@ बेनमोशेर हाँ यह करता है। – luxcem

1

स्विफ्ट कार्यान्वयन:

manager.scanForPeripheralsWithServices(nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey : NSNumber(bool: true)])