Bluetooth LE ليس مخيفًا جدًا ، أو كيفية تحسين تجربة المستخدم دون بذل الكثير من الجهد

في الآونة الأخيرة ، توصل فريقنا إلى وظيفة تحويل الأموال عن طريق الجو باستخدام تقنية Bluetooth LE. أريد أن أخبركم كيف فعلنا ذلك وما توفره لنا Apple من الأدوات. يعتقد الكثير من المطورين أن تقنية Bluetooth صعبة ، لأنها بروتوكول منخفض المستوى ، وليس هناك الكثير من الخبراء. لكن كل شيء ليس مخيفًا جدًا ، وفي الحقيقة ، استخدام هذه الوظيفة بسيط جدًا! ومن المؤكد أن تلك الوظائف التي يمكن تنفيذها باستخدام Bluetooth LE مثيرة للاهتمام وستسلط الضوء لاحقًا على طلبك بين المنافسين.



دعونا أولاً نفهم نوع التكنولوجيا الموجودة وما هو اختلافها عن تقنية Bluetooth الكلاسيكية.

ما هو بلوتوث جنيه؟


لماذا قام مطورو Bluetooth بتسمية هذه التقنية وهي الطاقة المنخفضة؟ بعد كل شيء ، مع كل إصدار جديد من تقنية Bluetooth ، كان استهلاك الطاقة أقل بالفعل عدة مرات. الجواب يكمن في هذه البطارية.


قطرها 2 سم فقط ، والسعة حوالي 220 مللي أمبير * ساعة. عندما طور المهندسون تقنية Bluetooth LE ، أرادوا أن يعمل الجهاز مع هذه البطارية لعدة سنوات. وفعلوا ذلك! يمكن لأجهزة Bluetooth LE المزودة بهذه البطارية العمل لمدة عام. كم منكم لا يزال يقوم بإيقاف تشغيل Bluetooth على هاتفك بالطريقة القديمة لتوفير الطاقة ، كما فعلت عام 2000؟ عبثا ، يمكنك القيام بذلك - ستكون المدخرات أقل من 10 ثوانٍ من الهاتف يوميًا. ويمكنك تعطيل وظائف كبيرة للغاية ، مثل Handoff و AirDrop وغيرها.

ماذا حقق المهندسون من خلال تطوير تقنية Bluetooth LE؟ هل صقلوا البروتوكول الكلاسيكي؟ هل جعلها أكثر كفاءة في استخدام الطاقة؟ فقط الأمثل جميع العمليات؟ لا. لقد قاموا بإعادة تصميم بنية مكدس Bluetooth بالكامل وحققوا حقيقة أنه لكي تكون مرئية لجميع الأجهزة الأخرى ، فإنك تحتاج إلى وقت أقل للبث على الهواء واحتلال القناة. بدوره ، سمح هذا بتوفير جيد في استهلاك الطاقة. ومع البنية الجديدة ، يمكن الآن توحيد أي جهاز جديد ، وذلك بفضله يمكن للمطورين من جميع أنحاء العالم التواصل مع الجهاز ، وبالتالي ، بسهولة كتابة تطبيقات جديدة لإدارته. بالإضافة إلى ذلك ، يتم وضع مبدأ الاكتشاف الذاتي في الهندسة المعمارية: عند الاتصال بجهاز ، لا تحتاج إلى إدخال أي رموز PIN ، وإذا كان التطبيق الخاص بك يمكنه التواصل مع هذا الجهاز ، فسيستغرق الاتصال بضع ثوانٍ.

  • وقت أقل على الهواء.
  • أقل استهلاك الطاقة.
  • العمارة الجديدة.
  • انخفاض وقت الاتصال.

كيف تمكن المهندسون من تحقيق قفزة هائلة في كفاءة استخدام الطاقة؟

بقي التردد كما هو: 2.4 جيجا هرتز ، غير معتمد ومجاني للاستخدام في العديد من البلدان. لكن تأخير الاتصال أصبح أقل: 15-30 مللي ثانية بدلاً من 100 مللي ثانية مع تقنية Bluetooth الكلاسيكية. بقيت مسافة العمل كما هي - 100 متر ، ولم تكن فترة الإرسال قوية ، لكن تغيرت - بدلاً من 0.625 مللي ثانية ، أصبحت 3 مللي ثانية.

ولكن بسبب هذا ، لا يمكن تخفيض استهلاك الطاقة عشرة أضعاف. بالطبع ، كان هناك شيء يعاني. وهذه هي السرعة: بدلاً من 24 ميغابت في الثانية ، أصبحت 0.27 ميغابت في الثانية. ربما ستقول إن هذه سرعة مثيرة للسخرية لعام 2018.

أين يتم استخدام Bluetooth LE؟




هذه التكنولوجيا ليست صغيرة ، ظهرت لأول مرة في iPhone 4s. وتمكنت بالفعل من التغلب على العديد من المناطق. يستخدم بلوتوث LE في جميع الأجهزة المنزلية الذكية والالكترونيات يمكن ارتداؤها. الآن هناك حتى رقائق بحجم حبوب البن.



وكيف يتم تطبيق هذه التكنولوجيا في البرامج؟

نظرًا لأن Apple كانت أول من قام بدمج Bluetooth في أجهزتهم والبدء في استخدامه ، فقد حققوا الآن تقدمًا جيدًا وتقنية مدمجة في نظامهم البيئي. والآن يمكنك تلبية هذه التكنولوجيا في خدمات مثل AirDrop ، بدء التشغيل السريع للأجهزة ، مشاركة كلمات المرور ، Handoff. وحتى الإخطارات في الساعة مصنوعة عبر Bluetooth LE. بالإضافة إلى ذلك ، قدمت Apple وثائق متاحة للجمهور حول كيفية التأكد من أن الإخطارات من جميع التطبيقات تأتي إلى أجهزتك الخاصة. ما هي أدوار الأجهزة داخل Bluetooth LE؟



المذيع. يرسل رسائل إلى كل شخص قريب ، لا يمكنك الاتصال بهذا الجهاز. حسب هذا المبدأ ، تعمل iBeacons وأعمال الملاحة الداخلية.

المراقب. يستمع إلى ما يجري حوله ، ويستقبل البيانات فقط من الرسائل العامة. لا يخلق اتصالات.

ولكن مع المركزية والمحيطية أكثر إثارة للاهتمام. لماذا لم يطلق عليهم ببساطة خادم عميل؟ منطقيا ، اذا حكمنا من خلال الاسم. لكن لا.

لأن الطرفية في الواقع بمثابة خادم. هذا هو الجهاز المحيطي الذي يستهلك طاقة أقل ويتصل بوسط أقوى. يمكن أن يبلغك الجهاز المحيطي أنه قريب والخدمات التي يقدمها. يستطيع جهاز واحد فقط الاتصال به ، بينما يحتوي Peripheral على بعض البيانات. ويمكن لـ Central فحص الهواء بحثًا عن الأجهزة ، وإرسال طلبات الاتصال ، والاتصال بأي عدد من الأجهزة ، والقراءة والكتابة والاشتراك في البيانات من الأجهزة الطرفية.

ما الذي يمكننا نحن المطورين الوصول إليه في نظام Apple البيئي؟

ما هو متاح لنا؟


نظام التشغيل iOS / Mac OS:

  • الطرفية والوسطى.
  • وضع الخلفية.
  • انتعاش الدولة.
  • اتصال فاصل 15 مللي ثانية.

watchOS / tvOS:

  • watchOS 4+ / tvOS 9+.
  • المركزية فقط.
  • كحد أقصى اتصالين.
  • Apple watch series 2+ / AppleTv 4+.
  • اغلاق عند الدخول في الخلفية.
  • اتصال فاصل 30 مللي ثانية.

الفرق الأكثر أهمية هو الفاصل الزمني للاتصال. ماذا يؤثر؟ للإجابة على هذا السؤال ، تحتاج أولاً إلى فهم كيفية عمل بروتوكول Bluetooth LE ولماذا يعد هذا الاختلاف البسيط في القيم المطلقة مهمًا جدًا.

كيف يعمل البروتوكول


كيف هي عملية البحث والاتصال؟

تعلن Peripheral عن وجودها على تردد الفاصل الزمني للإعلان ، عبوتها صغيرة جدًا وتحتوي على عدد قليل فقط من معرّفات الخدمة التي يوفرها الجهاز ، فضلاً عن اسم الجهاز. يمكن أن يكون الفاصل الزمني كبيرًا جدًا ويمكن أن يختلف حسب الحالة الحالية للجهاز ووضع توفير الطاقة والإعدادات الأخرى. تنصح Apple مطوري الأجهزة الخارجية بربط طول الفاصل الزمني بمقياس التسارع: قم بزيادة الفاصل الزمني إذا لم يتم استخدام الجهاز ، وعندما يكون نشطًا ، قم بالتقليل للعثور على الجهاز بسرعة. لا يرتبط الفاصل الزمني للإعلان بفاصل الاتصال ويتم تحديده بواسطة الجهاز نفسه ، اعتمادًا على استهلاك الطاقة وإعداداته. لا يمكن الوصول إليه وغير معروف لنا في نظام Apple البيئي ؛ يتم التحكم فيه بالكامل بواسطة النظام.



بعد العثور على الجهاز ، نرسل طلب اتصال ، وهنا يدخل الفاصل الزمني للاتصال المشهد - الوقت الذي يمكن أن يستجيب فيه الجهاز الثاني للطلب. ولكن هذا عند الاتصال ، ولكن ماذا يحدث عند القراءة / الكتابة؟



يظهر الفاصل الزمني للاتصال أيضًا عند قراءة البيانات - مما يؤدي إلى تقليلها بمعدل ضعفين يزيد من معدل نقل البيانات. ولكن عليك أن تفهم أنه إذا كان الجهازان لا يدعمان نفس الفاصل الزمني ، فسيتم تحديد الحد الأقصى لهما.

لنلقِ نظرة على مجموعة من المعلومات التي تمر عليها الأجهزة الطرفية.

يتم تحديد MTU (الحد الأقصى لوحدة الإرسال) من هذه الحزمة أثناء عملية الاتصال وتختلف من جهاز لآخر واعتمادًا على نظام التشغيل. في بروتوكول الإصدار 4.0 ، كانت وحدة الإرسال الكبرى حوالي 30 ، ولم يتجاوز حجم الحمولة 20 بايت. في الإصدار 4.2 ، تغير كل شيء ، والآن يمكنك نقل حوالي 520 بايت. ولكن لسوء الحظ ، فإن الأجهزة الأصغر من iPhone 5s هي فقط التي تدعم هذا الإصدار من البروتوكول. حجم الحمل ، بغض النظر عن حجم وحدة الإرسال الكبرى ، هو 7 بايت: ويشمل ذلك رؤوس ATT و L2CAP. مع السجل ، بشكل عام ، وضعا مماثلا.



لا يوجد سوى وضعين: مع الإجابة وبدون. يعمل الوضع غير المجاب عليه على زيادة سرعة نقل البيانات ، حيث لا يوجد فاصل انتظار قبل التسجيل التالي. لكن هذا الوضع غير متاح دائمًا ، وليس على جميع الأجهزة وليس على جميع الأنظمة. قد يكون الوصول إلى وضع التسجيل هذا مقيدًا بالنظام نفسه ، لأنه يعتبر أقل كفاءة في استخدام الطاقة. في نظام التشغيل iOS ، هناك طريقة يمكنك من خلالها التحقق قبل التسجيل من توفر هذا الوضع.

الآن دعونا نلقي نظرة على ما يتكون البروتوكول من.



يتكون البروتوكول من 5 مستويات. طبقة التطبيق هي منطقك ، الموصوف أعلى CoreBluetooth. يتم استخدام GATT (طبقة السمات العامة) لتبادل الخدمات والخصائص الموجودة على الأجهزة. يتم استخدام ATT (طبقة السمات) لإدارة خصائصك ونقل بياناتك. L2CAP هو بروتوكول تبادل بيانات منخفض المستوى. المراقب المالي هو رقاقة بريتيش تيليكوم نفسها.

ربما تسأل ما هو الغات وكيف يمكننا العمل معها؟

يتكون GATT من الميزات والخدمات. السمة هي كائن يتم تخزين بياناتك فيه ، مثل متغير. والخدمة هي مجموعة تقع فيها خصائصك ، مثل مساحة الاسم. الخدمة لها اسم - UUID ، يمكنك اختيار ذلك بنفسك. قد تحتوي الخدمة على خدمة فرعية.



السمة لها أيضا UUID الخاصة بها - في الواقع ، اسم. قيمة السمة هي NSData ، هنا يمكنك تسجيل وتخزين البيانات. الواصفات هي وصف لخاصيتك ، يمكنك وصف البيانات التي تتوقعها في هذه الخاصية ، أو ما تعنيه. هناك العديد من الواصفات في بروتوكول Bluetooth ، ولكن حتى الآن لا يتوفر سوى اثنين من أنظمة Apple: الوصف البشري وتنسيق البيانات. هناك أيضًا أذونات لميزتك:



لنجربها بنفسك


كان لدينا فكرة لجعل من الممكن تحويل الأموال عن طريق الجو دون الحاجة إلى أي شيء من المتلقي. تخيل أنك تحير مهمة شيقة للغاية ، وتكتب الكود المثالي ، وهنا يقترح أحد الزملاء الذهاب لتناول القهوة. وأنت شغوف بالمهمة التي لا يمكنك الذهاب إليها ، واطلب منه أن يشتري لك فنجانًا من الكابتشينو اللذيذ. يجلب لك القهوة ، وتحتاج إلى إعادة الأموال إليه. يمكنك ترجمة عن طريق رقم الهاتف ، وأنها تعمل بشكل جيد. ولكن هنا موقف محرج - أنت لا تعرف رقمه. حسنًا ، مثل هذا ، لقد كنت تعمل لمدة ثلاث سنوات ، لكنهم لم يتبادلوا الأرقام :)

لذلك ، قررنا أن نجعل من الممكن تحويل الأموال إلى الأشخاص القريبين ، دون إدخال أي بيانات مستخدم. كما هو الحال في AirDrop. ما عليك سوى اختيار مستخدم وإرسال المبلغ الذي يحتاجه. دعونا نرى ما نحتاجه لهذا.



دفع رسم الخرائط


نحن بحاجة إلى المرسل:

  1. يمكنني العثور على جميع الأجهزة القريبة ودعم خدمتنا.
  2. يمكنني قراءة التفاصيل.
  3. ويمكن أن يرسل رسالة إلى المستلم أنه أرسل له المال بنجاح.

يجب أن يكون المستلم بدوره قادرًا على إبلاغ المرسلين المحيطين بأن لديه خدمة بالبيانات اللازمة ، وأن يكون قادرًا على استقبال الرسائل من المرسل. أعتقد أنه لا يستحق وصف كيفية إجراء عملية تحويل الأموال بالتفاصيل في مصرفنا. الآن دعونا نحاول تنفيذ هذا.

تحتاج أولاً إلى الخروج بأسماء خدماتنا وخصائصها. كما قلت ، هذا هو UUID. نقوم ببساطة بإنشائها وحفظها على الأجهزة الطرفية والوسطية بحيث تكون متماثلة في كلا الجهازين.



أنت حر في استخدام أي UUID ، باستثناء تلك التي تنتهي مثل: XXXXXXXX- 0000-1000-8000-00805F9B34FB - فهي محفوظة لشركات مختلفة. يمكنك أنت بنفسك شراء هذا الرقم ولن يستخدمه أحد. سيكلف 2500 دولار.

بعد ذلك ، سنحتاج إلى إنشاء مديرين: واحد لتحويل الأموال والآخر لتلقيها. تحتاج فقط إلى تحديد المندوبين. سنرسل الوسطى ، تلقي الطرفية. نقوم بإنشاء كليهما ، لأن كل من المرسل والمستقبل يمكن أن يكونا شخصًا واحدًا في أوقات مختلفة.



نحن الآن بحاجة إلى تمكين الكشف عن المستلم وكتابة تفاصيل المستلم بطابعنا المميز.



أولا ، إنشاء خدمة. سنقوم بتسجيل UUID ونشير إلى أنه أساسي - أي أن الخدمة هي الخدمة الرئيسية لهذا الجهاز. مثال جيد: مراقبة معدل ضربات القلب ، والتي سيكون معدل ضربات القلب الحالي هو الخدمة الرئيسية ، وحالة البطارية هي معلومات ثانوية.

بعد ذلك ، نقوم بإنشاء خاصيتين: واحدة لقراءة تفاصيل المستلم ، والثانية للكتابة بحيث يمكن للمستلم معرفة كيفية إرسال الأموال. نقوم بتسجيلهم في خدمتنا ، ثم نضيفهم إلى المدير ، ونبدأ الاكتشاف ونشير إلى UUID للخدمة حتى تتمكن جميع الأجهزة القريبة من معرفة خدمتنا قبل الاتصال بها. يتم وضع هذه البيانات في الحزمة التي يرسلها Central أثناء البث.

المستلم جاهز ، انتقل إلى المرسل. تشغيل البحث والاتصال.



عندما تقوم بتشغيل المدير ، نبدأ البحث عن الأجهزة مع خدمتنا. عندما نجدهم ، نحصل عليهم بطريقة المفوض ونتصل على الفور. هام: تحتاج إلى الحفاظ على ارتباط قوي بكل الأجهزة الطرفية التي تعمل معها ، وإلا فسوف تتسرب.



بعد الاتصال الناجح ، نقوم بتهيئة المفوض الذي سيعمل مع هذا الجهاز ، ونحصل على الخدمة التي نحتاجها من الجهاز.



لقد وصلنا بنجاح إلى المستلم ، والآن تحتاج إلى قراءة التفاصيل الخاصة به.

بعد الاتصال ، طلبنا بالفعل جميع الخدمات من الجهاز. وبعد استلامها ، سيتم استدعاء طريقة المفوض ، والتي سوف تدرج جميع الخدمات المتاحة على هذا الجهاز. نجد الحق ونطلب خصائصه. يمكن العثور على النتيجة بواسطة UUID في طريقة المفوض ، الذي يخزن البيانات للترجمة. نحاول قراءتها ، ونحصل على المطلوب مرة أخرى في طريقة المفوض. يتم تخزين جميع الخدمات والخصائص وقيمها بواسطة النظام ، لذلك ليس من الضروري طلبها لاحقًا في كل مرة.



هذا كل شيء ، لقد أرسلنا أموالًا مقابل القهوة ، لقد حان الوقت لإظهار المتلقي إشعارًا جميلًا حتى ينتظر روبل في حسابه. للقيام بذلك ، تحتاج إلى تنفيذ عملية إرسال رسالة.

نحصل على الخاصية التي نحتاجها من المرسل ، وفي هذه الحالة أخذناها من القيمة المخزنة. ولكن قبل ذلك ، تحتاج إلى الحصول عليه من الجهاز ، كما فعلنا من قبل. ثم فقط اكتب البيانات إلى الخاصية المطلوبة.

بعد ذلك ، على الجهاز الآخر ، حصلنا على طلب الكتابة في طريقة المفوض. هنا يمكنك قراءة البيانات التي يتم إرسالها إليك ، والرد على أي خطأ ، على سبيل المثال ، لا يوجد وصول ، أو هذه الخاصية غير موجودة. سيعمل كل شيء ، لكن فقط إذا كان الجهازان قيد التشغيل وكانت التطبيقات نشطة. ونحن بحاجة إلى العمل في الخلفية!



تسمح لك Apple باستخدام Bluetooth في الخلفية. للقيام بذلك ، تحتاج إلى الإشارة في info.plist المفتاح في أي وضع نريد أن نستخدمه ، في الأجهزة الطرفية أو المركزية.



بعد ذلك ، في المدير ، تحتاج إلى تحديد مفتاح الاسترداد وإنشاء طريقة تفويض. الآن وضع الخلفية متاح لنا. إذا كان التطبيق نائماً أو تم إلغاء تحميله من الذاكرة ، فعندما تجد الجهاز المحيطي المرغوب فيه أو عندما يكون Central متصلاً ، فسوف يستيقظ وسيتم استعادة المدير باستخدام مفتاحك.



كل شيء على ما يرام ، وعلى استعداد ليتم إصدارها. ولكن يأتي المصممون إلينا هنا ويقولون: "نريد إدراج صور للمستخدمين بحيث يسهل عليهم العثور على بعضهم البعض". ماذا تفعل؟ في صفتنا ، يمكنك كتابة حوالي 500 بايت ، ولكن على بعض الأجهزة بشكل عام 20 :(



الذهاب أعمق


لحل هذه المشكلة ، كان علينا أن نذهب أعمق.



تحدثنا الآن إلى الأجهزة على مستوى GATT / ATT. لكن في نظام iOS 11 ، لدينا إمكانية الوصول إلى بروتوكول L2CAP. ومع ذلك ، في هذه الحالة ، سيكون عليك رعاية نقل البيانات بنفسك. يتم إرسال الحزم مع 2 كيلو بايت MTU ، لا حاجة لإعادة ترميز أي شيء ، يتم تطبيق NSStream العادية. تصل معدلات البيانات إلى 394 كيلوبت في الثانية ، وفقًا لشركة Apple.

لنفترض أنك قمت بنقل أي بيانات عن خدمتك من Peripheral إلى Central في شكل خصائص عادية. وقد استغرق الأمر مني فتح القناة. يمكنك فتحه على الأجهزة الطرفية ، في مقابل حصولك على PSM - هذا هو رقم القناة التي يمكنك الاتصال بها ، وتحتاج إلى نقلها إلى Central باستخدام نفس الخصائص. الرقم ديناميكي ، والنظام نفسه يختار PSM لفتحه في الوقت الحالي. بعد النقل ، يمكنك الاتصال بالفعل بـ Peripheral على الجهاز المركزي وتبادل البيانات بتنسيق مناسب لك. دعونا ننظر في كيفية القيام بذلك.

أولاً ، افتح المنفذ المشفر على الأجهزة الطرفية. يمكنك القيام بذلك دون تشفير ، ثم هذا سيسرع عملية النقل قليلاً.



بعد ذلك ، في طريقة المفوض ، نحصل على PSM ونرسله إلى جهاز آخر.



بعد توصيل جهاز آخر ، سوف يطلق علينا الطريقة التي يمكننا من خلالها الحصول على NSStream الذي نحتاجه للإرسال من القناة.



المركزية أسهل ، فنحن فقط نربط القناة بالعدد المطلوب ...



... وبعد ذلك نحصل على الجداول التي نحتاجها. في نفوسهم ، يمكنك نقل أي بيانات من أي حجم على الإطلاق ، وبناء البروتوكول الخاص بك على رأس L2CAP. لذلك أدركنا نقل الصور المستلم.



ولكن هناك مطبات ، حيث الاستغناء عنها.

المزالق


دعونا ننظر إلى المزالق عند العمل في الخلفية. نظرًا لأن دورتي Peripheral و Central متاحان لك ، فقد تعتقد ذلك. أنه في الخلفية يمكنك تحديد الأجهزة القريبة في الخلفية وأيها نشطة. من الناحية النظرية ، كان يجب أن يكون الأمر كذلك ، لكن Apple قدمت قيودًا: الهواتف الموجودة في الخلفية ، سواء كانت المركزية أو الطرفية ، غير متوفرة للهواتف الأخرى الموجودة في الخلفية أيضًا. أيضًا ، الهواتف الموجودة في الخلفية غير مرئية من الأجهزة التي لا تعمل بنظام iOS. لنلقِ نظرة على سبب حدوث ذلك.

عندما يكون جهازك نشطًا ، فإنه يرسل حزمة بث منتظمة ، والتي قد تحتوي على اسم الجهاز وقائمة الخدمات. أن هذا الجهاز يوفر. وتجاوز البيانات هو كل ما لم يصلح.



عندما ينتقل الجهاز إلى الخلفية ، فإنه لا يمر بالاسم ، وقائمة الخدمات المدعومة تنقل لتجاوز البيانات. إذا كان التطبيق نشطًا ، فعند المسح من جهاز iOS ، فإنه يقرأ هذه البيانات ، وعند التبديل إلى الخلفية ، فإنه يتجاهلها. لذلك ، عند التبديل إلى الخلفية ، لن تتمكن من رؤية التطبيقات الموجودة في الخلفية أيضًا.تتجاهل أنظمة تشغيل Apple الأخرى دائمًا البيانات الفائضة ، لذلك إذا بحثت عن أجهزة تدعم خدمتك ، فستحصل على صفيف فارغ. وإذا كنت تتصل بكل جهاز قريب وتطلب خدمات مدعومة ، فقد تحتوي القائمة على خدمتك ، ويمكنك العمل معها.



ثم استعدنا للتقديم للاختبار ، وقمنا بتصحيح الأخطاء الطفيفة ، وشاركنا في التحسين. وفجأة ، في مرحلة ما ، بدأنا في الحصول على هذا الخطأ في وحدة التحكم:

CoreBluetooth[WARNING] Unknown error: 124 

أسوأ شيء هو أنه لم يتم استدعاء طريقة تفويض ، حتى أننا لم نتمكن من التغلب على هذا الخطأ للمستخدم. مجرد رسالة في السجل - والصمت ، كل شيء تجمد. لم يتم إجراء تغييرات كبيرة ، لذلك بدأنا في التراجع عن الالتزامات. ووجدوا أنهم قاموا ذات مرة بتحسين الكود وإعادة تحديد طريقة كتابة البيانات. كانت المشكلة أنه لم يتم تحديث جميع العملاء ، لذلك حدث هذا الخطأ.

 .write != .writeWithoutResponse 

لقد سعدنا بأننا أصلحنا كل شيء ، ركضنا بدلاً من ذلك لتمريره إلى الاختبارات ، وعادوا إلينا على الفور: "صور الأزياء الخاصة بك لا تعمل. لقد أصبحوا جميعهم مثقفين ". بدأنا في المحاولة ، وصحيح في بعض الأحيان ، على أجهزة مختلفة ، الصور المكسورة تأتي في أوقات مختلفة. بدأوا في البحث عن سبب.

ثم مرة أخرى رأوا الخطأ السابق. يعتقد على الفور أنه كان في إصدارات مختلفة. ولكن بعد الإزالة الكاملة للإصدار القديم من جميع أجهزة الاختبار ، لا يزال الخطأ مستنسخًا. كنا حزينين ...

 CoreBluetooth[WARNING] Unknown error: 722 CoreBluetooth[WARNING] Unknown error: 249 CoreBluetooth[WARNING] Unknown error: 312 

بدأنا نبحث عن أداة تصحيح الأخطاء. أول شيء واجهناه هو Apple Bluetooth Explorer. إنه برنامج قوي ، يمكنه القيام بالكثير من الأشياء ، ولكن لتصحيح أخطاء بروتوكول Bluetooth LE ، هناك علامة تبويب واحدة صغيرة مع البحث عن الأجهزة والحصول على الخصائص. ونحن بحاجة لتحليل L2CAP.

ثم وجدوا مستكشف LightBlue. لقد أصبح برنامجًا لائقًا للغاية ، على الرغم من أنه تم تصميمه من iOS 7. يمكنه القيام بنفس الشيء مثل Bluetooth Explorer ، ويعرف أيضًا كيفية الاشتراك في المواصفات. ويعمل أكثر استقرارا. كل شيء على ما يرام ، ولكن مرة أخرى دون L2CAP.

ثم تذكرنا الشم المشهور المعروف باسم WireShark.

اتضح أنه كان على دراية بتقنية Bluetooth LE: يمكنه قراءة L2CAP ، ولكن فقط تحت Windows. على الرغم من أنه ليس من المخيف أننا لم نعثر على Windows أو شيء من هذا. أكبر ناقص - البرنامج يعمل فقط مع جهاز معين. وهذا يعني أنه كان عليك العثور على الجهاز في مكان ما في المتجر الرسمي. وأنت نفسك تدرك أنه من غير المحتمل أن توافق شركة كبيرة على شراء جهاز غير مفهوم في سوق للسلع الرخيصة والمستعملة. لقد بدأنا حتى تصفح المتاجر عبر الإنترنت في الخارج.

ولكن هنا وجدوا برنامج PacketLogger في أدوات Xcode الإضافية. يسمح لك بمشاهدة حركة المرور التي يتم تشغيلها على جهاز OS X. لماذا لا تعيد كتابة MoneyDrop الخاصة بنا تحت OS X؟ كان لدينا بالفعل مكتبة منفصلة. لقد استبدلنا فقط UIImage بـ NSImage ، بدأ كل شيء بعد 10 دقائق.



أخيرًا ، يمكننا قراءة الحزم المتبادلة بين الأجهزة. أصبح من الواضح على الفور أنه في وقت نقل البيانات عبر L2CAP تم تسجيل إحدى الخصائص. نظرًا لحقيقة أن القناة كانت مشغولة تمامًا بنقل الصور ، تجاهل iOS التسجيل ، وقام المرسل بعد التجاهل بخرق القناة. بعد إصلاح المشاكل مع نقل الصورة لم يكن.



هذا كل شيء ، شكرا للقراءة :)

روابط مفيدة


WWDC / CoreBluetooth:


بلوتوث


يوتيوب

  • إلكترونيات السهم → بلوتوث منخفضة الطاقة سلسلة

Source: https://habr.com/ru/post/ar452278/


All Articles