لا يمكن لحام Xiaomi Gateway 2



مرحباً هبر! في السلسلة السابقة ، قمت بما يلي:

  • اشتريت أجهزة من Xiaomi لمنزل ذكي ، ومن خلال مكواة لحام ، جعلتها تعمل بطريقة مثيرة بدون خوادم محلية عبر مساعد المنزل ( رابط للنشر )
  • لقد قمت بلف واجهة الويب من المساعد المنزلي في الإلكترون ( رابط إلى المنشور) مع دعم الإخطارات والقوائم ونقاط البيانات وما إلى ذلك ( الرمز هنا )

ولكن مع ظهور المزيد والمزيد من الأجهزة ، بدأ شيء غريب في الانفتاح ...

على سبيل المثال ، أن Aqara Wireless Relay 2ch (LLKZMK11LM) لم يدعم تكامل xiaomi_aqara ، وعندما تم فتح المشكلات على GitHub ، رد أصحاب الرمز أنه من المستحيل دعم هذا الترحيل دون تحديث البرامج الثابتة للجهاز. فكرت ، "هناك خطأ ما هنا" ، وذهبت لفرز الشفرة ، كيف حدث ذلك. ولذا فقد ابتعدت بأنني قمت بإزالة التكامل أولاً للعمل مع التتابع عبر xiaomi_miio ( link ) ، ثم قمت بتطبيق دعم المكعب وزر Xiaomi لهذا التكامل ( link ) ، والآن سأخبرك لماذا وكيف.

واجهة برمجة تطبيقات المطور


ذات مرة ، كانت Xiaomi التي تطلق بوابة (lumi.gateway.v3) مجهزة بواجهة برمجة تطبيقات المطور الخاصة بها وحتى الوثائق الخاصة بها. واجهة برمجة تطبيقات المطور هي الشيء الذي يتصل عبر UDP على المنافذ 4321 و 9898. لقد أحب المجتمع حقًا هذه الخطوة واستجاب بمجموعة من المستودعات التي تدمج الجهاز في كل ما هو ممكن. العمل مع هذا المطور API شكل الأساس لتكامل المساعد xiaomi_aqara ( الرابط ) وكل شيء كان رائعا حتى الآن ...

في حين أن XIAOMI لم تتجاوز ، ولم تبرز دعم واجهة برمجة تطبيقات المطور ، توقفت معرفات الأجهزة الجديدة عن الظهور فيها. التتابع المطلوب موجود في قائمة الأجهزة المتصلة عبر بوابة zigbee ، ولكن هناك يظهر التتابع بمعرف نموذج فارغ ، والذي بدونه يكون من المستحيل القيام بأي شيء. ثم ، في الآونة الأخيرة ، طرح Xiaomi تحديثًا للبرامج الثابتة للبوابة بعد التثبيت والذي كان من المستحيل تشغيل واجهة برمجة تطبيقات المطور بدون مكواة لحام (إذا لم يتم تشغيله قبل التحديث) ، فقم بالربط .

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

المزيد من بروتوكول MIIO الأصلي


Miio هو بروتوكول أحدث للعمل مع أجهزة Xiaomi المتصلة بالشبكة عبر wi-fi. يتواصل تطبيق Mi Home الأصلي عبر هذا البروتوكول مع مآخذ wi-fi ، ومع IR Remote ، والمكانس الكهربائية ، ومع أي شخص آخر ، وحتى مع بوابة xiaomi v2. هذا أيضًا بروتوكول UDP ، ولكن هذه المرة ليس المنفذ 4321 هو المعني ، ولكن المنفذ 54321 (أعتبر طريقة رائعة لاختيار المنافذ). فكرت في "Goofy": "لذا فهي تعرف أيضًا بروتوكولًا آخر ، ولكن هل يجب أن أحاول توصيل التتابع باستخدام هذا البروتوكول الجديد؟"

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

الطريقة هي:

  • نحصل على أجهزة رمز الأمان من خلال استخلاصها من السجلات ( الرابط ) أو من التطبيق المعدل ( الرابط )
  • نقوم بإزالة حركة المرور بين تطبيق الهاتف والجهاز
  • نقوم بفك تشفير حزم UDP مع رمز الأمان الذي تم تلقيه في البداية
  • كود التعلم لإنشاء حزم مماثلة

أخذت حركة المرور مباشرة من جهاز توجيه wi-fi الخاص بي ، ولحسن الحظ هناك برنامج ثابت مخصص لـ asuswrt-merlin ، حيث يمكن تثبيت tcpdump باستخدام Entware. الأداة على ما يرام ، لكنها لا تفهم المقالب من tcpdump ، لكنها تفهم تفريغ json الذي تم إنشاؤه بواسطة Wireshark. لتجاوز التفريغ الثنائي من tcpdump إلى json ، استخدمت الأداة المساعدة tshark. بعد ذلك رأيت الأوامر التي تتحكم في تطبيق mi home للتحكم في التتابع. لقد أنشأت PR مع إضافة دعم التتابع ( link ).

لقد ألغيت طلب ConBee2 ، لأن طريقة البرنامج أسرع وأكثر متعة ...

لماذا نحتاج إلى حداد؟


وهذا يعني أنني ، مع اندفاع عاري ، أجد نفسي في وضع يبدو فيه كل شيء يعمل ، ولكن الآن في مساعد المنزل الخاص بي يتم تمثيل My Xiamo Gateway 2 من قبل كيانين ، أحدهما يستخدم بروتوكول api للمطورين (تكامل xiaomi_aqara) والآخر بواسطة miio ثقب (تكامل xiaomi_miio ) . وأنا لا أحب اللحيم ، أردت أن أبسط حياتي ونفسي. كان من الضروري تنفيذ الجزء المفقود من الأجهزة في xiaomi_miio.

بالنسبة للجزء الأكبر ، بعد إنشاء الربط البرمجي ، هذه مهمة ميكانيكية:

  1. تمكين tcpdump
  2. إنشاء إجراء أتمتة في تطبيق Mi Home الذي أريد تتبعه
  3. بدأ هذه الأتمتة
  4. فك تشفير التفريغ
  5. نسخ ولصق من فك التشفير إلى التعليمات البرمجية
  6. إرسال أوامر من وحدة التحكم
  7. ملف الانتهاء للتألق

ولكن حكة اليدين ، ومكالمات المغامرة ...

جهاز miio وهمية


أظهر تشريح الجثة أنه لا توجد آلية رد في بروتوكول miio. يمكن سحب المستشعرات مرة واحدة كل 20 ثانية ، ولكن بالنسبة للتشغيل الصحيح للأزرار والمكعبات ، كان من الخطأ استجواب الجهاز 10 مرات في الثانية. في هذا المفارقة ، رأيت نشاطًا مثيرًا للاهتمام ، لكنني لم أرغب حقًا في التعامل مع التشفير الميكانيكي للحزم الملتقطة.

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

تسلحت مرة أخرى باستخدام tcpdump ، وبعد تعديل وحدة فك الترميز باستخدام وظيفة فك التشفير من جميع الأجهزة في تشغيل واحد ، بدأت في الاستماع إلى كل ما يطير عبر الشبكة إلى منفذ UDP 54321. وأرى صورة مثيرة للاهتمام إلى حد ما. عندما أقوم بإنشاء أتمتة مثل "إذا قمت بتشغيل مكعب زيجبي ، قم بتشغيل مقبس wi-fi" ، يتم إرسال json من التطبيق إلى البوابة باستخدام بروتوكول miio داخل حقل البيانات الذي يتم ترميز json في سلسلة ؛ "DSL" - يعتقد Stirlitz ، لسبب ما ، منذ زمن سحيق ، أن الجميع يحزمون بهذه الطريقة ... التفاصيل هنا .

أظهر عرض محتويات هذا السطر أن رد الفعل على الإجراء لا ينتقل في مكان ما إلى السحب ، ظهر مباشرة في برنامج json هذا عنوان IP ورمز التشفير لمقبس wi-fi (هذه الفقرة تتعارض مع الفقرة من السلسلة الأولى ، كنت مخطئًا هناك ؛ (بوابة يتواصل مع الأجهزة الصديقة بنفسه - بدون مساعدة من السحب.) نعم ، والسيناريو نفسه يشبه الأتمتة من مساعد المنزل ، وهناك معلمات الزناد ، وهناك IP حيث يرسل رد فعل. أي أنه لا يمكن العثور على بروتوكول حانة / فرعي في مقالب.

ولكن الفكرة ولدت من كل شيء لالتقاط جميع الأحداث اللازمة من الأزرار والمكعبات:

  1. نقوم بمحاكاة جهاز miio في التطبيق ، ونستجيب لتطبيقات PING وطلبات البوابة
  2. نكتب مولدًا نصيًا للبوابة لإنشاء واحد لكل زوج ~ (الجهاز ، الحدث)
  3. نرسل نصوصًا برمجية حتى عندما يحدث حدث ، يأتي طلب miio إلى المحاكي

استغرق الأمر يومين لإدراك ذلك وإحضاره إلى شكل إلهي.

في الوقت الحالي ، يمكن لمكتبة python-miio أن تعمل مع المرحلات ومع المكعب وزر الارتباط .

يبقى إرفاق هذا التحديث بالمساعد المنزلي وسيكون من الممكن العمل مع Xiaomi gateway 2 بدون لحام ومطور api.

إذا كان أي شخص جاهزًا للاختبار على أجهزته و / أو إضافة دعم للأجهزة الجديدة - انضم :)

ما زال البيع هو المكنسة الكهربائية الرائعة Xiaomi 1C هنا ومثل هذا القصور ( الرابط ) لدمجها في مساعد المنزل. أعتقد أن تأخذ ... هل تحتاج إليها؟

All Articles