OpenMV MicroPython OpenMV MicroPython OpenMV MicroPython
  • الرئيسية
  • البرنامج التعليمي
  • المكتبات الأساسية
  • اللوحات
  • الدروع
  • المستشعرات
  • اللغة
  • CPython
  • الداخلية
  • سجل التغييرات
  • الرخصة
/
  • English
  • العربية
  • 简体中文
  • 繁體中文
  • Hrvatski
  • Čeština
  • Nederlands
  • Suomi
  • Français
  • Deutsch
  • עברית
  • Magyar
  • Italiano
  • 日本語
  • 한국어
  • Polski
  • Português
  • Română
  • Русский
  • Español
  • Svenska
  • Türkçe
  • نقاش
  • البرنامج التعليمي
    • 1. البدء السريع
    • 2. نظرة عامة على Python
    • 3. التحكم في العتاد
    • 4. مستشعرات الرؤية
    • 5. معالجة الصور
    • 6. NumPy
    • 7. التعلّم الآلي
    • 8. Asyncio
    • 9. الشبكات
      • 9.1. لماذا الشبكات
      • 9.2. البروتوكولات الطبقية
      • 9.3. الكابل والإطار
      • 9.4. إقامة الوصلة
      • 9.5. عناوين IP
      • 9.6. الحزم والتوجيه
      • 9.7. الشبكات الخاصة وترجمة عناوين الشبكة (NAT)
      • 9.8. المنافذ
      • 9.9. UDP -- أرسل حزمة وتمنّ الأفضل
      • 9.10. TCP -- تدفق موثوق للبايتات
      • 9.11. كائنات المقابس
      • 9.12. مقابس UDP
      • 9.13. مقابس TCP
      • 9.14. المقابس مع asyncio
      • 9.15. الأسماء وDNS
      • 9.16. الوقت وبروتوكول NTP
      • 9.17. المقابس المشفّرة وبروتوكول TLS
      • 9.18. MQTT، بايتًا تلو الآخر
      • 9.19. MQTT في Python
      • 9.20. خلاصة
    • 10. خوادم الويب
    • 11. Bluetooth
    • 12. بروتوكول المضيف
    • 13. الأدوات
    • 14. الإنتاج
  • المكتبات
  • اللوحات
  • الدروع (Shields)
  • المستشعرات
  • اللغة
  • CPython
  • الأجزاء الداخلية
  • سجل التغييرات
  • الترخيص

في هذه الصفحة

  • 9.4.1. وحدة network
  • 9.4.2. تدفّق Wi-Fi
  • 9.4.3. ما الذي قد يحدث من خلل
  • 9.4.4. البقاء متصلًا
  • 9.4.5. Ethernet، حين تكون متوفرة
micropython-doc 0 0
تعديل هذه الصفحة
  1. OpenMV MicroPython /
  2. دليل تعليمي لـ OpenMV Cam /
  3. 9. الشبكات /
  4. 9.4. إقامة الوصلة
عرض المصدر فتح في ChatGPT فتح في Claude فتح في Perplexity

9.4. إقامة الوصلة¶

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

9.4.1. وحدة network¶

تكشف وحدة network عتاد الشبكات في الكاميرا لـ Python. وتعتمد المجموعة الدقيقة من الواجهات على اللوحة: فكثير من الكاميرات لديها شريحة لاسلكية وتكشف فئة WLAN (المسماة نسبةً إلى الشبكة المحلية اللاسلكية)؛ وبعض اللوحات لديها أيضًا منفذ Ethernet مدمج وتكشف فئة LAN (المسماة نسبةً إلى الشبكة المحلية، أي النسخة السلكية). ونمط الاستخدام واحد لكليهما، مع فارق مهم واحد: يجب إخبار الواجهة اللاسلكية بأي شبكة تنضم إليها، بينما تلتقط شبكة Ethernet ما هو موجود على الكابل أيًّا كان.

9.4.2. تدفّق Wi-Fi¶

الانضمام إلى شبكة Wi-Fi ثلاث خطوات: بناء الواجهة، وإقامتها، وطلب الاتصال بشبكة مسمّاة بكلمة مرور. تتفاوض الواجهة مع نقطة الوصول في الخلفية؛ ويبلّغ استدعاء isconnected() عن اكتمال إقامة الوصلة:

import network
import time

wlan = network.WLAN(network.WLAN.IF_STA)
wlan.active(True)
wlan.connect("my-network", "my-password")

while not wlan.isconnected():
    time.sleep_ms(100)

print("link up")

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

بمجرد أن يعيد isconnected() القيمة True، تكون الكاميرا على الشبكة. وكل ما احتاجته الطبقات الأعلى لتهيئة نفسها قد حدث تلقائيًا أثناء إقامة الوصلة؛ وتفصّل الصفحات التالية تلك الأجزاء واحدًا تلو الآخر.

9.4.3. ما الذي قد يحدث من خلل¶

تظهر بضع حالات فشل عملية عند هذه الخطوة.

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

    start = time.ticks_ms()
    while not wlan.isconnected():
        if time.ticks_diff(time.ticks_ms(), start) > 10000:
            raise OSError("Wi-Fi did not come up in 10 s")
        time.sleep_ms(100)
    
  • خارج النطاق. يجب أن تكون الكاميرا ونقطة الوصول قريبتين بما يكفي ليكون الإشارة قوية بدرجة تحافظ على الوصلة. يعيد status() رمزًا يشير إلى سبب عدم إقامة الوصلة؛ ويعيد scan() قائمة الشبكات التي يستطيع الراديو رؤيتها، وهي التشخيص الذي يُجرى عندما لا ينجح connect.

  • نقطة الوصول تطلب أكثر من كلمة مرور. الشبكات المفتوحة (بلا كلمة مرور) والشبكات المحمية بكلمة مرور الشائعة مشمولة بـ connect كما هو موضح أعلاه. وأحيانًا تستخدم الشبكات الأكبر في أماكن العمل والمدارس مخططًا مختلفًا حيث يتعين على الكاميرا المصادقة في مقابل خادم تسجيل دخول منفصل؛ وتلك تحتاج إلى وسائط إضافية لـ connect. راجع class WLAN -- التحكم في واجهات WiFi المدمجة للاطلاع على السطح الكامل.

9.4.4. البقاء متصلًا¶

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

نمط الكشف هو استدعاء isconnected() مرة في كل تكرار للحلقة الرئيسية والتفاعل عندما يعيد False. وقد يكذب isconnected() لوهلة عندما يكون اتصال قد انقطع دون أن يلاحظ الراديو ذلك بعد -- وفشل إرسال عبر مقبس بينما "ينبغي" أن تكون الوصلة قائمة هو دليل التطبيق الآخر على الانقطاع. ويُعد status() المصدر الأكثر موثوقية عند اختلاف الاثنين.

نمط إعادة الاتصال هو disconnect() متبوعًا بـ connect() بنفس بيانات الاعتماد، مع لفّ الانتظار بمهلة زمنية كما في الاتصال الأولي. وتراجع بين المحاولات -- ثانية واحدة، ثم ثانيتان، ثم أربع، مضاعفًا حتى دقيقة أو نحوها -- حتى لا يُرهق انقطاعٌ طويل نقطةَ الوصول ولا يستنزف ميزانية طاقة الراديو على حلقات دوران فارغة:

import network
import time

_BACKOFF_S = (1, 2, 4, 8, 16, 32, 60)

def reconnect(wlan, ssid, password):
    for delay in _BACKOFF_S:
        wlan.disconnect()
        wlan.connect(ssid, password)
        deadline = time.ticks_add(time.ticks_ms(), 10_000)
        while not wlan.isconnected():
            if time.ticks_diff(deadline, time.ticks_ms()) < 0:
                break
            time.sleep_ms(100)
        if wlan.isconnected():
            return True
        time.sleep(delay)
    return False

عندما تستمر تلك الدالة المساعِدة في إعادة False، فقد يكون برنامج الراديو الثابت نفسه عالقًا. والملاذ الأخير هو إعادة تدوير طاقة الراديو: active(False)، ثم توقف قصير، ثم active(True)، ثم إعادة الاتصال من الصفر. يعيد هذا برنامج الراديو الثابت إلى حالة معروفة على حساب بضع ثوانٍ إضافية من التعطل:

def radio_power_cycle(wlan, ssid, password):
    wlan.active(False)
    time.sleep(1)
    wlan.active(True)
    return reconnect(wlan, ssid, password)

الكاميرا التي ظلت خارج الشبكة لدقائق هي فشل حقيقي يجب أن يراه التطبيق. وينبغي لكود التعافي أن يُظهر تلك الحالة -- بوضع علامة على الشبكة بأنها غير سليمة في راية تفحصها الحلقة الرئيسية، والسماح للتطبيق بتخطّي عمليات الإرسال عبر الشبكة التي كان سيقوم بها بينما الراية غير مرفوعة -- حتى لا يوقف انقطاعٌ طويل التطبيقَ منتظرًا مقابس لن تكتب أبدًا.

9.4.5. Ethernet، حين تكون متوفرة¶

اللوحات ذات Ethernet المدمجة تكشف النمط نفسه دون خطوة connect. تُقام واجهة LAN باستخدام active()، وبمجرد توصيل الكابل تصبح الواجهة جاهزة للاستخدام:

import network

lan = network.LAN()
lan.active(True)
print("link up")

بعد هذه النقطة، تنطبق بقية صفحات هذا القسم بالطريقة نفسها بغض النظر عن أي واجهة أدخلت الكاميرا إلى الشبكة. فالطبقات الأعلى لا تهتم بما إذا كانت الوصلة أسفلها هي Wi-Fi أو Ethernet -- فـ"متصل" هو "متصل".

للاطلاع على المرجع الكامل لـ WLAN وLAN، بما في ذلك مفاتيح التهيئة التي لم تتسع لها هذه الصفحة، راجع network --- تهيئة الشبكة.

السابق
9.3. الكابل والإطار
التالي
9.5. عناوين IP

لإصدار OpenMV v5.0.0 · مبني على MicroPython v1.28 · التوثيق بُنيت 18 يونيو 2026 · حقوق النشر © 2014-2026 لـ OpenMV، Damien P. George، وآخرين.

مصنوع بـ Sphinx باستخدام Shibuya theme.