7

कम ऊर्जा ब्लूटूथ स्पेक इस बारे में ज्यादा नहीं कहता है कि परिधीय एक समय में एक से अधिक केंद्रीय से कनेक्ट हो सकते हैं, लेकिन मेरा अनुभव परीक्षण मुझे बताता है कि वे नहीं कर सकते हैं।आईओएस कोरब्लूटूथ सेंट्रल मैनेजर के लिए लगातार स्कैनिंग?

क्योंकि मेरे आवेदन के लिए परिधीय (यानी कोई कनेक्शन नहीं है, जो दूसरों को अवरुद्ध करेगा) के साथ एक गैर-स्वामित्व वाले संबंध की आवश्यकता है, और अपने आरएसएसआई मूल्यों को लगातार अद्यतन करने की आवश्यकता है, मैं परिधीय के लिए लगातार स्कैन करने और अपने आरएसएसआई मूल्यों को पकड़ने का एक तरीका तलाश रहा हूं ।

स्कैनफोरपीरफेरल्सविथ सर्विसेज विधि एक निश्चित अंतराल के लिए स्कैन करने के लिए प्रतीत होता है और फिर बंद हो जाता है। मेरा मानना ​​है कि मेरी सबसे अच्छी शर्त एक समय में 3 सेकंड स्कैन करना है, रोकें, प्रतीक्षा करें (कई सेकंड) और फिर स्कैन को फिर से शुरू करें। दोहराएँ।

क्या कोई इसे करने का बेहतर तरीका बता सकता है? उदाहरण के लिए, एक से अधिक केंद्रीय से कनेक्ट करने के लिए परिधीय विन्यास?

उत्तर

7

एक परिधीय एक से अधिक केंद्रीय से कनेक्ट नहीं हो सकता है। लेकिन अगर आपको केवल आरएसएसआई पर कब्जा करने की ज़रूरत है तो आपको कनेक्टिंग की भी आवश्यकता नहीं है। डिवाइस के लिए स्कैन इस समारोह का उपयोग कर RSSI प्राप्त कर सकते हैं:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI 
+2

हाँ, पर मैं लगातार एक अद्यतन RSSI प्राप्त करने की आवश्यकता। मेरे निष्कर्ष यह हैं कि एक बार सेंट्रल मैनेजर ने एक बार परिधीय खोज की है और फिर से खोज की है, तो यह स्कैन जारी होने पर भी इसे खोजना बंद कर देता है (लगभग 3 सेकंड लगता है)। जो मुझे छोड़ा गया है उसे अद्यतन आरएसएसआई मान प्राप्त करने के लिए बार-बार स्कैन को दोबारा शुरू करने की आवश्यकता है। – Jonathan

+3

हाँ, आप didDiscoverPeripheral फ़ंक्शन के अंदर स्कैन को फिर से शुरू कर सकते हैं, और इसके द्वारा आप आरएसएसआई को हमेशा के लिए जल्दी से प्राप्त करेंगे। – Aboelseoud

+1

धन्यवाद। यह काम करता है। शक्ति को बचाने के लिए मैं वास्तव में 100ms के बाद स्कैन रोकता हूं और फिर हर सेकेंड या तो 100ms विस्फोट करता हूं। बहुत अच्छा काम करता है। – Jonathan

5

पिछले जवाब के लिए के रूप में, यदि आप केवल RSSI में रुचि रखते हैं आप, प्रतिनिधि के विधि में प्राप्त कर सकते हैं: Btw

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI 

, डिफ़ॉल्ट रूप से CBCentralManager केवल एक बार इस विधि को कॉल करेगा। खबरदार है कि एप्पल के लिए इस विकल्प का उपयोग नहीं तो अत्यंत आवश्यक होता हतोत्साहित

NSDictionary *scanningOptions = @{CBCentralManagerScanOptionAllowDuplicatesKey: @YES}; 
[centralManager scanForPeripheralsWithServices:nil options:scanningOptions]; 

: यदि आप इस कॉलबैक की जरूरत है हर बार CBCentralManager एक विज्ञापन पैकेट प्राप्त करता है के नाम से जाना आप विकल्प CBCentralManagerScanOptionAllowDuplicatesKey सेट YES के साथ स्कैन आरंभ करने की जरूरत ।

देखें: iOS Developer Library -Best Practices for Interacting with a Remote Peripheral Device

1

मैं मूल रूप से सिर्फ स्कैनिंग हर बार एक विज्ञापन संसाधित किया जाता है को पुन: प्रारंभ इस कोड के साथ इस प्रकार की समस्या का हल,। मुझे उसी मुद्दे का सामना करना पड़ रहा था जहां सीबीसीएन्ट्रल मैनेजर इंस्टेंस परिधीय को सुनना बंद कर देगा।

(। CBCentralManagerScanOptionAllowDuplicatesKey@YES करने के लिए सेटिंग पूरी तरह से मेरे लिए इस मुद्दे को हल नहीं किया है) वर्ग मानते हुए लागू करता CBCentralManagerDelegate:

- (id) init { 
    self.central = [[CBCentralManager alloc]initWithDelegate:self queue:nil]; 
    [self initScan]; 
} 

- (void) initScan { 
    [self.central stopScan]; 
    [self.central scanForPeripheralsWithServices:nil 
             options:[NSDictionary dictionaryWithObjectsAndKeys:@NO, CBCentralManagerScanOptionAllowDuplicatesKey, nil]]; 
} 

- (void) centralManager:(CBCentralManager*)central didDiscoverPeripheral:(CBPeripheral*)peripheral advertisementData:(NSDictionary*)advertisementData RSSI:(NSNumber*)RSSI { 

    // 
    // Do stuff here 
    // 

    [self initScan]; 
} 
संबंधित मुद्दे