ميزان ديسنت

افتح وثائق BLE API

منتدى للنقاش   Half Decent Scale extended API   تواصل معنا


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

دليل البدء السريع: الوزن وزر الإخطارات ، تصفير والمؤقت

  1. قم بتشغيل ميزان ديسنت بالضغط على الزر O لأسفل لمدة ثانيتين
  2. قم بمسح بلوتوث على جهازك ، ثم اتصل بـ'ميزان ديسنت'
  3. أرسل أمر TARE أو LED ON إلى المقياس لإظهار APP على الميزان. لن يزن الميزان حتى يتم إرسال أمر كتابة نوع ما إلى الميزان ، لإعلامه بوجود تطبيقك هناك
  4. Turn the LED ON: "030A0101000108" or LED OFF: "030A0000000009"
  5. اطلب تلقي إشعارات الوزن من FFF4 ('0000FFF4-0000-1000-8000-00805F9B34FB'). Weight ستصل إشعارات الوزن الآن ١٠ مرّات أسرع, موقعة اثنين بايت (قصير) ، على البايتين ٣ و ٤
  6. يرسل البرنامج الثابت v1.0 و v1.1 الوزن كرسالة ٧ بايت يرسل البرنامج الثابت v1.2 والإصدارات الأحدث وزنًا مع طابع زمني ، كرسالة ١٠ بايت
  7. اختياري: ابدأ الموقت بإرسال '030B030000000B' و أوقف المؤقت مع '030B0000000008' و أعد ضبط المؤقت إلى الصفر مع '030B020000000A'
  8. Tare the scale by sending "030F000000010D".
  9. شاهد العرض التوضيحي لـ Light Blue وهو يقوم بهذه الأوامر
  10. خطأ معروف: في الإصدار 1.0 من البرنامج الثابت لميزان ديسنت، قد يتم أحيانًا إسقاط أمر (مثل التصفير أو بدء المؤقت). للسلامة ، أرسل أمرًا إلى الميزان مرتين ، بتأخير 50 مللي ثانية أو أطول. سيتم تناول ذلك في البرنامج الثابت v1.1. سيتم إضافة أمر بلوتوث جديد لتحديد إصدار البرنامج الثابت الحالي في الإصدار 1.1 ، في حالة رغبتك في وضع منطق شرطي في عدم إرسال الأوامر مرتين
  11. The Half Decent Scale disconnects if a heartbeat of "03 0a 03 ff ff 00 0a" is not received at least every 5 seconds. This is a very useful feature which disconnects zombie bluetooth connections, which happen often on Android 9 and earlier. Sending the heartbeat to older scales has no negative effect. Byte 6 of both the TARE and LED ON commands should be set to 01, otherwise the Half Decent Scale will assume your app is unaware of the heartbeat feature and not enforce it.
  12. واقع في مشكلة؟ قم بتنزيل LightBlue لنظام iOS و أندرويد و Mac واتبع الخطوات الموضحة في الفيديو أعلاه
  13. Programmers guide to the Half Decent Scale.

مرجع الأمر:

تلقى الوزن على FFF4 (0000FFF4-0000-1000-8000-00805F9B34FB)

يرسل البرنامج الثابت v1.0 و v1.1 الوزن كرسالة ٧ بايت:
  • 03CE 0000 0000 CD = 0.0 جرامات
  • 03CE 0065 0000 A8 = 10.1 جرامات
  • 03CE 0794 0000 5E = 194.0 جرامات
  • 03CE 1B93 0000 5E = 705.9 جرامات
  • 03CE 2BAC 0000 4A = 1118.0 جرامات

    يرسل البرنامج الثابت v1.2 والإصدارات الأحدث وزنًا بطابع زمني كرسالة ١٠ بايت:
  • 03CE 0000 010203 0000 CD = 0.0 جرامات - (1 minute, 2 seconds, 3 deciseconds)
  • 03CE 0065 010204 0000 A8 = 10.1 جرامات - (1 minute, 2 seconds, 4 deciseconds)
  • 03CE 0794 010205 0000 5E = 194.0 جرامات - (1 minute, 2 seconds, 5 deciseconds)
  • 03CE 1B93 010206 0000 5E = 705.9 جرامات - (1 minute, 2 seconds, 6 deciseconds)
  • 03CE 2BAC 010207 0000 4A = 1118.0 جرامات - (1 minute, 2 seconds, 7 deciseconds)
  • تصفير (ضيط الوزن لصفر)030F000000010E
    تشغيل LED030A0101000108 (جرامات)
    إطفاء LED030A0000000009
    بدء المؤقت030B030000000B
    توقف المؤقت030B0000000008
    تصفير المؤقت030B020000000A
    إيقاف التشغيل
    (جديد في الإصدار 1.2 من البرامج الثابتة)
    030A020000000B

    اقتران بلوتوث و إنهاء العدّ

    1. عند التشغيل ، سيعلن الميزان عن نفسه لإقران بلوتوث. سيومض مؤشر LED أزرق. جهاز بلوتوث يسمى 'Decent Scale'
    2. سيبقى المقياس متاحًا بشكل دائم لإقتران بلوتوث. لا ينتهي وقت إقتران بلوتوث
    3. إذا اتصل تطبيقك ، ثم انقطع الاتصال ، فسيعود المقياس إلى وضع إقتران بلوتوث
    4. إذا كان يعمل على البطاريات ، فستنتهي مهلة الميزان بعد دقيقتين (١٠ دقائق للبرنامج الثابت v1.1) إذا لم يكن مقترنًا ببلوتوث ، أو إذا لم يحدث قياس للوزن
    5. إذا كان يعمل على طاقة USB ، فلن يتم إيقاف تشغيل الميزان من تلقاء نفسه
    6. عند اتصال تطبيقك ، ستظهر كلمة APP على شاشة الميزان
    7. A مقطع فيديو سريع عن ميزان ديسنت

    أهداف تصميم الميزان

    1. معلومات الوزن غير منسقة عن قصد ، حيث نعتقد أنه يمكن إجراء التسوية بشكل أفضل على جهاز الكمبيوتر ، في البرامج ، مما يمكن القيام به في البرنامج الثابت للميزان
    2. ميزان ديسنت ليس له مفهوم 'الوزن المستقر'. يتم نقل القراءات الحالية من خلية التحميل على الفور عبر البلوتوث
    3. إذا كنت تريد وزنًا سلسًا ، فيجب عليك تنفيذ ذلك بنفسك فوق البيانات الأولية التي يتلقاها المقياس
    4. يتم الإبلاغ عن تغييرات الوزن على الفور
    5. لا يوجد 'وزن حد أدنى' يجب الوصول إليه حتى يتم اعتبار الوزن على أنه قد تغير
    6. يهدف هذا الميزان إلى أن يكون سريعًا للغاية للاستجابة لتغيرات الوزن ، حتى ٠.١ جرام
    7. إذا كانت هناك حركة على وسيط الوزن (مثل السائل) فمن المحتمل أن ترى اختلافات صغيرة في الوزن بسبب هذه الحركة
    8. إذا كانت حالة الاستخدام الخاصة بك تعني أنك تفضل إخفاء تباينات الوزن على مؤشر LED للميزان ، فيمكنك اختيار تعطيلها. وبالتالي يمكنك اختيار إظهار الوزن داخل تطبيقك فقط. سيكون لهذا فائدة إضافية تتمثل في إطالة عمر البطارية بشكل كبير
    9. Firmware v1.2 and newer includes a decisecond accurate timestamp with each weight measurement. هذا (١) لمساعدتك في حساب معدل التدفق ، (٢) لمعرفة ما إذا كنت قد فقدت مقياسًا للوزن أو (٣) تلقيت رسالة وزن غير مستقر

    هناك زرّان ، بإسم دائرة (الزر 0) ومربع (الزر 1)

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

    محدِدات

    1. أقصى وزن ٢٠٠٠ جرام
    2. قد تتسبب المشروبات الساخنة جدًا في عدم قراءة المقياس بشكل صحيح
      1. هذا لأنها تسخن خلية الحمل وتغير مقاومتها تحت الوزن
      2. عادة ما يظهر هذا على أنه الوزن لا يتجاوز رقمًا معينًا
      3. يمكنك حل هذه المشكلة باستخدام طبقة عازلة بين الميزان ومشروباتك الساخنة ، مثل قطعة من السيليكون أو الخشب
    3. يتم معايرة ميزان ديسنت بأوزان ١٠٠٠ جرام و ٢٠٠٠ جرام في المصنع
      1. ومع ذلك ، قد تتأثر المعايرة بالشحن
      2. راجع دليل المستخدم أو فيديو المعايرةهذا لمزيد من المعلومات
      3. يتم إرسال الوزن بسرعة ١٠ هرتز
      4. يتم إرجاع حالة البطارية في تغذية بيانات الوزن استجابةً لأمر تشغيل أو إيقاف تشغيل مؤشر بلوتوث
        1. راجع 'إرسال أوامر لتشغيل أو إيقاف تشغيل مصابيح LED'
        2. ستتسبب البطارية بنسبة ٣٪ أو أقل في ظهور رسالة LO على المقياس عند تشغيله
      5. لا نوصي بترك أوزان ثقيلة على الميزان بشكل دائم ، حيث سيؤدي ذلك إلى تشويه خلية الحمل ببطء ، إرباكها خارج المعايرة
      6. لا يوجد حد لعدد المرات التي يمكن فيها إعادة معايرة الميزان
      7. لا يوجد أمر بلوتوث لإعداد جرامات او أوقية على شاشة الميزان
        1. This must be done manually, by pressing both O and [] buttons immediately after turning the scale on. See the User Manual for more information.
        2. يمكنك اكتشاف ما إذا كان الميزان يعرض جرامات أو اوقية من خلال قراءة الاستجابة لأمر تشغيل أو إيقاف تشغيل مؤشر بلوتوث. راجع 'إرسال الأوامر لتشغيل أو إيقاف تشغيل مصابيح LED'
      8. إذا تم إرسال أمر بلوتوث ثانٍ إلى الميزان قبل أن ينتهي من تنفيذ الأمر الأول ، فسيتجاهل الميزان الأمر الثاني
        1. على سبيل المثال: أمر تصفير متبوعًا على الفور بأمر بدء مؤقت
        2. يوصى بتأخير ٢٠٠ مللي ثانية بين الأوامر المرسلة إلى الميزان
        3. بدلاً من ذلك ، يمكنك تأخير إرسال الأمر الثاني حتى تتأكد من تنفيذ الأمر الأول
        4. على سبيل المثال: بعد مرور التصفير (أو أمر تشغيل / إيقاف تشغيل LED) ، يتم إرسال استجابة إجابة إلى تطبيقك ، مع تعيين البايت 6 على FE للإشارة إلى النجاح


      نظرة عامة على البلوتوث

      تأتي الحزم ميزان ديبسنت على '0000FFF4-0000-1000-8000-00805F9B34FB'

      تحتوي جميع حزم بلوتوث من / إلى ميزان ديبسنت على بنية ٧ بايت التالية:

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      موديل
      03 = ديسنت
      نوع
      0A=LED تشغيل/إيقاف
      0B=مؤقت تشغيل/إيقاف
      0F=تصفير
      Command / data (1)Command / data (2)Command / data (3)Command / data (4)التحقق من صحة XOR
      ٦ بايت XOR للتحقق
      مزيد من التفاصيل حول كل أمر ونوع المعلومات مذكورة أدناه

      إليك إجراء Tcl الذي يبني الحزمة الثنائية المكونة من 7 أحرف لإرسالها إلى ميزان ديسنت. تم إنشاؤه أولاً كسلسلة نصية ، ثم يتم تحويلها بعد ذلك إلى ثنائي ٧ بايت في نهاية الإجراء:

        proc decent_scale_make_command {cmdtype cmdddata {cmddata2 {}} } {
            if {$cmddata2 == ""} {
                msg "1 part decent scale command"
                set hex [subst {03${cmdtype}${cmdddata}000000[decent_scale_calc_xor "0x$cmdtype" "0x$cmdddata"]}]
            } else {
                msg "2 part decent scale command"
                set hex [subst {03${cmdtype}${cmdddata}${cmddata2}0000[decent_scale_calc_xor4 "0x$cmdtype" "0x$cmdddata" "0x$cmddata2"]}]
            }
            msg "hex is '$hex' for '$cmdtype' '$cmdddata' '$cmddata2'"
            return [binary decode hex $hex]
        }


      حساب XOR

      لحساب XOR ، يجب عليك عمل XOR رياضي لأول ٦ بايت

      إليك كود برمجة Tcl الذي يحسب XOR لأمر بسيط لا يأخذ سوى معلمة واحدة ، مثل TARE:

        proc decent_scale_calc_xor {cmdtype cmdddata} {
            set xor [format %02X [expr {0x03 ^ $cmdtype ^ $cmdddata ^ 0x00 ^ 0x00 ^ 0x00}]]
            msg "decent_scale_calc_xor for '$cmdtype' '$cmdddata' is '$xor'"
            return $xor
        }
        

      إليك كود برمجة Tcl الذي يحسب XOR لأمر ذي معلمتين ، مثل تمكين مصابيح LED:

        proc decent_scale_calc_xor4 {cmdtype cmdddata1 cmdddata2} {
            set xor [format %02X [expr {0x03 ^ $cmdtype ^ $cmdddata1 ^ $cmdddata2 ^ 0x00 ^ 0x00}]]
            msg "decent_scale_calc_xor4 for '$cmdtype' '$cmdddata1' '$cmdddata2' is '$xor'"
            return $xor
        }
        

      تلقي الوزن

      يعتبر تلقي بيانات الوزن حالة خاصة إلى حد ما ، حيث يتم إرسال الوزن على هيئة عدد صحيح قصير من الجرام بوزن * ١٠:

      يرسل البرنامج الثابت v1.0 و v1.1 الوزن كرسالة ٧ بايت

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      موديل
      03 = ديسنت
      نوع
      CE = وزن مستقر
      CA = تغيير الوزن
      البيانات (١)
      الوزن بالجرام * ١٠

      بايت مرتفع من عدد صحيح قصير موقع
      البيانات (٢)
      الوزن بالجرام * ١٠

      بايت منخفض لعدد صحيح قصير موقع
      البيانات (٣)
      تغيير * ١٠

      بايت مرتفع من عدد صحيح قصير موقع
      البيانات (٤)
      تغيير * ١٠

      بايت منخفض لعدد صحيح قصير موقع
      التحقق من صحة XOR
      ٦ بايت XOR للتحقق
      يرسل البرنامج الثابت v1.2 والإصدارات الأحدث وزنًا مع طابع زمني ، كرسالة ١٠ بايت

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7BYTE 8 BYTE 9BYTE 10
      موديل
      03 = ديسنت
      نوع
      CE = وزن مستقر
      CA = تغيير الوزن
      البيانات (١)
      الوزن بالجرام * ١٠

      بايت مرتفع من عدد صحيح قصير موقع
      البيانات (٢)
      الوزن بالجرام * ١٠

      بايت منخفض لعدد صحيح قصير موقع
      البيانات (٣)
      دقائق على
      البيانات (٤)
      ثواني على (٥٩-٠ بالنظام الست عشري)
      البيانات (٥)
      Deciseconds on (0-9)
      البيانات (٦)
      لاستخدامها في المستقبل
      البيانات (٧)
      لاستخدامها في المستقبل
      التحقق من صحة XOR
      ٦ بايت XOR للتحقق
      ملاحظات:
      1. يجب أن ينظر تطبيقك في طول الرسالة المستلمة ، وأن يدعم تحليل كليهما تحتاج معظم التطبيقات فقط إلى معرفة الوزن الحالي: مجرد النظر إلى البايتين ٣ و ٤ متوافق مع جميع برامج ديسنت الثابتة بدلاً من ذلك ، يمكنك التحقق من أن إصدار البرنامج الثابت يساوي 03 أو أكبر
      2. يصل الوزن الحالي إلى عدد صحيح ذو توقيع كبير ثنائي البايت قصير على بايت البيانات 1 و 2
      3. يصل تغيير الوزن في الثانية على هيئة حرف قصير كبير الحجم بدون توقيع ثنائي البايت. ومع ذلك ، فإن هذه الميزة غير ثابتة حاليًا ولا يوصى باستخدامها. إذا كنت بحاجة إلى بيانات تغيير الوزن ، فعليك حسابها بنفسك تم إيقاف ميزة تغيير الوزن اعتبارًا من الإصدار 1.2 من البرنامج الثابت
      4. يتم إرسال بيانات الوزن بسرعة ١٠ هرتز
      5. يحاول الميزان تحديد متى يبدو الوزن مستقرًا (لا مزيد من التغيير) وتعيين زوج البايت الثاني على CE. عندما يتغير الوزن ، يكون جزء البايت الثاني هو CA. ومع ذلك ، يمكنك اختيار تجاهل ذلك وتنفيذ منطقك الخاص لتقرير متى يكون الوزن مستقرًا ، حيث لا يوجد تجانس للبيانات أو استقرار يتم إجراؤه على بيانات الوزن المبلغ عنها
      6. انظر إلى الجزء العلوي من هذه الصفحة للحصول على أمثلة للرسائل ذات ٧ و ١٠ بايت


      استقبال ضغط الأزرار

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      موديل
      03 = ديسنت
      نوع
      AA
      البيانات (١)
      01 = زر 0
      02 = زر 1
      البيانات (٢)
      01 = نقرة قصيرة
      02 = ضغطة طويلة
      البيانات (٣)البيانات (٤)التحقق من صحة XOR
      00
      ملاحظات:
      1. عندما يكون لديك اتصال بلوتوث ، فإن نقرات الأزرار ليس لها أي تأثير وظيفي على الميزان ، ويمكن برمجتها للحصول على أي وظيفة تريدها ، مسترشدة ببرمجتك
      2. في برنامج الميزان الثابت v1.1 ، لا يتم إرسال الضغط على زر O عبر بلوتوث إذا احتاج تطبيقك إلى تعديل الميزان ، فيجب أن يرسل تطبيقك أمر تصفير عبر البلوتوث

      فيما يلي أمثلة على ضغطات الأزرار من سجل تطبيق Light Blue:
        16:59:51.479 - تم الإبلاغ عن الخاصية (FFF4): 03aa0101 0000a9 (ضغطة قصيرة على زر O)
        17:35:49.591 - تم الإبلاغ عن الخاصية (FFF4): 03aa0102 0000aa (الضغط لفترة طويلة على زر O)
        17:38:16.702 - تم الإبلاغ عن الخاصية (FFF4): 03aa0201 0000aa  (ضغطة قصيرة على زر [])
        17:39:08.003 - تم الإبلاغ عن الخاصية (FFF4): 03aa0202 0000a9  (الضغط لفترة طويلة على زر [])
        
        



      إرسال أمر التصفير (إعادة الوزن إلى الصفر)

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      موديل
      03 = ديسنت
      نوع
      0F
      البيانات (١)
      زيادة عدد صحيح
      (يمكن أن يكون دائمًا 0)
      البيانات (٢)
      00
      البيانات (٣)
      00
      البيانات (٤)
      00=disable heartbeat requirement
      01=maintain heartbeat
      التحقق من صحة XOR
      محسوب
      ملاحظات:
      1. 'العدد الصحيح المتزايد' اختياري ، ويمكن أن يكون دائمًا صفرًا
      2. سينتج عن تسلسل البايت 030F000000000C دائمًا فارغًا ناجحًا
      3. تأكد من حساب XOR لـ BYTE 7 بشكل صحيح وإلا سيتم تجاهل أمر TARE
      4. The Half Decent Scale disconnects if a heartbeat of "03 0a 03 ff ff 00 0a" is not received at least every 5 seconds. If you want to disable this requirement, byte 6 should be 00. If you want to keep this requirement, byte 6 should be 01. Setting byte 6 to 01 has no negative effect on models that do not support the heartbeat feature.
      وإليك جزء من التعليمات البرمجية يوضح لك كيفية إنشاء أمر فارغ بحجم ٧ بايت:

        proc tare_counter_incr {} {
        
            if {[info exists ::decent_scale_tare_counter] != 1} {
                set ::decent_scale_tare_counter 0
            } elseif {$::decent_scale_tare_counter >= 255} {
                set ::decent_scale_tare_counter 0
            } else {
                incr ::decent_scale_tare_counter
            }
        
            # alternatively: the tare counter can in fact be any not-recently-used integer, such as this random digit-picker
            # set ::decent_scale_tare_counter [expr {int(rand() * 255)}]
        
        }
        
        proc decent_scale_tare_cmd {} {
            tare_counter_incr
            set cmd [decent_scale_make_command "0F" [format %02X $::decent_scale_tare_counter]]
            return $cmd
        }
        


      ميزان ديسنت سيرسل إجابة مرة أخرى بعد أمر التصفير هذه الإجابة لها هذا الهيكل:

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      موديل
      03 = ديسنت
      نوع
      0F
      البيانات (١)
      تصفير العدّاد
      البيانات (٢)
      00
      البيانات (٣)
      00
      البيانات (٤)
      FE
      التحقق من صحة XOR


      إرسال أوامر لتشغيل أو إيقاف تشغيل مصابيح LED

      BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
      موديل
      03 = ديسنت
      نوع
      0A
      البيانات (١)
      تشغيل/إيقاف LED الوزن
      00 = إيقاف
      01 = تشغيل
      02 = إيقاف التشغيل
      البيانات (٢)
      تشغيل/إيقاف LED المؤقت
      00 = إيقاف
      01 = تشغيل
      البيانات (٣)
      00 = جرام
      01 = أوقية
      البيانات (٤)
      00
      التحقق من صحة XOR
      محسوب
      ملاحظات:
      1. يتم إطالة عمر البطارية عن طريق إيقاف تشغيل مصابيح LED
      2. سيستمر الميزان في العمل ، حتى مع إيقاف تشغيل كل من مصابيح LED
      3. تمت إضافة أمر إيقاف التشغيل في البرنامج الثابت v1.2
      4. سيضيء مؤشر LED الفردي الذي يظهر 'الوزن يتغير' ، حتى إذا تم إيقاف تشغيل كلا المصباحين
        1. اعتبارًا من البرنامج الثابت v1.1 ، لم يعد مؤشر LED الموجود فوق الزر المربع يضيء أثناء تغيير الوزن
        2. بدلاً من ذلك ، يضيء مؤشر LED هذا عند الضغط على أي من الأزرار
        3. هذا لتقديم ملاحظات مرئية للمستخدم ، بحيث تم استشعار الضغط على الزر
        مثال: جميع مؤشرات LED On Command ، باستخدام الجرامات:
          03 0A 01 01 00 00 09
          
        مثال: كل مؤشرات LED On Command ، باستخدام أوقية: [يتطلب برنامج ثابت v1.1
          03 0A 01 01 01 00 08
          
        مثال: كل أوامر LED Off:
          03 0A 00 00 00 00 09
          
        مثال: أمر إيقاف التشغيل:
          03 0A 02 00 00 00 0B
          
        سيرسل ميزان ديسنت إجابة بعد أمر تشغيل / إيقاف LED (البرنامج الثابت v1.1) ، في موجز بيانات الوزن ، مع معلومات الجرام مقابل أوقية ، ومستوى طاقة البطارية وإصدار البرنامج الثابت لديها هذا الهيكل:

        BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
        موديل
        03 = ديسنت
        نوع
        0A
        البيانات (١)
        00
        البيانات (٢)
        وحدات الوزن على LED
        00 = جرام
        01 = أوقية
        البيانات (٣)
        مستوى البطارية
        بين ٣٪ (منخفض) ١٠٠٪ (ممتلئ)
        FF (٢٥٥) = يعمل بواسطة USB
        البيانات (٤)
        نسخة برنامج ثابت
        FE = v1.0
        02 = v1.1
        03 = الإصدار 1.2
        التحقق من صحة XOR
        The battery level is always reported at 100%, due to a limitation in the scale's PCB.
        فيما يلي مثال على قراءة مستوى البطارية من سجل تطبيق Light Blue:
          16:02:36.005 - كتبت الخاصية (36F5) قيمة جديدة <030a0101 000009> (استخدمنا التطبيق لإرسال هذه القيمة وتشغيل مؤشر LED)
          16:02:36.061 - قراءة الخاصية (36F5): (خالية)
          16:02:36.135 - تم الإبلاغ عن الخاصية (FFF4): 030a0000 64026f (64 hex = 100%, تعمل على البطاريات
          
          15:59:50.421 - كتبت الخاصية (36F5) قيمة جديدة <030a0101 000009> (استخدمنا التطبيق لإرسال هذه القيمة وتشغيل مؤشر LED)
          15:59:50.485 - قراءة الخاصية (36F5): (خالية)
          15:59:50.522 - تم الإبلاغ عن الخاصية (FFF4): 030a0000ff0ac7  (FF hex = ٢٥٥٪ ، يعمل بطاقة USB)
          


        إرسال أوامر للتحكم في المؤقت

        BYTE 1BYTE 2BYTE 3BYTE 4BYTE 5BYTE 6BYTE 7
        موديل
        03 = ديسنت
        نوع
        0B
        البيانات (١)
        بدء / إيقاف / إعادة تشغيل الموقت
        00 = توقف
        02 = إعادة التعيين إلى الصفر
        03 = ابدأ
        البيانات (٢)
        00
        البيانات (٣)
        00
        البيانات (٤)
        00
        التحقق من صحة XOR
        محسوب
        مثال: أمر بدء المؤقت
          03 0B 03 00 00 00 0B
          
        مثال: أمر إيقاف المؤقت
          03 0B 00 00 00 00 08
          
        مثال: أمر إعادة بدء المؤقت
          03 0B 02 00 00 00 0A
          

        رمز عينة كبير لتلقي البيانات المختلفة من ميزان ديسنت

        مثال أكبر على bluetooth.tcl على Github

        يمكن لجزء التعليمات البرمجية التالي (بلغة Tcl ، ولكن نأمل أن تتمكن من فهمه):
        1. تلقي معلومات الوزن
        2. تلقي الضغط على زر
        3. تلقي قيمة المؤقت الحالي
        set ::de1(cuuid_decentscale_read) "0000FFF4-0000-1000-8000-00805F9B34FB"
        set ::de1(cuuid_decentscale_write) "000036F5-0000-1000-8000-00805F9B34FB"
        set ::de1(cuuid_decentscale_writeback) "83CDC3D4-3BA2-13FC-CC5E-106C351A9352" 
        
        if {$cuuid eq $::de1(cuuid_decentscale_read)} {
            # decent scale
            parse_decent_scale_recv $value weightarray
        
            if {[ifexists weightarray(command)] == [expr 0x0F] && [ifexists weightarray(data6)] == [expr 0xFE]} {
                # tare cmd success is a msg back to us with the tare in 'command', and a byte6 of 0xFE
                msg "- decent scale: tare confirmed"
        
                return
            } elseif {[ifexists weightarray(command)] == 0xAA} {
                msg "Decentscale BUTTON $weightarray(data3) pressed"
                if {[ifexists $weightarray(data3)] == 1} {
                    # button 1 "O" pressed
                    decentscale_tare
                } elseif {[ifexists $weightarray(data3)] == 2} {
                    # button 2 "[]" pressed
                }
            } elseif {[ifexists weightarray(command)] != ""} {
                msg "scale command received: [array get weightarray]"
        
            }
        
            if {[info exists weightarray(weight)] == 1} {
                set sensorweight [expr {$weightarray(weight) / 10.0}]
                #msg "decent scale: ${sensorweight}g [array get weightarray] '[convert_string_to_hex $value]'"
                #msg "decentscale recv read: '[convert_string_to_hex $value]'"
                ::device::scale::process_weight_update $sensorweight $event_time
            } else {
                msg "decent scale recv: [array get weightarray]"
            }
        }
        
        proc parse_decent_scale_recv {packed destarrname} {
            upvar $destarrname recv
            unset -nocomplain recv
        
               ::fields::unpack $packed [decent_scale_generic_read_spec] recv bigeendian
        
               if {$recv(command) == 0xCE || $recv(command) == 0xCA} {
                   unset -nocomplain recv
                   ::fields::unpack $packed [decent_scale_weight_read_spec2] recv bigeendian
               } elseif {$recv(command) == 0xAA} {
                   msg "Decentscale BUTTON pressed: [array get recv]"
               } elseif {$recv(command) == 0x0C} {
                   unset -nocomplain recv
                   ::fields::unpack $packed [decent_scale_timing_read_spec] recv bigeendian
                   msg "Decentscale time received: [array get recv]"
               }
        }
        
        proc decent_scale_generic_read_spec {} {
            set spec {
                model {char {} {} {unsigned} {}}
                command {char {} {} {unsigned} {}}
                data3 {char {} {} {unsigned} {}}
                data4 {char {} {} {unsigned} {}}
                data5 {char {} {} {unsigned} {}}
                data6 {char {} {} {unsigned} {}}
                xor {char {} {} {unsigned} {}}
            }
            return $spec
        }
        
        proc decent_scale_weight_read_spec2 {} {
            set spec {
                model {char {} {} {unsigned} {}}
                wtype {char {} {} {unsigned} {}}
                weight {Short {} {} {signed} {}}
                rate {Short {} {} {unsigned} {}}
                xor {char {} {} {unsigned} {}}
            }
            return $spec
        }