2013-10-23 6 views
10

भेजने मैं एक समस्या आ रही है, जहां वास्तव में शारीरिक रूप से ब्लूटूथ पैकेट भेजनेकोर ब्लूटूथ जब पैकेट

[peripheral writeValue:dataPacket forCharacteristic:writeChar type:CBCharacteristicWithResponse] 

और iOS डिवाइस का उपयोग एक विशेषता के लिए एक मूल्य के लेखन के बीच का समय उत्तरोत्तर समय ले रहा है धीमा और लंबे समय तक।

यह डीबगर से निम्नलिखित उत्पादन में समझा जा सकता है:

2013-10-23 14:12:17.510 Test App iOS[1561:60b] Packet sent 
2013-10-23 14:12:17.595 Test App iOS[1561:60b] Packet sent confirmation, error = (null) 
2013-10-23 14:12:17.598 Test App iOS[1561:60b] Packet response received 

2013-10-23 14:12:17.611 Test App iOS[1561:60b] Packet sent 
2013-10-23 14:12:17.656 Test App iOS[1561:60b] Packet sent confirmation, error = (null) 
2013-10-23 14:12:17.657 Test App iOS[1561:60b] Packet response received 

2013-10-23 14:12:22.601 Test App iOS[1561:60b] Packet sent 
2013-10-23 14:12:23.123 Test App iOS[1561:60b] Packet sent confirmation, error = (null) 
2013-10-23 14:12:23.125 Test App iOS[1561:60b] Packet response received 

2013-10-23 14:12:27.601 Test App iOS[1561:60b] Packet sent 
2013-10-23 14:12:28.111 Test App iOS[1561:60b] Packet sent confirmation, error = (null) 
2013-10-23 14:12:28.113 Test App iOS[1561:60b] Packet response received 

2013-10-23 14:12:32.611 Test App iOS[1561:60b] Packet sent 
2013-10-23 14:12:34.595 Test App iOS[1561:60b] Packet sent confirmation, error = (null) 
2013-10-23 14:12:34.597 Test App iOS[1561:60b] Packet response received 


2013-10-23 14:12:37.611 Test App iOS[1561:60b] Packet sent 
2013-10-23 14:12:39.582 Test App iOS[1561:60b] Packet sent confirmation, error = (null) 
2013-10-23 14:12:39.585 Test App iOS[1561:60b] Packet response received 

2013-10-23 14:12:42.611 Test App iOS[1561:60b] Packet sent 
2013-10-23 14:12:44.570 Test App iOS[1561:60b] Packet sent confirmation, error = (null) 
2013-10-23 14:12:44.573 Test App iOS[1561:60b] Packet response received 

2013-10-23 14:12:47.611 Test App iOS[1561:60b] Packet sent 
2013-10-23 14:12:49.558 Test App iOS[1561:60b] Packet sent confirmation, error = (null) 
2013-10-23 14:12:49.560 Test App iOS[1561:60b] Packet response received 

// Several packets omitted... 

2013-10-23 14:13:07.610 Test App iOS[1561:60b] Packet sent 
2013-10-23 14:13:09.508 Test App iOS[1561:60b] Packet sent confirmation, error = (null) 
2013-10-23 14:13:09.511 Test App iOS[1561:60b] Packet response received 

2013-10-23 14:13:12.610 Test App iOS[1561:60b] Packet sent 
2013-10-23 14:13:14.496 Test App iOS[1561:60b] Packet sent confirmation, error = (null) 
2013-10-23 14:13:14.498 Test App iOS[1561:60b] Packet response received 

// और इसी तरह ...

पैकेट भेजे गए संदेश को तुरंत writeValue आदेश के बाद लाइन पर उत्पादन होता है विशेषता के लिए डेटा के पैकेट लिखें।

पैकेट भेजा गया पुष्टिकरण didWriteValueForCharacteristic प्रतिनिधि विधि में पहली पंक्ति में आउटपुट है।

पैकेट प्रतिक्रिया प्राप्त संदेश किया गया थाडेटेड वैल्यू फॉर कैरेक्टीरिस्टिक में जिसे बीटीएलई डिवाइस मेरे भेजे गए पैकेट की प्राप्ति की पुष्टि करने के लिए प्रतिक्रिया पैकेट (द्वितीयक अधिसूचना विशेषता के माध्यम से) भेजता है।

जैसा कि शुरुआत में मेरे कॉलिंग के बीच लिखने के लिए समय देखा जा सकता है। वैल्यू फॉर कैरेक्टीस्टिक पद्धति और पैकेट की पुष्टि करने के लिए कॉलबैक को भेजा गया है, WRiteValueForCharacteristic प्रारंभ में 85ms (जो पहले से धीमा लेकिन सहनशील है) है। मैं इन पैकेट को लगभग हर 5 सेकंड भेजता हूं, और केवल कुछ ही पैकेट भेजे जाने के बाद यह ~ 2 सेकंड तक बढ़ जाता है जिसके बाद लगातार 2 सेकेंड में स्थैतिक लगता है। पैकेट की पुष्टि के बाद बीटीएलई डिवाइस से वापस भेजा गया प्रतिक्रिया पैकेट हमेशा ~ 2ms होता है।

मुझे समझ में नहीं आ रहा है कि मुझे कोरब्लूटूथ पुस्तकालयों में कॉलिंग लिखने के बीच क्यों देरी हो रही है और पुल कॉलबैक किया गया है WriteValueForCharacteristic।

अन्य सभी मामलों में कोड पूरी तरह से काम कर रहा है (बीटीएलई डिवाइस वही कर रहा है जो इसे करने का निर्देश दिया जा रहा है और कोई भी पैकेट गायब नहीं है)।

मेरे पास एक नमूना ऐप है जो बीटी 4.0 मॉड्यूल निर्माता (स्रोत समेत) द्वारा प्रदान किया जाता है जो इस बढ़ती देरी का अनुभव नहीं करता है - दुर्भाग्यवश नमूना ऐप मॉड्यूल के कार्यान्वयन की एक बड़ी श्रृंखला का सामना करने के लिए डिज़ाइन किया गया है, न कि केवल हमारे विशिष्ट कार्यान्वयन और इसलिए बड़े पैमाने पर जटिल है जिसमें हमारे कार्यान्वयन के लिए प्रासंगिक नहीं है - मैंने नमूना में प्रत्येक फ़ंक्शन में ब्रेकपॉइंट्स रखे हैं और मैन्युअल रूप से निर्धारित किए हैं कि वे कौन से आदेश जारी कर रहे हैं, और मुझे विश्वास है कि मैं हूं उन्हें पूरी तरह से कॉपी (लेकिन स्पष्ट रूप से नहीं)।

मैं कुछ भी नहीं देख सकता कि वे ऐसा कर रहे हैं जो मैं नहीं कर रहा हूं और इसके विपरीत। दो परियोजनाओं के बीच एकमात्र अंतर मैं देख सकता हूं कि मेरा एआरसी का उपयोग करता है और उनका मैनुअल संदर्भ गिनती का उपयोग करता है।

अन्य जानकारी: सब कुछ मुख्य थ्रेड पर चल रहा है (के रूप में यह मॉड्यूल निर्माता नमूना अनुप्रयोग के साथ है) मैं मुख्य कतार (इसी तरह मॉड्यूल निर्माता में नमूना एप्लिकेशन) iOS पर सीपीयू लोड का उपयोग कर सेंट्रल प्रबंधक बनाने डिवाइस केवल 3% पर है जबकि मेरा ऐप चल रहा है और सीपीयू लोड इत्यादि के कारण कुछ भी देरी नहीं हो रही है।

मैं इस के साथ अपने बालों को फाड़ रहा हूं, और यदि कोई इस समस्या के लिए किसी संभावित कारण या समाधान का सुझाव दे सकता है मैं हमेशा से आभारी रहूंगा!

धन्यवाद, रिच

+0

यह सच में, सच दिलचस्प है कि उनके नमूना एप्लिकेशन इस देरी का प्रदर्शन नहीं करता लेकिन तुम्हारा है। मेरे पास कोई अच्छा कारण नहीं है कि वह क्यों है। यह वूडू है, लेकिन इसे रद्द करने के लिए, क्या आप एक साधारण मैनुअल को गिनती ऐप बनाए रखने का प्रयास कर सकते हैं यह देखने के लिए कि क्या एआरसी इसे प्रभावित कर रहा है? – cbowns

+0

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

+0

मेरे पास इसके बारे में एक और विचार था: यह आपके कोरब्लूथूट ऐप और इंस्ट्रूमेंट्स के साथ नमूना ऐप दोनों को प्रोफाइल करने के लायक हो सकता है ताकि यह देखने के लिए कि कौन सी ऑब्जेक्ट्स बनाई जा रही हैं। यदि आपके ऐप में ऐसे संसाधन बनाने के लिए एक सूक्ष्म बग है जो इसे कभी रिलीज़ नहीं करता है, तो कोरब्लूटूथ उन ऑब्जेक्ट्स को अपडेट करने में अधिक समय व्यतीत कर सकता है जिनका उपयोग अब नहीं किया जा रहा है, और यह मंदी के कारण भी हो सकता है। – cbowns

उत्तर

7

मैं इस पर कुछ प्रगति की है और खबर अच्छी नहीं है। यह पता चला है कि समस्या का मेरा मूल विवरण गलत है। मैं मानता हूं (हमेशा करने के लिए एक बुरी बात) कि मॉड्यूल सप्लायर द्वारा उत्पादित नमूना ऐप सही होगा हालांकि समय रिपोर्ट करने वाले आंकड़े गलत हैं - जब वे पैकेट भेजने के लिए ~ 3ms की रिपोर्ट करते हैं और प्रतिक्रिया प्राप्त करते हैं तो वे केवल समय होते हैं -DidWriteValueForCharacteristic से और लिखने के बीच का समय शामिल न करें ValueForCharacteristic और didWriteValueForCharacteristic - एक बार जब मैंने इस बार शामिल किया तो उनका ऐप धीरे-धीरे मेरे जैसा व्यवहार करता है।

सभी आगे की जांच के बाद ऐसा लगता है कि आईओएस कोरब्लूटूथ पुस्तकालयों को पैकेट भेजने के अनुरोध में देरी हो रही है और यह वास्तव में भेजा जाता है - ये मनमाने ढंग से देरी 80ms और 2seconds के बीच कहीं भी हो सकती है। क्या किसी को पता है कि आईओएस पुस्तकालय वास्तविक पैकेट भेजने में इतनी धीमी क्यों हैं? एंड्रॉइड के तहत चल रहे हमारे समकक्ष कोड कम या ज्यादा तत्काल हैं।

अगर मेरे पास मेरी सनकी टोपी थी तो मैं कहूंगा कि ऐप्पल जानबूझ कर ऐसा कर रहा है ताकि अनुप्रयोगों को बीटीएलई का उपयोग करके तेजी से प्रतिक्रिया देने की आवश्यकता हो और इस प्रकार हार्डवेयर डेवलपर्स को ब्लूटूथ 3 का उपयोग करने के लिए मजबूर किया जा सके जिसके लिए सेब सुरक्षा चिप की आवश्यकता होती है और इस प्रकार प्रभावी ढंग से निर्मित इकाइयों पर एक सेब लाइसेंस लागत ...

+1

मेरे पास एक ही समस्या है। क्या आपको कुछ और मिला? – mohkhan

+0

मैं भी आईओएस 9 के साथ एक ही मुद्दे में भाग गया। क्या किसी ने कभी कुछ पाया? – Pierre

1

सबसे पहले जाँच चुकानी क्या आप में मिलता है:

-(void) peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic 
error:(NSError *)error { 

} 

यदि त्रुटि कोड 0 का मतलब है कि आप इसे इस बात की पुष्टि के बिना परिधीय के लिए मूल्य भेज रहे है। चेक अपने periheral इस पद्धति को लागू करता है, तो:

//assuming 
@property (strong, nonatomic) CBPeripheralManager  *peripheralManager; 

- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray *)requests 
{ 
    NSLog(@"WRITE REQUEST!!! %lu",(unsigned long)requests.count); 
    //check if there are data 

    for (CBATTRequest * req in requests) { 
    //send reposnse to Central that you recivied write value and eg/accept/reject the write request 
    [self.peripheralManager respondToRequest:req 
              withResult:CBATTErrorSuccess]; 
    } 


} 
संबंधित मुद्दे