Arduino-esp32: لا تزال إعادة الاتصال التلقائي بشبكة WiFi لا تعمل - هل توجد أفضل الممارسات لضمان الاتصال؟

تم إنشاؤها على ٢١ سبتمبر ٢٠١٧  ·  150تعليقات  ·  مصدر: espressif/arduino-esp32

اللوحة: ModeMCU ESP32 Dev Module
تاريخ التثبيت / التحديث الأساسي: 15 / سبتمبر / 2017
اسم IDE: Arduino IDE

يبدو أنه لا يوجد منطق لإعادة الاتصال التلقائي يسمح لـ ESP32 بإعادة الاتصال عند انقطاع الاتصال أو إذا كان لا يعمل بشكل صحيح. لقد حصلت على نتائج عشوائية تمامًا مع لوحة ESP32 الخاصة بي ، وأحيانًا تصل إلى 30 دقيقة وعلى الأكثر من 18 إلى 20 ساعة. شبكة WiFi تنخفض ولا تريد إعادة الاتصال.

تراقب المكتبة التي أستخدمها لشبكة WiFi حدث WiFi وعند انقطاع الاتصال تحاول إعادة الاتصال مما يساعد ولكن في بعض الأحيان يفشل في إعادة الاتصال ثم هذا كل شيء ... لا بد لي من إعادة التشغيل. لا يوجد وضع سكون / طاقة منخفضة على الإطلاق ويتم تشغيل الجهاز باستمرار بواسطة 3.3 فولت. تم فتح علبة بخصوص هذا ، https://github.com/espressif/arduino-esp32/issues/353 ، ولكن مغلق بدون أي إجابة حقيقية (يقول الاتصال التلقائي هو نوع من التنفيذ ... لست متأكدًا مما يعنيه ذلك).

أعتقد أن السؤال هو هل تم تنفيذ إعادة الاتصال التلقائي في الكود نفسه ، بشكل موثوق ، وإذا لم يكن الأمر كذلك ، فما هي أفضل طريقة لكود Arduino للتأكد من توصيلها؟

-الان

bug

التعليق الأكثر فائدة

تحديث؛ أرى الكثير من WiFiEvent المستخدم ولتصحيح أخطائه الجيدة ولكن ببساطة لاكتشاف wifi لأسفل وإعادة توصيل IF / ELSE أدناه يعمل بشكل موثوق في كل مرة.

يعمل هذا لأنه يستغرق حوالي 18 ثانية من الأسفل إلى الإبلاغ عن تغيير WL_CONNECTED ، وهذا يمنح خادم DHCP الوقت لتحرير IP من أجل إعادة اتصال موثوقة لاحقًا.

لقد كانت تعمل لأكثر من 6 سنوات وما زالت مستمرة.

loop()
{
  if ( WiFi.status() ==  WL_CONNECTED ) 
  {
    // WiFi is UP,  do what ever
  } else
  {
    // wifi down, reconnect here
   WiFi.begin(  );
    int WLcount = 0;
    while (WiFi.status() != WL_CONNECTED && WLcount < 200 ) 
    {
      delay( 100 );
         Serial.printf(".");
         if (UpCount >= 60)  // just keep terminal from scrolling sideways
         {
            UpCount = 0;
               Serial.printf("\n");
         }
         ++UpCount;
      ++WLcount;
    }
  }
} // END loop()

ألق نظرة على كود الهيكل العظمي الذي نشرته على https://github.com/espressif/arduino-esp32/issues/1100

على الرغم من أنه كان من أجل الإعداد مع SmartConfig إلا أنه يعمل فقط.

ال 150 كومينتر

هل يمكنك تمكين التصحيح في قائمة اللوحة ومعرفة سبب عدم رغبتها في إعادة الاتصال عندما تطلب منها القيام بذلك؟

يمكنني تجربة ذلك الليلة. يعد كود Arduino أساسيًا جدًا ، حيث يشاهد حدث WiFi ثم يحتوي على هذا:

case SYSTEM_EVENT_STA_DISCONNECTED:
    Serial.println("WiFi lost connection.  Attempting to reconnect...");
    WiFi.reconnect();
    break;

لكن ألا ينبغي أن يكون هناك شيء يمكن استدعاؤه لتحقيق ذلك بمفرده؟

فقط من أجل حل سريع:
ابدأ مؤقتًا في SYSTEM_EVENT_STA_DISCONNECTED الذي يستدعي WiFi.reconnect () ؛ وظيفة وإيقافها في SYSTEM_EVENT_STA_CONNECTED. تكمن المشكلة الرئيسية في فكرتك في أنه إذا كان الجهاز غير قادر على الاتصال ، لم يتم استدعاء حدث SYSTEM_EVENT_STA_DISCONNECTED ، لذلك لا تحاول إعادة الاتصال مرة أخرى.

لسوء الحظ ، أقوم بتعديل مكتبة شخص آخر ولست على دراية كبيرة بـ C ++ لكنني سأرى ما يمكنني فعله بشأن إضافة مؤقت (أعرف VB.net ... يمكنني على الأقل معرفة الأجزاء المنطقية وآمل تأقلم).

لكنني أعتقد أنك محق في عدم إعادة الاتصال أو الأفضل من ذلك ، ولكن محاولة قطع الاتصال فقط إذا فشلت بمجرد أن تستسلم. قد يُظهر لي تمكين التصحيح ذلك لذا سأبدأ من هناك.

لكن بالعودة إلى السؤال الأصلي والمسألة المغلقة سابقًا: هل هذه الوظيفة ليست مضمنة؟ وإذا لم يكن الأمر كذلك ، فلماذا تم إغلاق الإصدار السابق باعتباره "نوعًا من العمل"؟ أيضا إن لم يكن سيكون؟

لقد غيرت مستوى التصحيح لتصحيح الأخطاء وفتحت الشاشة التسلسلية وحصلت على هذا مرارًا وتكرارًا:

[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...

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

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

يرجى يا رفاق تمكين التصحيح حتى تتمكن من رؤية المزيد من إخراج حالة WiFi المطول:
screen shot 2017-09-22 at 13 48 16

أستخدم الكود التالي للتحقق مما إذا كان جهازي لا يزال متصلاً بـ STA (استدعاء هذا من حلقة ()). انت وجدت الفكرة؟ wifi_is_connected هو عالمي يتم تعيينه وإعادة تعيينه في رد اتصال حدث wifi.

static void poll_watchdog_sta(void) {
  static uint32_t ms = millis();
  static uint8_t watchdog = 0;

  // watch out for STA disconnects and reboot if
  // connection cannot be reestablished after
  // X minutes

  // this watchdog MUST NOT reboot the device if
  // wifi is not enabled or never was connected
  // since last reboot

  if (wifi_is_enabled && watchdog_enabled && ((millis() - ms) > 1000 * 6)) {
    ms = millis();

    if (!wifi_is_connected) {
      if (++watchdog < watchdog_timeout * 10) { // timeout in minutes ( * 10 )
        if (watchdog == 1) {
          log_print(F("WIFI: arming network watchdog (reboot in %i min.)"),
            watchdog_timeout
          );
        }
      } else {
        log_print(F("WIFI: still not connected, triggering reboot ..."));
        system_reboot();
      }
    } else {
      if (watchdog) {
        log_print(F("WIFI: network is back, disarming watchdog"));
        watchdog = 0;
      }
    }
  }
}

نعم ، لا أرى حلقة () في المكتبة التي أستخدمها لشبكة WiFi (مرة أخرى ، طرف ثالث) لكنني أفهم ما تفعله ويمكنني العمل به.

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

أيضًا أحداث WiFi التي يتم التحقق منها والعمل عليها هي SYSTEM_EVENT_STA_GOT_IP و SYSTEM_EVENT_STA_DISCONNECTED و SYSTEM_EVENT_STA_START و SYSTEM_EVENT_STA_CONNECTED. ومع ذلك ، هناك المزيد على https://github.com/espressif/esp-idf/blob/master/components/esp32/include/esp_event.h لذلك أضفت افتراضيًا: إلى المفتاح الذي يجب أن يطبع الحدث لمعرفة ما إذا المكتبة تحصل على شيء ما ولكنها لا تعمل على أساسه.

رأيت في المكتبة أنني أستخدم //WiFi.setAutoReconnect(true) ؛ لذلك أفترض أن المؤلف الأصلي حاول استخدام إعادة الاتصال التلقائي لكنه لم يكن يعمل ، لذا علق عليه؟

@ me-no-dev - قدم الإسهاب تفسيرا أفضل بكثير. حسنًا ... ربما لك:

كان كل شيء على ما يرام ثم حدث ذلك مرارًا وتكرارًا ، ربما 150 مرة:

[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113

يليه هذا:

[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 7 - NOT_ASSOCED
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 202 - ASSOC_FAIL
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5

الجزء الأخير (إعادة الاتصال ، الحدث 5 ، السبب 2) يتكرر كل 4-5 ثوانٍ.

بناءً على هذا الخطأ الأول الذي يتكرر مرارًا وتكرارًا ، وجدت هذا: https://github.com/espressif/arduino-esp32/issues/180. قلت فيها "حاول مسح العميل أو قراءة جميع البيانات المتاحة.". كيف سأفعل ذلك؟ أنا أنظر إلى المكتبة التي أستخدمها وهذا ما يجب عليهم اللحاق بحدث WiFi:

//**************************************************************************************
/// Event Handler for ESP32 WiFi Events (needed to implement reconnect logic for now...)
//**************************************************************************************
    void MyESP32WiFi::WiFiEvent(WiFiEvent_t event)
    {
        Serial.printf("[WiFi-event] event: %d\n", event);

        switch (event) {
        case SYSTEM_EVENT_STA_GOT_IP:
            Serial.println("WiFi connected");
            Serial.println("IP address: ");
            Serial.println(WiFi.localIP());
            break;
        case SYSTEM_EVENT_STA_DISCONNECTED:
            Serial.println("WiFi lost connection.  Attempting to reconnect...");
            WiFi.reconnect();
            break;
        case SYSTEM_EVENT_STA_START:
            Serial.println("ESP32 station start");
            break;
        case SYSTEM_EVENT_STA_CONNECTED:
            Serial.println("ESP32 station connected to AP");
            break;
        default:            
            Serial.println("Unhandled WiFi Event raised.");
            break;
        }

    }

بناءً على الأخطاء الواردة في المنشور السابق ، أحصل على الرقم "5" الذي يترجم إلى فقد اتصال WiFi ثم يحاول الرمز تنفيذ "WiFi.reconnect ()؛" ولكن من الواضح أنها لا تعمل. هل يجب أن يكون لدي شيء آخر هناك؟ ربما يكون نوعًا من العداد مثل مثال everslick ولكنه أبسط (فقط ai = i + 1) وإذا انتهى به الأمر في نفس المكان بعد 20 محاولة إعادة تشغيله؟ أم يجب ألا يحدث هذا / يجب منعه في المقام الأول؟

حاول الاتصال بـ WiFi.begin () بدلاً من إعادة الاتصال والإبلاغ مرة أخرى :)

@ me-no-dev - لقد غيرتها إلى WiFi.begin () بدلاً من WiFi.reconnect () لكنها لم تساعد. عملت لمدة ساعة تقريبًا ثم حصلت على خط lwip_connect_r: 113 ، كل خط يبعد حوالي دقيقة أو نحو ذلك متبوعًا بقطع الاتصال كل 5 ثوانٍ أو نحو ذلك:

[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 7 - NOT_ASSOCED
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE

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

كملاحظة جانبية ، فإن جهازي ESP8266 المتصلين بنفس جهاز التوجيه (Netgear R8000) لا يواجهان أي مشاكل وكانا مستقرين لأكثر من شهر دون انقطاع.

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

انها Netgear Nighthawk R8000. حاليًا على أحدث البرامج الثابتة V1.0.3.54_1.1.37 على الرغم من أنه فعل ذلك في الإصدار الأخير أيضًا. لدي من 20 إلى 25 جهازًا متصلًا في أي وقت دون مشاكل بما في ذلك جهازي ESP8266 المذكورين سابقًا.

سأحاول استبدال خط بدء / إعادة توصيل Wi-Fi مع إيقاف تشغيل STA وتشغيله ومعرفة ما سيحدث.

تحرير: لا أعرف الكثير عن هذا واستخدام مكتبة شخص آخر .... كيف يمكنني "إيقاف تشغيل STA ثم إعادة تشغيله"؟

التعديل الثاني: لا يمكن أن يكون مرتبطًا بـ https://github.com/espressif/esp-idf/issues/499#issuecomment -314262611 ، أليس كذلك؟ أحد الأشياء الوحيدة التي رأيتها مع نفس NOT_ASSOCED و AUTH_EXPIRE. لا أعتقد ذلك فقط لأنني جمعت نفسي بدون عناصر BLE ولكني لا أعرف أبدًا.

لقد قمت أيضًا بتنبيه فريق wifi :) سنرى ما إذا كان أي شيء يخرج من هذا

شكر. هل يجب أن أحاول إيقاف تشغيل STA وتشغيله؟ إذا كان الأمر كذلك ، هل يمكنك أن ترشدني كيف أو توجهني في الاتجاه الصحيح؟

رأيت هذا أيضًا: https://github.com/espressif/esp-idf/issues/738#issuecomment -311626685 مما يشير إلى أنه لا يمكنني الاتصال بشبكة WiFi.connect أو WiFi. هل تبدأ من معالج الحدث؟ هل يمكن أن تكون هذه مشكلتي أيضًا؟ rojer ؟

لذلك اشتريت ESP32 ثانيًا ، نفس الجهاز ، لمحاولة التأكد من أنها ليست مشكلة في الجهاز. أعدت تجميع البرامج الثابتة ليلة أمس من سحب جديد من github (https://nodemcu.readthedocs.io/en/dev-esp32/en/build/) وأومضت كل من الشريحة الجديدة والقديمة. لقد تومضت أيضًا بنفس الرسم التخطيطي بالضبط. الأصل في المرآب الخاص بي ، على بعد طرق قليلة من جهاز التوجيه الخاص بي ، والاختبار الآخر في غرفة المعيشة الخاصة بي حيث تكون شبكة WiFi أقوى كثيرًا. كلاهما يحتوي على شاشة تسلسلية تعمل على جهاز كمبيوتر متصل مع مجموعة مطولة. سأبلغ عن أي شيء أجده.

مع ما ورد أعلاه ، هل هناك أي شيء آخر يمكنني تجربته؟ كيف أقوم بإيقاف تشغيل STA وتشغيله؟ هل يمكن القيام بذلك في جزء STA_Disconnect حيث يوجد WiFi.reconnect؟

حسنًا ، لم يدم ذلك طويلاً ... أواجه نفس المشكلة مع الإصدار الجديد. أولاً ، بدأ الإصدار الأصلي بنفس الخطأ "[E] [WiFiClient. cpp: 97 ] connect (): lwip_connect_r: 113" وعدم إرسال البيانات بعد 30 دقيقة تقريبًا عبر الإنترنت. عادةً ما يحدث هذا الخطأ مرتين في كل مرة بحوالي 5 أو 6 ثوانٍ بين ذلك الحين 45-50 ثانية بين المجموعة التالية ولكن مرة أخرى عشوائي نوعًا ما. فعل ذلك لمدة 10 دقائق تقريبًا ثم انتقل إلى نمط الفصل نفسه:


[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
Data: Sending: temperature1 -49.02
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
Data: Sending: humidity1 -5.02
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 7 - NOT_ASSOCED
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 202 - ASSOC_FAIL
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5

وكرر آخر 4 أسطر مرارا وتكرارا. في وقت من الأوقات ، فعلت شيئًا مختلفًا ... تغيرت رسالة الخطأ قليلاً:

[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 118
Data: Sending: temperature2 -1.00
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 118
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 118
Data: Sending: humidity2 -1.00
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 118
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 118
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5

لاحظ أن الخطأ تحول إلى النهاية بـ 118 مقابل 113. ولكن من تلك النقطة فصاعدًا كرر الخطأ 118 بشكل عشوائي مع STA_DISCONNECTED و AUTH_EXPIRED مرارًا وتكرارًا.

ثم بدأ ESP32 الجديد في فعل الشيء نفسه بالضبط. في الغالب 113 خطأ ثم نفس النمط من NOT_ASSOCED و ASSOC_FAIL و AUTH_EXPIRE متبوعًا فقط بفصل و AUTH_EXPIRE مرارًا وتكرارًا.

لقد فشلوا في أوقات مختلفة ، بفارق 25 دقيقة ، بينما بدأوا في نفس الوقت بالضبط. لا يبدو أن إشارة WiFi عامل ولا توقيت معين.

تحرير: فقط لكي تكون واضحًا عند إعادة التشغيل ، فإنه يتصل على الفور في المحاولة الأولى في كل مرة:

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
ets_main.c 371 
ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0010,len:4
load:0x3fff0014,len:708
load:0x40078000,len:0
load:0x40078000,len:11460
entry 0x400789f4
Everything: init started
Everything: Free RAM = -1
Disabling ESP32 WiFi Access Point
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 2 - STA_START
[WiFi-event] event: 2
Initializing ESP32 WiFi network.  Please be patient...
ESP32 station start
Attempting to connect to WPA SSID: (SSIDRemoved)
..[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 4 - STA_CONNECTED
[WiFi-event] event: 4
ESP32 station connected to AP
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 7 - STA_GOT_IP
[WiFi-event] event: 7
WiFi connected
IP address: 
192.168.xx.xx

ما زلت في انتظار الرد من فريق WiFi. سيحدث المزيد من الضوضاء لأن هذا أمر مزعج بالنسبة لي أيضًا. المشكلة في مكان ما أسفل Arduino وفي مصدر wifi lib مغلق.

شكر. سأحاول إضافة عداد إلى بيان تبديل الحدث STA_DISCONNECTED الذي استمر في الحصول عليه وبعد 5 أحاول إعادة تهيئة wifi وبعد 10 إعادة تشغيل وحدة التحكم وعلى اتصال إعادة تعيين العداد إلى 0 ، انظر ما إذا كان ذلك في الأقل يبقي وحدة تحكم.

إذا كان هناك أي شيء آخر يمكنني تقديمه لك للمساعدة في إصلاح هذا الرمز أو المحاولة ، فيرجى إبلاغي بذلك. إذا كان من المهم أن يتم استخدام ESP32 الذي أستخدمه لمدخلين للجهد ، ومدخل ثنائي واحد ، و DTH22 (درجة الحرارة + الرطوبة) ، فسيتم إرسال هذه البيانات إلى وحدة تحكم عبر HTTP.

مرحبًا vseven ، لا يمكنني إعادة إنتاج هذه المشكلة بنفسي ، هل يمكنك إعلامي بإصدار البرنامج الثابت

vseven هل يمكنك إخباري بمنطق إعادة توصيل WiFi؟ أعني متى أتصل بـ esp_wifi_connect ()؟ سيكون من المفيد إذا كان بإمكانك لصق منطق التنفيذ.

liuzfesp wifi تسجيل الدخول معطل في Arduino.
vseven علق على هذا السطر لتظهر

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

    void SmartThingsESP32WiFi::WiFiEvent(WiFiEvent_t event)
    {
        Serial.printf("[WiFi-event] event: %d\n", event);
        switch (event) {
        case SYSTEM_EVENT_STA_GOT_IP:
            Serial.println("WiFi connected");
            Serial.println("IP address: ");
            Serial.println(WiFi.localIP());
            break;
        case SYSTEM_EVENT_STA_DISCONNECTED:
            Serial.println("WiFi lost connection.  Attempting to reconnect...");
            WiFi.reconnect();
            disconnectCounter++;
            if (disconnectCounter > 5) {
                Serial.println("We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...");
                void init();
            }
            if (disconnectCounter > 10) {
                Serial.println("We have recieved the STA_DISCONNECTED event 10 times now.  Reboot...");
                ESP.restart();
            }
            break;
        case SYSTEM_EVENT_STA_START:
            Serial.println("ESP32 station start");
            break;
        case SYSTEM_EVENT_STA_CONNECTED:
            Serial.println("ESP32 station connected to AP");
            disconnectCounter = 0;
            break;
        }
    }

liuzfesp - إليك المعلومات الإضافية التي تم التعليق عليها بهذا السطر:

I (243) wifi: wifi firmware version: c1b8a2f
I (243) wifi: config NVS flash: enabled
I (243) wifi: config nano formating: disabled
I (257) wifi: Init dynamic tx buffer num: 32
I (257) wifi: Init data frame dynamic rx buffer num: 64
I (257) wifi: Init management frame dynamic rx buffer num: 64
I (261) wifi: wifi driver task: 3ffd0d8c, prio:23, stack:4096
I (267) wifi: Init static rx buffer num: 10
I (270) wifi: Init dynamic rx buffer num: 0
I (274) wifi: Init rx ampdu len mblock:7
I (278) wifi: Init lldesc rx ampdu entry mblock:4
I (282) wifi: wifi power manager task: 0x3ffd60f0 prio: 21 stack: 2560
I (290) wifi: wifi timer task: 3ffd7148, prio:22, stack:3584
I (314) wifi: mode : null
Disabling ESP32 WiFi Access Point

I (815) wifi: Init Ampdu: 1 tx baw=6 rx baw=6
I (815) wifi: mode : sta (30:ae:a4:25:78:64)
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 2 - STA_START

Initializing ESP32 WiFi network.  Please be patient...
[WiFi-event] event: 2
ESP32 station start
Attempting to connect to WPA SSID: (SSIDREMOVED)
.I (1946) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
.I (2603) wifi: state: init -> auth (b0)
I (2605) wifi: state: auth -> assoc (0)
I (2612) wifi: state: assoc -> run (10)
I (2670) wifi: connected with (SSIDREMOVED), channel 1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 4 - STA_CONNECTED
[WiFi-event] event: 4
ESP32 station connected to AP
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 7 - STA_GOT_IP
[WiFi-event] event: 7
WiFi connected

والملفات التي أستخدمها (قبل أن أضيف عداد الفصل):

SmartThingsESP32WiFi.h.txt
SmartThingsESP32WiFi.cpp.txt

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

I (5427111) wifi: state: run -> auth (7c0)
I (5427111) wifi: pm stop, total sleep time: 0/1119534452

I (5427111) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 7 - NOT_ASSOCED
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (5427133) wifi: state: auth -> init (0)
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 202 - ASSOC_FAIL
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (5427276) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5427276) wifi: state: init -> auth (b0)
I (5428276) wifi: state: auth -> init (2)
I (5428277) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (5428413) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5428414) wifi: state: init -> auth (b0)
I (5429414) wifi: state: auth -> init (2)
I (5429414) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (5429551) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5429551) wifi: state: init -> auth (b0)
I (5430551) wifi: state: auth -> init (2)
I (5430551) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (5430688) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5430688) wifi: state: init -> auth (b0)
I (5431689) wifi: state: auth -> init (2)
I (5431689) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
I (5431826) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5431826) wifi: state: init -> auth (b0)
I (5432826) wifi: state: auth -> init (2)
I (5432826) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
I (5432963) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5432963) wifi: state: init -> auth (b0)
I (5433964) wifi: state: auth -> init (2)
I (5433964) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
I (5434100) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5434101) wifi: state: init -> auth (b0)
I (5435101) wifi: state: auth -> init (2)
I (5435101) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
I (5435238) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5435238) wifi: state: init -> auth (b0)
I (5436238) wifi: state: auth -> init (2)
I (5436239) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
I (5436375) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5436376) wifi: state: init -> auth (b0)
I (5437376) wifi: state: auth -> init (2)
I (5437376) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
We have recieved the STA_DISCONNECTED event 10 times now.  Reboot...
I (5437405) wifi: flush txq
I (5437407) wifi: stop sw txq
I (5437410) wifi: lmac stop hw txq
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)

لذلك ، بالنسبة لكل STA_DISCONNECT ، حاولت الاتصال بشبكة WiFi.reconnect دون نجاح واضح ، ثم حاولت تشغيل init () بعد أكثر من 5 قطع اتصال والتي لم تساعد أيضًا بعد ذلك بمجرد وصولها إلى 10 قطع الاتصال ، مما أدى إلى إعادة التشغيل وإعادة الاتصال.

ظللت الشاشة التسلسلية تعمل على ESP32 طوال عطلة نهاية الأسبوع وأعيد تشغيلها حوالي 10 مرات بين الساعة 6 مساءً ليلة الجمعة و 9 مساءً ليلة الأحد. في كل مرة كان بالضبط مثل السجلات أعلاه.

@ me-no-dev - هل يمكنك إرشادي بطريقة لإيقاف تشغيل STA وإعادة تشغيله مرة أخرى لمعرفة ما إذا كان ذلك يعمل أيضًا لإعادة الاتصال ويمكنني تجربة ذلك بعد 5 محاولات فاشلة؟ إعادة التشغيل بعد 10 أعمال لكنني أخطط لاستخدام هذا للتحكم في إضاءة RGB ولا أريد حقًا إطفاء الأنوار وتشغيلها.

liuzfesp - هل هناك أي شيء آخر يمكنني تقديمه لك لتصحيح الأخطاء؟ أو أي شيء يبرز يمكنني تجربته؟

أي تحديثات؟ لا يزال هناك انقطاع مستمر في الاتصال بكلا الجهازين.

liuzfesp أي أخبار هنا؟

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

liuzfesp - هل هناك أي شيء في السجلات يساعد أو أي شيء آخر يمكنني تقديمه أو تجربته؟

لقد قمت بتنظيف بعض الأشياء ، وتأكدت في الكود الخاص بي من عدم وجود أي تأخير أو حظر ، ولدي الآن أخطاء أقل (لا أرى أخطاء 113 و 118) ولكن ما زلت أواجه نفس مشكلة قطع الاتصال ويبدو أنها مرتبطة بشكل مباشر بـ WiFi تحاول المصادقة (التجديد؟) وتفشل. إليك لقطة جديدة من عطلة نهاية الأسبوع هذه حيث أعيد تشغيلها حوالي 5 مرات في فترة 24 ساعة. مرة أخرى ، نفس الشيء على جهازي ESP32 مختلفين ، أبحث عن قطع الاتصال (الحدث 5) وأحاول إعادة الاتصال بشبكة WiFi.reconnect و WiFi.

I (1903652) wifi: active cnt: 5
I (1913652) wifi: active cnt: 5
I (1923652) wifi: send null to keep active
I (1933652) wifi: send null to keep active
I (1943653) wifi: active cnt: 1
I (1953653) wifi: active cnt: 2
I (1963653) wifi: send null to keep active
I (1973653) wifi: send null to keep active
I (1983653) wifi: send null to keep active
I (1993653) wifi: active cnt: 1
I (2003654) wifi: send null to keep active
I (2013654) wifi: send null to keep active
I (2023654) wifi: send null to keep active
I (2033654) wifi: send null to keep active
I (2043654) wifi: send null to keep active
I (2053654) wifi: send null to keep active
I (2063654) wifi: send null to keep active
I (2073655) wifi: send null to keep active
I (2083655) wifi: active cnt: 1
I (2093655) wifi: send null to keep active
I (2103655) wifi: send null to keep active
I (2113655) wifi: send null to keep active
I (2123655) wifi: send null to keep active
I (2133655) wifi: send null to keep active
I (2143656) wifi: send null to keep active
I (2153656) wifi: send null to keep active
I (2163656) wifi: send null to keep active
I (2173656) wifi: send null to keep active
I (2183656) wifi: send null to keep active
I (2193656) wifi: send null to keep active
I (2203657) wifi: send null to keep active
I (2213657) wifi: send null to keep active
I (2223657) wifi: send null to keep active
I (2233657) wifi: send null to keep active
I (2243657) wifi: send null to keep active
I (2253657) wifi: send null to keep active
I (2263657) wifi: send null to keep active
I (2273658) wifi: active cnt: 2
I (2283658) wifi: send null to keep active
I (2293658) wifi: send null to keep active
I (2303658) wifi: send null to keep active
I (2313658) wifi: send null to keep active
I (2323658) wifi: send null to keep active
I (2333658) wifi: send null to keep active
I (2343659) wifi: send null to keep active
I (2353659) wifi: send null to keep active
I (2363659) wifi: send null to keep active
I (2373659) wifi: send null to keep active
I (2383659) wifi: send null to keep active
I (2393659) wifi: send null to keep active
I (2403660) wifi: send null to keep active
I (2413660) wifi: send null to keep active
I (2423660) wifi: send null to keep active
I (2433660) wifi: send null to keep active
I (2443660) wifi: send null to keep active
I (2453660) wifi: send null to keep active
I (2463660) wifi: send null to keep active
I (2473661) wifi: send null to keep active
I (2483661) wifi: send null to keep active
I (2483663) wifi: state: run -> auth (7c0)
I (2483663) wifi: pm stop, total sleep time: 0/-1824912959

I (2483663) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2483674) wifi: state: auth -> init (0)
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2483805) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2483805) wifi: state: init -> auth (b0)
I (2484805) wifi: state: auth -> init (2)
I (2484806) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2484930) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2484931) wifi: state: init -> auth (b0)
I (2485931) wifi: state: auth -> init (2)
I (2485931) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2486056) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2486056) wifi: state: init -> auth (b0)
I (2487056) wifi: state: auth -> init (2)
I (2487056) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2487181) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2487181) wifi: state: init -> auth (b0)
I (2488182) wifi: state: auth -> init (2)
I (2488182) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2488306) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2488307) wifi: state: init -> auth (b0)
I (2489307) wifi: state: auth -> init (2)
I (2489307) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2489432) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2489432) wifi: state: init -> auth (b0)
I (2490432) wifi: state: auth -> init (2)
I (2490432) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2490557) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2490557) wifi: state: init -> auth (b0)
I (2491558) wifi: state: auth -> init (2)
I (2491558) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2491682) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2491683) wifi: state: init -> auth (b0)
I (2492683) wifi: state: auth -> init (2)
I (2492683) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2492808) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2492808) wifi: state: init -> auth (b0)
I (2493808) wifi: state: auth -> init (2)
I (2493808) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event over 10 times now.  Reboot...
I (2493819) wifi: flush txq
I (2493822) wifi: stop sw txq
I (2493824) wifi: lmac stop hw txq
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0010,len:4
load:0x3fff0014,len:708
load:0x40078000,len:0
load:0x40078000,len:11460
entry 0x400789f4
Everything: init started
Everything: Free RAM = -1
I (749) wifi: wifi firmware version: c1b8a2f
I (749) wifi: config NVS flash: enabled
I (749) wifi: config nano formating: disabled
I (758) wifi: Init dynamic tx buffer num: 32
I (758) wifi: Init data frame dynamic rx buffer num: 64
I (758) wifi: Init management frame dynamic rx buffer num: 64
I (762) wifi: wifi driver task: 3ffca34c, prio:23, stack:4096
I (768) wifi: Init static rx buffer num: 10
I (771) wifi: Init dynamic rx buffer num: 0
I (775) wifi: Init rx ampdu len mblock:7
I (779) wifi: Init lldesc rx ampdu entry mblock:4
I (783) wifi: wifi power manager task: 0x3ffd6004 prio: 21 stack: 2560
I (791) wifi: wifi timer task: 3ffd705c, prio:22, stack:3584
I (815) wifi: mode : null
Disabling ESP32 WiFi Access Point

I (1816) wifi: Init Ampdu: 1 tx baw=6 rx baw=6
I (1816) wifi: mode : sta (30:ae:a4:07:f1:98)
[WiFi-event] event: 2

Initializing ESP32 WiFi network.  Please be patient...
ESP32 station start
Attempting to connect to WPA SSID: (SSIDREMOVED)
.I (2943) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
.I (3600) wifi: state: init -> auth (b0)
I (3602) wifi: state: auth -> assoc (0)
I (3606) wifi: state: assoc -> run (10)
I (3635) wifi: connected with (SSIDREMOVED), channel 1
[WiFi-event] event: 4
ESP32 station connected to AP
[WiFi-event] event: 7
WiFi connected
IP address: 
192.168.1.142

liuzfesp / @ me-no-dev - هل هناك أي معلومات أخرى يمكنني تقديمها؟ هل يحدث هذا لأي شخص آخر أم مع جهازي HiLetGo ModeMCU ESP32 فقط؟ هل هناك أي برامج ثابتة مخصصة يمكنني تجربتها؟

-الان

لدي نفس السلوك بالضبط في وحدة WROOM-32 الخاصة بي.
كل إعادة تشغيل ثالثة أو رابعة ، يتم تعليقها في حلقة STA_DISCONNECTED -> AUTH_EXPIRED.
فحصت وحدة ثانية من نفس النوع ، تظهر نفس السلوك.
جهاز التوجيه الخاص بي هو TL-WR841 (TPLINK) ولكنه يحدث أيضًا مع ASUS RT-AC87U.

متى سيكون هناك حل ، يكون عديم الفائدة إذا كانت هناك حاجة لإعادة التشغيل في مثل هذه الحالات ...

تحرير: بالنسبة لي ، تحدث هذه المشكلة أيضًا بعد التمهيد ، أي لن تقوم WiFi.begin () بإنشاء اتصال على الإطلاق ولكن الحلقات في STA_DISCONNECTED -> AUTH_EXPIRED

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

liuzfesp / @ me-no-dev - هل كان هناك أي تقدم في هذا أو أي شيء يمكننا محاولة

مطعون liuzfesp مرة أخرى ... هذا قدر ما يمكنني فعله حقًا. لا يمكنني الوصول إلى مصدر WiFi lib

igrr

copercini لماذا؟

منذ أن تم وسمي هنا ...

فكرة أخرى (فقط لتقليل عدد المتغيرات) ، هل تحدث هذه المشكلة أيضًا إذا قمت بالاتصال بشبكة WiFi مفتوحة؟

حاليًا ، تفشل جميع عمليات إعادة الاتصال مع WROOM32s مع إخراج التصحيح التالي:

[D] [WiFiGeneric. cpp: 265 ] _eventCallback (): الحدث: 2 - STA_START
.... [D] [WiFiGeneric. cpp: 265 ] _eventCallback (): الحدث: 4 - STA_CONNECTED
.. [D] [WiFiGeneric. cpp: 265 ] _eventCallback (): الحدث: 7 - STA_GOT_IP
واي فاي متصل
... ثم أقوم بحظر استقبال الهوائي أو الضغط على RESET في نقطة الوصول الخاصة بي ، لفرض قطع الاتصال ...
[D] [WiFiGeneric. cpp: 265 ] _eventCallback (): الحدث: 5 - STA_DISCONNECTED
[W] [WiFiGeneric. cpp: 270 ] _eventCallback (): السبب: 200 - NO_AP_FOUND
... عندما يكون الاستقبال على ما يرام مرة أخرى ، يستغرق الأمر حوالي دقيقتين حتى يقول:

[D] [WiFiGeneric. cpp: 265 ] _eventCallback (): الحدث: 8 - STA_WPS_ER_SUCCESS

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

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

أنا أرى هذه المشكلة أيضًا. أعتقد أنني ربما تمكنت من تضييقه قليلاً. أنا أستخدم هذا المخطط الصغير حقًا الذي يجب أن يعمل على كل من ESP8266 و ESP32:

https://github.com/sidoh/esp32_reconnect_demo

لقد أوقفت إعادة الاتصال التلقائي حتى أصبح لدي المزيد من التحكم في المتغيرات.

اقامة

  1. اختبار على كل من ESP8266 و ESP32
  2. استخدام شبكة نقطة اتصال محمولة. جربت كل من WPA2 PSK والشبكات المفتوحة
  3. اسمح لـ MCU بالاتصال بالشبكة وتشغيلها لبضع ثوان. أضفت عميل NTP للتحقق من الاتصال.

ثم جربت شيئين مختلفين:

(أ) هدم الشبكة ، وأعد إنشائها على الفور

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

(ب) قم بتفكيك الشبكة ، وانتظر MCU لتلاحظ أنها غير متصلة ، وأعد إنشاء الشبكة

ملاحظات

  1. السلوك هو نفسه مع كل من WPA2 والشبكات المفتوحة.
  2. نجح ESP8266 في إعادة الاتصال بكل من (أ) و (ب).
  3. يعيد ESP32 الاتصال في التجربة (أ) ، لكنه يتعطل في (ب).
  4. يقوم ESP32 بإعادة WiFi.disconnect(true); _ و_ WiFi.begin(WIFI_SSID, WIFI_PASSWD); . يبدو أن كلاهما ضروري.
    \
    يبدو أن المعلمة المنطقية wifioff لـ disconnect التي يتم تعيينها على true ضرورية أيضًا. نظرًا لأن WiFi.disconnect(true); يبدو أنه يمسح إعدادات WiFi ، فمن الضروري إعادة تحديد ssid وكلمة المرور في المكالمة إلى begin .

السجلات

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

ESP32 ، تجربة (أ)

I (25) wifi: wifi firmware version: 708a055
I (26) wifi: config NVS flash: enabled
I (26) wifi: config nano formating: disabled
I (31) wifi: Init dynamic tx buffer num: 32
I (32) wifi: Init data frame dynamic rx buffer num: 64
I (32) wifi: Init management frame dynamic rx buffer num: 64
I (35) wifi: wifi driver task: 3ffd46dc, prio:23, stack:4096
I (40) wifi: Init static rx buffer num: 10
I (44) wifi: Init dynamic rx buffer num: 0
I (48) wifi: wifi power manager task: 0x3ffd9418 prio: 21 stack: 2560
I (425) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
I (2836) wifi: n:6 0, o:1 0, ap:255 255, sta:6 0, prof:1
I (2836) wifi: state: init -> auth (b0)
I (2853) wifi: state: auth -> assoc (0)
I (2872) wifi: state: assoc -> run (10)
I (2872) wifi: connected with glowyrectangle, channel 6
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 7 - STA_GOT_IP
Setup completed
[4] ssid=glowyrectangle
[5] ssid=glowyrectangle
I (5872) wifi: pm start, type:0

[6] ssid=glowyrectangle
[7] ssid=glowyrectangle
[8] ssid=glowyrectangle
[9] ssid=glowyrectangle
[10] ssid=glowyrectangle
I (10388) wifi: state: run -> auth (7c0)
I (10389) wifi: pm stop, total sleep time: 0/4516399

I (10389) wifi: n:6 0, o:6 0, ap:255 255, sta:6 0, prof:1
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:270] _eventCallback(): Reason: 7 - NOT_ASSOCED
W (11413) wifi: Haven't to connect to a suitable AP now!
[11] ssid=
Attempting to reconnect...
I (13822) wifi: n:6 0, o:6 0, ap:255 255, sta:6 0, prof:1
I (13823) wifi: state: auth -> auth (b0)
I (13826) wifi: state: auth -> assoc (0)
I (13839) wifi: state: assoc -> run (10)
I (13839) wifi: connected with glowyrectangle, channel 6
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 7 - STA_GOT_IP
Connection result: 3
[1513219385] ssid=glowyrectangle
[1513219386] ssid=glowyrectangle
[1513219387] ssid=glowyrectangle
[1513219388] ssid=glowyrectangle
I (16839) wifi: pm start, type:0

ESP32 ، تجربة (ب)

rst:0x10 (RTCWDT_RTC_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:812
load:0x40078000,len:0
load:0x40078000,len:11404
entry 0x40078aa0
I (25) wifi: wifi firmware version: 708a055
I (26) wifi: config NVS flash: enabled
I (26) wifi: config nano formating: disabled
I (35) wifi: Init dynamic tx buffer num: 32
I (36) wifi: Init data frame dynamic rx buffer num: 64
I (36) wifi: Init management frame dynamic rx buffer num: 64
I (39) wifi: wifi driver task: 3ffd46d0, prio:23, stack:4096
I (44) wifi: Init static rx buffer num: 10
I (48) wifi: Init dynamic rx buffer num: 0
I (52) wifi: wifi power manager task: 0x3ffd940c prio: 21 stack: 2560
I (431) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
I (2842) wifi: n:6 0, o:1 0, ap:255 255, sta:6 0, prof:1
I (2843) wifi: state: init -> auth (b0)
I (2846) wifi: state: auth -> assoc (0)
I (2863) wifi: state: assoc -> run (10)
I (2863) wifi: connected with glowyrectangle, channel 6
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 7 - STA_GOT_IP
Setup completed
[3] ssid=glowyrectangle
[4] ssid=glowyrectangle
I (5863) wifi: pm start, type:0

[5] ssid=glowyrectangle
[1513219573] ssid=glowyrectangle
[1513219574] ssid=glowyrectangle
[1513219575] ssid=glowyrectangle
[1513219576] ssid=glowyrectangle
[1513219577] ssid=glowyrectangle
[1513219578] ssid=glowyrectangle
[1513219579] ssid=glowyrectangle
I (13174) wifi: bcn_timout,ap_probe_send_start
[1513219580] ssid=glowyrectangle
[1513219581] ssid=glowyrectangle
[1513219582] ssid=glowyrectangle
I (15676) wifi: ap_probe_send over, resett wifi status to disassoc
I (15677) wifi: state: run -> init (1)
I (15678) wifi: pm stop, total sleep time: 0/9813809

I (15678) wifi: n:6 0, o:6 0, ap:255 255, sta:6 0, prof:1
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:270] _eventCallback(): Reason: 200 - NO_AP_FOUND
W (16387) wifi: Haven't to connect to a suitable AP now!
[1513219583] ssid=
Attempting to reconnect...
Connection result: 5
[E][WiFiUdp.cpp:183] endPacket(): could not send data: 118
W (17412) wifi: Haven't to connect to a suitable AP now!
[1513219584] ssid=
Attempting to reconnect...
Connection result: 5
[E][WiFiUdp.cpp:183] endPacket(): could not send data: 118
W (18437) wifi: Haven't to connect to a suitable AP now!
[1513219585] ssid=
Attempting to reconnect...
Connection result: 5
[E][WiFiUdp.cpp:183] endPacket(): could not send data: 118
W (19462) wifi: Haven't to connect to a suitable AP now!
[1513219586] ssid=
Attempting to reconnect...
Connection result: 5

... ( loops like this indefinitely ) ...

ESP32 ، جرب (ب) مع قطع الاتصال (صحيح) + ابدأ (ssid ، passwd)

rst:0x10 (RTCWDT_RTC_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:812
load:0x40078000,len:0
load:0x40078000,len:11404
entry 0x40078aa0
I (27) wifi: wifi firmware version: 708a055
I (28) wifi: config NVS flash: enabled
I (28) wifi: config nano formating: disabled
I (36) wifi: Init dynamic tx buffer num: 32
I (36) wifi: Init data frame dynamic rx buffer num: 64
I (36) wifi: Init management frame dynamic rx buffer num: 64
I (39) wifi: wifi driver task: 3ffd46d0, prio:23, stack:4096
I (45) wifi: Init static rx buffer num: 10
I (48) wifi: Init dynamic rx buffer num: 0
I (52) wifi: wifi power manager task: 0x3ffd940c prio: 21 stack: 2560
I (431) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
I (2842) wifi: n:6 0, o:1 0, ap:255 255, sta:6 0, prof:1
I (2843) wifi: state: init -> auth (b0)
I (2847) wifi: state: auth -> assoc (0)
I (2863) wifi: state: assoc -> run (10)
I (2863) wifi: connected with glowyrectangle, channel 6
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 7 - STA_GOT_IP
Setup completed
[1513219802] ssid=glowyrectangle
[1513219803] ssid=glowyrectangle
[1513219804] ssid=glowyrectangle
I (5863) wifi: pm start, type:0

[1513219805] ssid=glowyrectangle
[1513219806] ssid=glowyrectangle
[1513219807] ssid=glowyrectangle
[1513219808] ssid=glowyrectangle
[1513219809] ssid=glowyrectangle
[1513219810] ssid=glowyrectangle
[1513219811] ssid=glowyrectangle
[1513219812] ssid=glowyrectangle
[1513219813] ssid=glowyrectangle
[1513219814] ssid=glowyrectangle
[1513219815] ssid=glowyrectangle
[1513219816] ssid=glowyrectangle
I (17282) wifi: bcn_timout,ap_probe_send_start
[1513219817] ssid=glowyrectangle
[1513219818] ssid=glowyrectangle
[1513219819] ssid=glowyrectangle
I (19785) wifi: ap_probe_send over, resett wifi status to disassoc
I (19785) wifi: state: run -> init (1)
I (19786) wifi: pm stop, total sleep time: 0/13922305

I (19786) wifi: n:6 0, o:6 0, ap:255 255, sta:6 0, prof:1
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:270] _eventCallback(): Reason: 200 - NO_AP_FOUND
W (20616) wifi: Haven't to connect to a suitable AP now!
[1513219820] ssid=
Attempting to reconnect...
I (20632) wifi: mode : null
I (20634) wifi: flush txq
I (20634) wifi: stop sw txq
I (20635) wifi: lmac stop hw txq
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 3 - STA_STOP
I (20644) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:270] _eventCallback(): Reason: 201 - AUTH_FAIL
Connection result: 1
[E][WiFiUdp.cpp:183] endPacket(): could not send data: 118
W (24182) wifi: Haven't to connect to a suitable AP now!
[1513219823] ssid=
Attempting to reconnect...
I (24254) wifi: mode : null
I (24256) wifi: flush txq
I (24257) wifi: stop sw txq
I (24257) wifi: lmac stop hw txq
I (24266) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 3 - STA_STOP
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:270] _eventCallback(): Reason: 201 - AUTH_FAIL
Connection result: 1
[E][WiFiUdp.cpp:183] endPacket(): could not send data: 118
W (27804) wifi: Haven't to connect to a suitable AP now!
[1513219827] ssid=
Attempting to reconnect...
I (27820) wifi: mode : null
I (27822) wifi: flush txq
I (27822) wifi: stop sw txq
I (27822) wifi: lmac stop hw txq
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 3 - STA_STOP
I (27832) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
I (30311) wifi: n:6 0, o:1 0, ap:255 255, sta:6 0, prof:1
I (30312) wifi: state: init -> auth (b0)
I (30318) wifi: state: auth -> assoc (0)
I (30339) wifi: state: assoc -> run (10)
I (30340) wifi: connected with glowyrectangle, channel 6
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 7 - STA_GOT_IP
Connection result: 3
[1513219831] ssid=glowyrectangle
[1513219832] ssid=glowyrectangle
I (33340) wifi: pm start, type:0

[1513219833] ssid=glowyrectangle
[1513219834] ssid=glowyrectangle
[1513219835] ssid=glowyrectangle
[1513219835] ssid=glowyrectangle
[1513219836] ssid=glowyrectangle

يتم إحتوائه

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

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

أنا سعيد لأنني وجدت حلاً على الأقل (قطع الاتصال (صحيح) + ابدأ (ssid ، passwd)).

vsevenMarkusenzsidoh
نأسف للرد لاحقًا ، ونشكرك على عملك الشاق على SDK.
المرفق هو إصدار تصحيح الأخطاء من wifi lib ، يمكنك استخدامه لإجراء اختبار ، ثم يمكننا تحليل سجلاتك لحل المشكلة.
wifi_lib.tar.gz

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

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

سأحصل على هذا مترجم وتحميله في نهاية هذا الأسبوع.

تحرير: ملف wifi_lib.tar.gz فارغ. هل يمكنك إعادة النشر من فضلك؟

أعتقد أن الشيء الأكثر إثارة للاهتمام الذي لاحظته هو:

WiFi.disconnect(true);
WiFi.begin(SSID, PASSWORD);

يعيد الاتصال دائمًا في النهاية بالنسبة لي (تعد المعلمة true إلى disconnect مهمة). أعتقد أن WiFi.disconnect(true) يوقف الراديو. تخميني هو أنه في ظل ظروف معينة ، يتم مسح بعض الحالات المتعلقة بالشبكة التي من المفترض أن يتصل بها ESP32 ، وإعادة تعيينها أعلاه.

ومن المثير للاهتمام أيضًا أن المشكلة تبدو قابلة للتكرار بنسبة 100٪ عن طريق إيقاف تشغيل شبكة wifi ، وانتظار ESP32 لملاحظة انقطاع الاتصال ، وإعادة تشغيل الشبكة. إذا عاودت الشبكة الظهور قبل إشعارات ESP32 ، فيمكنها أحيانًا إعادة الاتصال بنجاح. من السجلات ، يبدو أن الاختلاف هو أنه تم تشغيل حدث NO_AP_FOUND في الحالة الأولى ، ولكن ليس الأخيرة.

تضمين التغريدة
wifi_debug_lib.zip

أعد تشغيل الكود المرتبط بملفات تصحيح الأخطاء. السجلات هنا:

كان هذا كله على شبكة مفتوحة.

تحرير - رابط إلى السجلات الأولية بدلاً من الصفحة الرئيسية.

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

sidoh
في slow_ap_recreate.log ، نجد أن هناك طباعة مثل

[1513308152] ssid =
محاولة إعادة الاتصال...

يبدو أن ssid الخاص بك فارغ ، لذلك بعد فحص جميع القنوات ، لا يتم العثور على ap.
لذلك يجب عليك التحقق من الكود الخاص بك لمعرفة ما إذا تم تعيين SSID بشكل صحيح.
screenshot from 2018-01-04 17-55-20

مرحبا zhangyanjiaoesp ،

أعتقد أن هذا ربما يكون جوهر القضية. في slow_ap_recreate.log ، يعمل كود إعادة الاتصال للتو (الرسم الكامل هنا ):

WiFi.begin();

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

يبدو أن استخدام هذا بدلاً من ذلك يعمل دائمًا:

WiFi.disconnect(true);
WiFi.begin(ssid, passwd);

تحرير - فقط للتأكد من أن الإعداد واضح ، فإن الحالة التي لا تعمل فيها إعادة الاتصال هي عندما تختفي AP لفترة كافية لكي تقرر SDK أنها اختفت. ربما هذا سلوك متوقع ، رغم ذلك.

sidoh نعم ، أنت على حق. هذا هو السلوك المتوقع ، يمكنك حله بطريقتك:

WiFi.donnect (صحيح) ؛
WiFi.begin (ssid ، passwd) ؛

أرى ، هذا منطقي. سأحاول إعادة الإنتاج بدون WiFi.begin() في اليومين المقبلين. أعتقد أن الشيء الصحيح هو مجرد إعادة توصيل مقبض SDK.

أين تتم معالجة إعادة الاتصال في SDK؟ المرجع الوحيد الذي يمكنني العثور عليه هنا ، والذي يبدو أنه يستخدم WiFi.begin() . هل هذا متوقع؟

نعم كلامك صحيح

ألا يعني ذلك أن رمز SDK الذي يعالج عمليات إعادة الاتصال سيكون له نفس المشكلة التي يواجهها العرض التوضيحي الخاص بي؟ إذا حاولت إعادة الاتصال بعد اختفاء نقطة الوصول ، فسيتم مسح SSID ولن يكون قادرًا على إعادة الاتصال ما لم تتم إعادة توفير معلومات AP؟

بالتأكيد يجب أن تحاول SDK إعادة الاتصال تلقائيًا. هذا هو بيت القصيد من وجود WiFi.setAutoReconnect (صحيح).

everslick - أوافق تمامًا ، لا يبدو أنه يعمل وهذا هو السبب في أنني نشرت هذا في الأصل منذ أكثر من 3 أشهر. لا يبدو أن WiFi.setAutoReconnect (صحيح) يجعله يعيد الاتصال ، وهو أمر مثير للسخرية على أقل تقدير. الشيء الوحيد الذي يعمل هو إعادة تشغيل وحدة التحكم والسماح لها بالعودة من خلال الاتصال العادي (الذي لن يعمل معي عند التحكم في مصابيح LED أثناء إيقاف تشغيلها) أو القيام بفصل كامل وإعادة الاتصال.

zhangyanjiaoesp - إذن أنت تقول أن WiFi.setAutoReconnect (صحيح) ببساطة لا يعمل؟ وللتغلب على المشكلة ، يتعين علينا الاتصال بفصل الاتصال وإعادة الاتصال بـ SSID وكلمة المرور مرة أخرى؟ إذا كان هذا صحيحًا ، فهل سيتم إصلاحه أو على الأقل تحديث الوثائق لتوضيح أنه لا يعمل؟

عندى نفس المشكلة،
بعد إعادة تعيين البرنامج باستخدام التسلسل التالي:
WiFi.disconnect () ؛ // تأكد من محو SSID / كلمة المرور الحالية
تأخير (1000) ؛
ESP.restart () ،
يقوم ESP بإعادة التشغيل ولكنه لا يتصل أبدًا بـ AP حتى يتم إعادة تعيين الجهاز.
وظيفة Wifi.disconnect () لا تعمل بشكل صحيح.
روبرت

تتمثل الطريقة الصعبة في توصيل دبوس GPIO بالطرف EN وفرض إعادة تعيين النظام (GPIO Low) في حالة الحاجة إلى إعادة التشغيل / إعادة التشغيل أو الحاجة إلى اتصال (إعادة) wifi.

لا تقم بقطع الاتصال. مجرد إعادة يعمل بالنسبة لي. ولكن مرة أخرى ... لا يجب إعادة التشغيل إذا كان WiFi.setAutoReconnect (صحيح) يعمل بشكل صحيح.

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

إعادة التشغيل ليس حلاً. أنا أستخدم هذا للتحكم في RGB LED وإعادة التشغيل يعيد تشغيل الأضواء. إذا كانت هناك وظيفة تخبر ESP أنه إذا فقدت شبكة WiFi ، فيجب أن تستمر في إعادة محاولة الاتصال ، فيجب أن تعمل هذه الوظيفة بالفعل كما هي موثقة.

حسنًا ، لقد حاولت إعادة تعيين ESP من خلال GPIO ، لكن يبدو أن ESP لا يحب الانتحار ، لذلك فهو لا يعمل بدون جهاز خارجي. لذلك وافقت على الحل الوحيد المتبقي هو أن فصل WiFi أو إعادة تشغيل ESP أو إعادة الاتصال التلقائي لـ Wifi تعمل بالفعل.
هناك مشكلة أخرى يتعين علينا انتظارها حتى تصل إلى وحدة ESP وظيفية (ألاحظ أنه بقدر ما يمكنني اختبارها ، فإن بروتوكول I2C هو أحد البروتوكولات الأخرى التي أنتظر حلها).
لا يمكن الاعتماد على ESP32 حتى الآن ....
روبرت

ولم أذكر واجهة SPI ...

esp_restart_noos () ،

لأنه عندما لا يعمل ESP.restart ().

أنا أستخدم Arduino IDE لتكوين WeMos Lolin32.
أستخدم الوظيفة:

void unitReset ()
 {
#ifdef DEBUGGING
  Serial.println ("Coordinator will REBOOT NOW ....");
#endif    
  WiFi.disconnect();                          //Ensure current  ssid/password is erased
  delay (1000);
  ESP.restart();
 }

عندما يتم توصيل WeMos في WiFi.mode (WIFI_STA) ، أستدعى هذه الوظيفة من MQTT.
يقوم بالفعل بإعادة تشغيل النظام ويبدأ الرسم ، لكن Wifi (لا يمكن المزامنة من تلك النقطة ، محاولات الاتصال تذهب في حلقة لا نهاية لها). إعادة الضبط اليدوي يحلها.
ومع ذلك ، تعمل نفس الوظيفة التي يتم استدعاؤها من خلال WiFi.mode (WIFI_STA) عبر telnet.

vseveneverslickrrobinet
أنت تسيء فهم معنى الوظيفة WiFi.setAutoReconnect(true) .
في الكود الخاص بنا ، لا يعني WiFi.setAutoReconnect(true) إعادة توصيل wifi بشكل تلقائي. هذا يعني أنه إذا كان ESP32 متصلاً بشبكة wifi من قبل ، فعند إعادة تشغيل النظام في المرة القادمة ، سيتم توصيل آخر شبكة wifi متصلة.
لذلك سنضيف بعض التعليقات في الكود. آسف للتأثير على عملك.

zhangyanjiaoesp آسف

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

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

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

إعادة تشغيل نظام ESP وتصحيحه.
حسنًا ، كان البرنامج النصي أعلاه يعمل مع ESP8266 وليس مع ESP32 ، ولكن بعد بعض الاختبارات ، تكمن المشكلة في استخدام WiFi. قطع الاتصال (صحيح) ، قبل ESP.restart (). يجب وضع هذه الوظيفة لـ ESP32 عند تهيئة Wifi (راجع https://github.com/espressif/arduino-esp32/pull/466)
شيء مثل:

<snip>
  WiFi.disconnect(true);                                      // Clear Wifi Credentials
  WiFi.persistent(false);                                     // Avoid to store Wifi configuration in Flash
  WiFi.mode(WIFI_STA);                                        // Ensure WiFi mode is Station 
  Serial.println("Now Connecting to Access Point ...");  
  // Connect to the Access Point
  WiFi.begin(ssid,key);
<snip>

ويجب أن تكون إعادة ضبط الوحدة ببساطة:

void unitReset ()
 {
#ifdef DEBUGGING
  Serial.println ("Coordinator will REBOOT NOW ....");
#endif    
  delay (1000);
  ESP.restart();
 }

هل يمكنكم تأكيد ما يلي ، الذي فهمته حتى الآن عند قراءة هذا الموضوع:

  • يتصرف ESP32 بشكل مختلف عن ESP8266 ، لذلك مع ESP32 لا توجد إعادة اتصال تلقائي بشبكة wifi أثناء وقت التشغيل في حالة فقد نقطة الوصول أو تعذر الوصول إليها لبعض الوقت. يجب على المستخدم اكتشاف فقدان wifi والتعامل مع إعادة الاتصال في الكود الخاص به (غير ممكن بدون إعادة تشغيل الجهاز ؟؟)
  • يتصرف ESP32 بشكل مختلف عن ESP8266 لأنه بعد التمهيد ، لا يتصل أحيانًا بـ AP. نحتاج إلى أسطر معينة من التعليمات البرمجية لإصلاحها ، مثل هنا https://github.com/espressif/arduino-esp32/issues/653#issuecomment -356534618
  • يُنظر إلى المشكلات الموصوفة على أنها سلوك متوقع وليس المقصود منها تغيير السلوك في واجهة برمجة التطبيقات ، لذلك يتعين علينا تعديل الكود وفقًا لذلك عند العمل مع ESP32

Markusenz ، يمكنني أن أؤكد أن https://github.com/espressif/arduino-esp32/issues/653#issuecomment -355659659 يبدو أنه يعمل دائمًا معي. يبدو أن المرجع الوحيد لـ getAutoReconnect هو الرابط الذي قمت بلصقه في التعليق ، والذي لن يتعامل مع قطع الاتصال جيدًا ، إذا كان كل شيء.

zhangyanjiaoesp ، شكرًا على مساعدتك في هذا الأمر. :)

أنت تسيء فهم معنى وظيفة WiFi.setAutoReconnect (صحيح).
في الكود الخاص بنا ، لا يعني WiFi.setAutoReconnect (صحيح) إعادة الاتصال بشبكة wifi تلقائيًا. هذا يعني أنه إذا كان ESP32 متصلاً بشبكة wifi من قبل ، فعند إعادة تشغيل النظام في المرة القادمة ، سيتم توصيل آخر شبكة wifi متصلة.

الطريقة التي ربطتها هي setAutoConnect ، وليس setAutoReconnect . أعتقد أن هذه الأساليب مختلفة. setAutoReconnect هنا . إنه يضع علمًا فقط ، وأعتقد أن المكان الوحيد الذي يستخدم فيه العلم هو هنا .

نظرًا لاسم الطريقة ، وكيفية استخدام هذه العلامة داخليًا ، يبدو أن هذه الطريقة من المفترض أن تفعل ما يفترض الناس أنها تفعله - تمكين / تعطيل المحاولات التلقائية لإعادة الاتصال بـ AP بعد قطع الاتصال.

فكرتي هي أن هذه الميزة لا تعمل كما هو متوقع ، وأعتقد أنه من المحتمل أن يكون ذلك بسبب استخدام SDK داخليًا WiFi.begin() ، والذي سيؤدي إلى مسح SSID إذا لم يكن AP المحفوظ موجودًا ، كما اكتشفت أعلاه.

إذن هكذا يبدو أن الأمر يحدث. هل يمكن تحديث SDK لعدم مسح نقطة الوصول إذا لم تظهر على الفور. أو للقيام بشبكة WiFi ، ابدأ في استخدام آخر SSID وكلمة مرور معروفين إذا كان WiFi.setAutoReconnect (صحيحًا) أو هل فقدت شيئًا؟

إذا كان تفكيري / حفري صحيحًا ، فأنا أشك حقًا في أن هذا السلوك مقصود أو متوقع. يبدو من المحتمل أن setAutoReconnect يُقصد به أن يكون لديه الوظائف التي يتوقعها الأشخاص في هذا الموضوع ، ولديه فقط بعض الأخطاء.

اقتراحي هو العمل على حلها في الوقت الحالي. في مشروعي الخاص ، أقوم فقط بإرفاق معالج حدث يعمل

WiFi.disconnect(true);
WiFi.begin(ssid, passwd);

ويعمل بالنسبة لي.

يبدو أن إعادة الاتصال تتم معالجتها حاليًا بواسطة Arduino SDK بدلاً من العناصر الأساسية. باستخدام ESP8266 Arduino SDK ، تتم إعادة الاتصال بواسطة حزمة تطوير البرامج (SDK) غير التابعة لنظام التشغيل. لذا من المحتمل أن يبدو إصلاح ESP32 Arduino SDK كثيرًا مثل هذا الحل الخارجي على أي حال (مرة أخرى - بافتراض صحة تفكيري. قد أكون مخطئًا بالتأكيد).

تحرير - هنا هو القسم المناسب في الكود الخاص بي الذي يعالج إعادة الاتصال.

تضمين التغريدة
أنت محق.
تضمين التغريدة
أتفق مع sidoh ، يمكنك

بعد بعض الحفر وجدت أن هذا يعمل بشكل جيد:

static bool sta_was_connected = false;

static void poll_connection(void) {                                         
#ifdef ESP32
  // this is a crude workaround due to the inability of
  // the ESP32 to reconnect to an accesspoint automatically.
  //
  // https://github.com/espressif/arduino-esp32/issues/653

  static uint32_t ms = millis();

  if (!WiFi.isConnected() && (millis() - ms) > 1000 * 5) {
    ms = millis();

    if (sta_was_connected) WiFi.reconnect(); else WiFi.begin();
  }
#endif
}

loop() {
  poll_connection();
}

في معالج حدث WiFi لـ SYSTEM_EVENT_STA_GOT_IP ، يجب عليك تعيين sta_was_connected إلى true.

سيعمل هذا أيضًا عندما لا تكون نقطة الوصول متاحة عند تشغيل ESP32.

الميزة هي أنه لا يمسح تكوين STA. هذا مفيد بشكل خاص إذا قمت بتعيين تكوين IP ثابت (لا تستخدم DHCP).

هل تحصل على
[D][WiFiGeneric.cpp:293] _eventCallback(): Event: 8 - STA_LOST_IP
إذا انتظرت طويلا (هناك تأخير)

سأحاول

    } else if(event->event_id == SYSTEM_EVENT_STA_LOST_IP) {
        if(WiFi.getAutoReconnect()){
            WiFi.begin();
        }

إليك حل عملي يتجاوز بعض المشكلات المتعلقة بمكتبة WiFi.
لاحظ حلقات while بعد WiFi.begin ().
لقد وجدت أن تأخير الاتصال يختلف باختلاف جهاز التوجيه وإعدادات التشفير ، يبدو أن AES و WPA2 هو الأفضل والأسرع والأكثر موثوقية.

تحقيقا لهذه الغاية ، الانتظار حتى تعرف أن الاتصال يعمل ولكن مع التأكد من عدم قفله ، فإنه يفعل ذلك إلى حد كبير.

لقد لاحظت أن البعض يتصلون بشبكة WiFi.disconnect (). احرص على استخدام WiFi.persistent (false) ؛ مع ذلك أو في كل مرة تتعافى فيها ، تقوم بإعادة كتابة NV FLASH وستقوم بتجميده عندما يموت FLASH.

نموذج رمز جزئي

setup()
{
  WiFi.begin( rssiSSID , password );

  int WLcount = 0;
  while (WiFi.status() != WL_CONNECTED && WLcount < 250 ) 
  {
    delay( 100 );
    #ifdef DEBUG
       Serial.print(".");
    #endif
    ++WLcount;
  }
}

void loop() 
{
  if (WiFi.status() ==  WL_CONNECTED) 
  {
    // PUT_YOUR_UP_TIME_CODE_HERE   

    #ifdef DEBUG
       Serial.print("C");
       if (UpCount >= 20)   // just keep terminal from scrolling sideways
       {
        UpCount = 0;
        Serial.println();
       }
       ++UpCount;
    #endif

      // END WiFi connected loop()
  } else
  {
    // PUT_YOUR_DOWN_TIME_CODE_HERE
    //  WiFi DOWN loop

    #ifdef DEBUG
        WFstatus = getWifiStatus( WFstatus );
    #endif

    WiFi.begin( rssiSSID , password );
    int WLcount = 0;
    // loop - depending on router, connect can be from 4 - 20 seconds
    // usually longer to reconnect than the connect at boot
    // lopping till reconnect seems to let it settle
    // usually around 80 count to breakout
    while (WiFi.status() != WL_CONNECTED && WLcount < 250 ) 
    {
        delay( 100 );
        #ifdef DEBUG  
            Serial.print(".");
            // just keep terminal from scrolling sideways in test
            if (UpCount >= 20)
            {
                UpCount = 0;
                Serial.println();
            }
            ++UpCount;
        #endif
        ++WLcount;
    }
    delay( 1000 );
  }  // END WiFi DOWN 
} // END loop()


int getWifiStatus( int WiFiStatus  )
{
  WiFiStatus = WiFi.status();
  Serial.print("\tStatus "); Serial.print( WiFiStatus );
  switch( WiFiStatus )
     {
        case WL_IDLE_STATUS :           // WL_IDLE_STATUS     = 0, 
                Serial.println(", WiFi IDLE "); 
                break;
        case WL_NO_SSID_AVAIL:          // WL_NO_SSID_AVAIL   = 1,
                Serial.println(", NO SSID AVAIL ");
                break;
        case WL_SCAN_COMPLETED:         // WL_SCAN_COMPLETED  = 2,
                Serial.println(", WiFi SCAN_COMPLETED "); 
                break;
        case WL_CONNECTED:      // WL_CONNECTED       = 3,
                Serial.println(", WiFi CONNECTED "); 
                WiFi.persistent(true);  
                break;
        case WL_CONNECT_FAILED:         // WL_CONNECT_FAILED  = 4,
                Serial.println(", WiFi WL_CONNECT FAILED"); 
                break;
        case WL_CONNECTION_LOST:        // WL_CONNECTION_LOST = 5,
                Serial.println(", WiFi CONNECTION LOST");
                WiFi.persistent(false); // don't keep writing FLASH
                break;   
        case WL_DISCONNECTED:            // WL_DISCONNECTED    = 6
                Serial.println(", WiFi DISCONNECTED ==");
                break;
  }
  return WiFiStatus;
}  // END getWifiStatus()

======
يستغرق في المتوسط ​​8-15 ثانية لاكتشاف تغيير الوضع
ملاحظة "." متصلة
"C" متصلة

OUTPUT
CCCCCCCCC     Status 5, WiFi CONNECTION LOST    Unplugged Router here
.........
....................                            Trying
 More lines of dots...
....................
...........       Status 1, NO SSID AVAIL       Gave up, Changed Modes
.........                                       Replugged Router here
....................
................CCCC                            TaDa I'm Back...
CCCCCCCCCCCCCCCCCCCC

أنا أستخدم هذا ، يبدو أنه يعمل بالنسبة لي

void WiFiEvent(WiFiEvent_t event){
    if(event == SYSTEM_EVENT_STA_DISCONNECTED){
      Serial.println("Event: SYSTEM_EVENT_STA_DISCONNECTED, reconnecting");
      WiFi.reconnect();
    }
}

if(WiFi.getAutoReconnect()) WiFi.onEvent(WiFiEvent);

أعتقد أن شقتي مع 50 نقطة وصول قريبة هي حقًا مكان رائع لاختبار هذه المشكلة. الحل من tablatronix يتسبب في تفريغ esp32 ولا أرى كيف سيفيد حل mickeypop أي فائدة ، وهو ما لم يساعد. لقد وجدت أن إعادة تشغيل اتصال wifi يعمل بشكل جيد إلى حد ما ، ولكن حتى ذلك يتطلب إعادة تعيين الطاقة الصلبة بين الحين والآخر. على الجانب ، لدي esp8266 في نفس البيئة التي لا تتطلب أي تدخل يدوي. لقد جربت بعض الاقتراحات الأخرى هنا دون حظ.

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

تحرير: بعد تجربة الكثير من الأشياء: tablatronix إذا قمت بتشغيل هذا الخط بسرعة كبيرة فإنه يتعطل / يعطي backtrace. الاتصال كل بضع ثوان لا يعطيني أي مشاكل. الآن دعها تعمل لبضعة أيام لنرى ما سيحدث
if(WiFi.getAutoReconnect()) WiFi.onEvent(WiFiEvent);
Edit2: استمرت 30 دقيقة قبل الانطلاق

thefatmoop واجهت مشكلة إعادة اتصال WiFi التي انتهى بها الأمر إلى مشكلة تلف NVS. # 1147 أعدت كتابة رسم لتفريغ بيانات nvs. جربه والتقط الإخراج. قد تظهر شيئا.
إظهار مفاتيح NVS

تشاك.

thefatmoop

يجب أن يعمل كلا الحلين.
كما لاحظت ؛ "_هنا حل عملي يتجاوز بعض المشكلات المتعلقة بمكتبة WiFi ._"

بينما يتجاوز أحدهما بعض مشكلات المكتبة ، يستخدم الآخر خدمة WiFi.onEvent () ، كلاهما يكتشف ببساطة عند

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

إذا لم يكن وقت تأجير جهاز التوجيه هو نفسه في بعض الأحيان "تنسى" الأجهزة التحديث مما يتسبب في عدم وجود عنوان IP على الرغم من أن اتصال WiFi لا يزال موجودًا في بعض الأحيان.

  • يجبر WiFi.begin () DHCP على الحصول على عنوان IP جديد مع اتصال جديد.
  • WiFi.reconnect () يعمل ولكنه يفترض غالبًا أن الوحدة لا تزال تمتلك عنوان IP وقد لا تقوم بطلب DHCP.

الطريقة البسيطة للتغلب على ذلك هي Ping على جهاز توجيه DHCP بشكل دوري.
هذا يفرض على جهاز التوجيه معرفة أنك ما زلت على الشبكة والحفاظ على عقد الإيجار الحالي.

قد تعيد إعادة التشغيل الاتصال ، ولكنها لا تتناول سبب قطع الاتصال وغالبًا ما تخرج التطبيقات من المزامنة إذا كنت تعيد التشغيل ببساطة.

لذا فإن إعادة الاتصال دون إعادة التشغيل غالبًا ما تكون ضرورة.

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

الحل من tablatronix يعمل من أجلي ، شكرًا! thefatmoop يمكنك التحقق من التنفيذ على كود OpenMQTTGateway.ino .

تم استدعاء الكود بعد فصل MQTT ، إذا وضعت الكود خارج هذا الشرط ، فإن تفريغ ESP بالفعل.

إذا أعاد الاتصال WiFi.reconnect() ، لكن عميل MQTT لا ، يمكنك عمل setup_wifi() : مع قطع الاتصال () delay () والبدء () ، بعد عدة محاولات لإعادة الاتصال بالعميل وهو يعمل بشكل رائع داخل الجديد الإتصال. ولكن ماذا يحدث عندما يكون خادم MQTT معطلاً؟

هذه مشكلة على مستوى التطبيق ..

تمت إضافة اقتراح كود mickeypop إلى الويكي

آسف. أنا مبتدئ في برمجة اردوينو / esp. أنا أيضًا أواجه أخطاء / مشاكل اتصال wifi وإعادة الاتصال. الجزء الخاص بي من الكود الذي يدير كلاً من عميل WiFi و MQTT (PubSubClient) ، والذي يعمل بالفعل على ESP32 من Adafruit / Huzzah32:

void setupWiFi() {
  WiFi.disconnect(true);
  WiFi.begin(WLAN_SSID, WLAN_PASS);
  WiFi.waitForConnectResult();
}

boolean clientReconnect() {
  if(client.connect("esp32_client")) {
    client.subscribe("/test");
  }
  return client.connected();
}

boolean wifi_connected_once = false;
unsigned long last_client_reconnect_attempt = 0;
int client_reconnect_attempts = 0;

void setup() {  
  client.setServer(MQTT_SERVER, 1883);
  client.setCallback(client_callback);
}

void loop() {
  unsigned long loop_start = millis();

  if(WiFi.isConnected()) {
    // WiFi connected
    if(client.connected()) {
      // client connected
      // publish data every 5 seconds
      if(loop_start - last_client_publish >= 5000) {
        client_publish_data();
        last_client_publish = loop_start;
      }
      client.loop();
    } else {
      // client not connected
      // try reconnect a few times every 5 seconds
      if(client_reconnect_attempts <= 5) {
        if(loop_start - last_client_reconnect_attempt > 5000) {
          client_reconnect_attempts++;
          if(clientReconnect()) {
            // client connected
            client_reconnect_attempts = 0;
          }
          last_client_reconnect_attempt = loop_start;
        }
      } else {
        // maybe MQTT server is down
        // try reconnect in 5 minutes
        if(loop_start - last_client_reconnect_attempt > 300000) {
          last_client_reconnect_attempt = loop_start;
          client_reconnect_attempts = 0;
        }
      }
    }
  } else {
    // WiFi not connected
    // try connect for the first time or 
    // try reconnect every 2 minutes
    if((loop_start - last_client_reconnect_attempt > 120000) || wifi_connected_once == false) {
      last_client_reconnect_attempt = loop_start;
      wifi_connected_once = true;
      client_reconnect_attempts = 0;
      setupWiFi();
    }
  }
}

تم الاختبار مع بعض عمليات إعادة تشغيل جهاز التوجيه ويبدو أن الكود يعمل دون الحاجة إلى إعادة تشغيل برنامج ESP.
هل لديك أي اقتراح أفضل بكثير؟

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

آخر مرة تركتها تعمل وحاولت أكثر من أربع آلاف محاولة ، لم ينجح أي منها.

لقد حاولت حتى الآن:

1) تمكين إعادة الاتصال التلقائي وإعادة الاتصال
2) تعطيل إعادة الاتصال التلقائي وفصل وإعادة الاتصال يدويًا. في هذا التكوين ، جربت كلتا الطريقتين لإيقاف تشغيل الهوائي تمامًا أم لا. لا يعمل في أي وضع.

هنا لديك بعض السجلات (هذا قيد التشغيل حاليًا مع أكثر من 600 محاولة لإعادة الاتصال على جهاز توجيه يعمل بشكل مثالي (TP-LINK):

تحذير: فقدت شبكة WiFi الاتصال. محاولة إعادة الاتصال محاولة 632 في التكرار التالي
بدء محاولة إعادة الاتصال بشبكة WiFi 632
I (14944038) wifi: mode: softAP (30: ae: a4: 1a: ca: 1d)
إنشاء WiFi باستخدام SSID "Nano BAB - التطوير" وكلمة المرور "#######"
الاتصال بشبكة WiFi "TP-LINK_A8FB38"
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): الحدث: 3 - STA_STOP
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): الحدث: 2 - STA_START
حدث [WiFi]: 2
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): الحدث: 5 - STA_DISCONNECTED
[W] [WiFiGeneric.

كما ترون ، هناك فشل في المصادقة ولكن كلمة المرور صحيحة. في بعض المحاولات السابقة (الرقم 578 !!) من نفس المثال يثير الخطأ 2:

تحذير: فقدت شبكة WiFi الاتصال. محاولة إعادة الاتصال 578 في التكرار التالي
بدء محاولة إعادة الاتصال بشبكة WiFi 578
I (14134199) wifi: mode: softAP (30: ae: a4: 1a: ca: 1d)
إنشاء WiFi باستخدام SSID "Nano BAB - التطوير" وكلمة المرور "#########"
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): الحدث: 3 - STA_STOP
حدث [WiFi]: 3
الاتصال بشبكة WiFi "TP-LINK_A8FB38"
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): الحدث: 13 - AP_START
[حدث WiFi]: 13I (14134890) wifi: الوضع: sta (30: ae: a4: 1a: ca: 1c) + softAP (30: ae: a4: 1a: ca: 1d)
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): الحدث: 2 - STA_START *

[حدث WiFi]: 2 [D] [WiFiGeneric.cpp: 293] _eventCallback (): الحدث: 2 - STA_START
[حدث WiFi]: 2I (14137748) wifi: ضبط قناة ap o: 1،1 n: 6،1
أنا (14137749) wifi: n: 6 1، o: 1 0، ap: 6 1، sta: 6 1، prof: 1
أنا (14138422) wifi: state: init -> auth (b0)
أنا (14139423) wifi: state: auth -> init (2)
أنا (14139424) wifi: n: 6 0، o: 6 1، ap: 6 1، sta: 6prof: 6
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): الحدث: 5 - STA_DISCONNECTED
[W] [WiFiGeneric.

إنه دائمًا أحد الخطأين. في النهاية هو ببساطة أنه لا يعيد الاتصال.

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

راجع للشغل ، أنا أركض مع:

يعمل على SDK: "v3.1-dev-239-g1c3dd23f-dirty"
تردد وحدة المعالجة المركزية: 240 ميجا هرتز
تعمل شبكة WiFi على إنشاء شبكة WiFi خاصة بها والاتصال بواحدة أخرى مع إمكانية الوصول إلى الإنترنت

متى كانت آخر مرة سحبت فيها من الريبو؟

1132

لقد قمت فقط بنشر السجلات ، ولا يوجد حل تخطيطي أو إعادة الاتصال.

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

WiFi.disconnect(true);
WiFi.softAP(wifiName, wifiPassword);
WiFi.begin(connectoToWifiSSID, connectToWifiPassword);

ثم أتعامل مع أحداث WiFi وخاصة الحدث SYSTEM_EVENT_STA_DISCONNECTED . عندما يحدث هذا الحدث ، جربت 3 طرق مختلفة لإعادة الاتصال:

1) عندما تم تمكين Wifi autoreconnect ، غادرت النظام للتعامل مع إعادة الاتصال بنفسه
2) لقد حاولت عن طريق تعطيل الاتصال التلقائي وفي هذا الحدث ، اتصل
3) آخر ما أحاوله هو قطع الاتصال عن طريق إيقاف تشغيل الراديو والاتصال مرة أخرى إذا لم يكن هناك فصل آخر تم تشغيله. لدي شيء مثل:

reconnections++;
needsReconnection = true;
reconnectionDetection = millis();
Serial.printf("\r\nWARNING: WiFi lost connection. Trying reconnection attempt %d on next iteration\r\n", reconnections);

needReconnection عبارة عن علامة يتم التحقق منها في الحلقة الرئيسية وتقوم بتشغيل الاتصال مرة أخرى عن طريق تشغيل الأسطر الثلاثة الأولى من التعليمات البرمجية.

آمل أن يكون ذلك منطقيًا الآن ؛-)

لست متأكدًا مما إذا كانت هناك طريقة أخرى للقيام بذلك.

لقد نسيت أن أذكر أنني أقوم بتشغيل خادم نمس جدًا لتنفيذ Rest API ، مما يسمح بحد أقصى 3 اتصالات متزامنة. لست متأكدًا مما إذا كان هذا هو سبب ذلك.

  1. لا يوجد اتصال تلقائي ، هذا هو الغرض من هذه المشكلة.
  2. WiFi.Reconnect قد لا يكون هو نفسه قطع الاتصال ، ابدأ () (dhcp ، إلخ)
  3. قد يكون هذا الوضع خاصًا ، فبدون رمز لا يعرف أحد ما تفعله ، أو لا توجد فكرة عن كيفية تعاملك مع الأحداث ، أو "إيقاف تشغيل الراديو"

أقترح إجراء تغييرات وإجراء حالة اختبار بسيطة.

جوسمونباف

قد تكون مشكلتك متعلقة بوضع WiFi

كودك

WiFi.softAP(wifiName, wifiPassword);
WiFi.begin(connectoToWifiSSID, connectToWifiPassword);

تقوم بتشغيل أوضاع مختلطة.
WiFi.softAP () ؛ الافتراضي هو وضع WIFI_MODE_AP

WiFi.begin () ، الافتراضي هو وضع WIFI_AP_STA

إذا تابعت مع وضع WIFI_MODE_APSTA (الوضع المختلط) فلا ينبغي أن يتغيروا ولن يختلط WiFi EVENT مع أوضاع مختلفة.

WiFi.mode( WIFI_MODE_APSTA );
WiFi.softAP(wifiName, wifiPassword);
WiFi.begin(connectoToWifiSSID, connectToWifiPassword);

معلومات مرجعية
في esp_wifi_types.h

typedef enum {
    WIFI_MODE_NULL = 0,  /**< null mode */
    WIFI_MODE_STA,       /**< WiFi station mode */
    WIFI_MODE_AP,        /**< WiFi soft-AP mode */
    WIFI_MODE_APSTA,     /**< WiFi station + soft-AP mode */
    WIFI_MODE_MAX
} wifi_mode_t;

في wifitypes.h

typedef enum {
    WL_NO_SHIELD        = 255,   // for compatibility with WiFi Shield library
    WL_IDLE_STATUS      = 0,
    WL_NO_SSID_AVAIL    = 1,
    WL_SCAN_COMPLETED   = 2,
    WL_CONNECTED        = 3,
    WL_CONNECT_FAILED   = 4,
    WL_CONNECTION_LOST  = 5,
    WL_DISCONNECTED     = 6
} wl_status_t;

مرحبًا ميكيبوب ،

أنا بصدد اختبار الحل الخاص بك من:


WiFi.mode( WIFI_MODE_APSTA );
WiFi.softAP(wifiName, wifiPassword);
WiFi.begin(connectoToWifiSSID, connectToWifiPassword);

أنا أتصل بـ WiFi.reconnect () عندما يحدث الحدث SYSTEM_EVENT_STA_DISCONNECTED ، والذي جربته عن طريق فصل جهاز التوجيه يدويًا ويبدو أنه يعمل (كان هذا الشيء يعمل من قبل أيضًا).

حتى الآن كان يعمل طوال الليل لمدة 7 ساعات بدون توقف على 2 ESP32 مختلف. لقد قمت باختبار اتصالهم كل 5 ثوانٍ ولا توجد مشكلات حتى الآن. لم أستطع تخيل أن إعلان الوضع المختلط قد يكون السبب ، اعتقدت أنه تم تمكينه تلقائيًا عند استدعاء WiFi.begin و WiFi.softAP () تشابك الاصابع. سأبدأ الآن بإجراء المزيد من الاختبارات الثقيلة للتأكد من أنه الحل للمشكلات التي أواجهها.

بالمناسبة ، شكرا جزيلا لك !!

mickeypopjosmunpav شكرا لتبادل النتائج الخاصة بك.
أضفته إلى الويكي

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

الكثير من هذا لا معنى له كما أشار everslick بوضوح أعلاه: https://github.com/espressif/arduino-esp32/issues/653#issuecomment -356515973. في الحقيقة لا أستطيع أن أصدق أنني نشرت هذا منذ 6 أشهر وما زلت أتحدث عنه في حين أنه لا ينبغي أن يكون مشكلة في المقام الأول.

لماذا يسمى شيء ما "إعادة الاتصال التلقائي" الذي لا يتم إعادة الاتصال التلقائي هو أمر غير محير. يبدو أن الجميع يصنعون رمزًا خاصًا لتجاوز هذا النقص / الخطأ. سأقوم بسحب نسخة جديدة من الكود وإعادة تحميل ملفات لاقتراح tablatronix ولكن بيت القصيد من هذا هو أننا لا ينبغي علينا القيام بأي من هذا .... يجب أن يعمل مثل ESP8266 وإعادة الاتصال من تلقاء نفسه !

أنا شخصياً ما زلت أواجه مشكلة في إغلاق الشريحة تمامًا في بعض الأحيان عندما تدخل في حلقة الفصل هذه. لدي العد إلى 10 وإعادة التشغيل ولكن بشكل عشوائي (1 من 15 أو نحو ذلك يعيد التشغيل) لا يتم إعادة التشغيل والأقفال الصلبة فقط التي تتطلب إعادة تشغيل باردة. كنت سأنتقل إلى ESP8266 بنبض القلب إذا كان لديه مدخلات تناظرية أفضل / أكثر ولكن للأسف لا. لا يعني ذلك أن ESP32 جيد جدًا في ذلك أيضًا (https://www.esp32.com/viewtopic.php؟f=19&t=2881).

في esp8266 تم تنفيذ autoreconnect في SDK ، ولا يوجد تطبيق في esp32 ، لذلك تمت إضافته إلى المكتبة لتحقيق نوع من التوافق ، على الرغم من أنه يتم تنفيذه فقط مقابل WIFI_REASON_AUTH_EXPIRE

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

ناهيك عن أنه إذا نفذت espressif هذا في SDK ، فقد أهدرنا كل وقتنا.

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

  • إعادة الاتصال ، قد تفشل مهمة dhcp ، بدلاً من قطع الاتصال () ، تبدأ () **
  • يتسبب التوصيل التلقائي في إصدار wl_status خاطئ ، وحلقة لانهائية
  • يرسل sdk auth_expire for auth_fail على بعض أجهزة التوجيه ، المشغلات أعلاه
  • esp_wifi_set_mode هي شروط السباق غير المتزامنة
  • اتصال تلقائي ، لا يعمل حتى ، https://github.com/espressif/arduino-esp32/issues/173

** reconnect does not enablesta, it just returns false, you should always be checking for return values!

في حالة استخدام الحل البديل أعلاه ، أقترح تعطيل الاتصال التلقائي لتجنب 2 من هذه الأخطاء.

مرحبًا يا شباب ، لقد عدت مع عينة تعيد إنتاج المشكلات التي أواجهها. العينة مليئة بالتعليقات ولكنها تتكون أساسًا من:

  1. مهمتان: المهمة الرئيسية والويب / wifi (تم تنفيذه بواسطة مكتبة mongoose 6.11)
  2. بعض الكائنات المشتركة للقيام بمهام وهمية مثل إعداد PWM على دبوس ، وقراءة متوسط ​​قيمة ADC وعداد int مشترك
  3. صفحة اختبار على http: // your_esp32_ip / يمكنك تركها قيد التشغيل
  4. إشارة لتجنب تلف البيانات بين المهام. تقوم المهمة الرئيسية بإجراء تغييرات على دبوس pwm ، وتقرأ من ADC وتزيد من العداد. تقدم مهمة الويب تلك البيانات في الصفحة الرئيسية.
  5. طرق WiFi النموذجية للاتصال وفصل ومعالجة أحداث WiFi.
  6. يتم تشغيله في وضع APSTA ، لذا فأنت بحاجة إلى تكوين شبكة WiFi الخاصة بك (يحتاج WiFi الخاص بك إلى اتصال بالإنترنت حيث تستخدم صفحة الويب الرئيسية jQuery من CDN لإجراء مكالمات API التي تم تنفيذها بواسطة ESP32 في العينة)

ما وجدته حتى الآن هو أنه إذا قمت بتعطيل المهام الوهمية (هناك علامة لها) ، فستعمل كلتا المهمتين بشكل جيد إلى ما لا نهاية. إذا قمت بتمكينها ، ففي النهاية (قد يستغرق الأمر ساعات أحيانًا ولكن يحدث عادةً في غضون الساعة الأولى) ، يتم قطع اتصال ESP32 بشبكة WiFi ولا يمكنه إعادة الاتصال ، ويقوم بتشغيل محاولة الاتصال كل 10 ثوانٍ دون نجاح طوال الوقت.

أعتقد أن هناك بعض التداخل بين مكتبة ADC أو PWM (تم تنفيذها بواسطة esp32-hal-ledc.h ) ، لأنني لم أتمكن من إعادة إنتاج المشكلة عندما لا تفعل المهمة الرئيسية شيئًا سوى الانتظار الوهمي.

هناك شيء آخر لاحظته عندما يحدث انقطاع الاتصال ، تنخفض إشارة WiFi لـ AP كثيرًا. لقد تحققت من هذا على هاتفي الذكي.

هذه هي رسائل سجل WiFi النموذجية التي يمكنك العثور عليها عندما تفشل:

[WiFi-event] event: 5
Disconnected from WiFi. Trying connection again in 10000ms
Web/Main Task is up and running. Shared counter is 11309, Average ADC Value = 1305.000000, PWM Value = 0
Connecting to WiFi 'TP-LINK_A8FB38' with password: 'C1A8FB38' on connection attempt = 108
Oops, there was a problem when connecting. It returned error: 1[D][WiFiGeneric.cpp:293] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:298] _eventCallback(): Reason: 2 - AUTH_EXPIRE

يرجى العثور على كود المصدر المرفق وعينات الصفحات:

working
not_working

ESP32_APSTA_Mode_Disconnection_Test.zip

ملاحظة: تطبيقي الحقيقي يقوم بنفس الشيء. بدء وضع APSTA بمهمتين ، واحدة لتحديث أجهزة الاستشعار والأجهزة و GPIOS والثانية للتعامل مع WiFi وخادم الويب الذي تم تنفيذه بواسطة mongoose ومواجهة نفس المشكلة.

لقد صممت هذا الرسم لاختبار الاتصال ، والحصول على وقت كل 10 ثوانٍ 10 مرات ، وفصل wifi ، وإعادة توصيل wifi. يبدو أنه يعمل بشكل جيد جدًا ، لذا فأنا أقوم بتنفيذ التعليمات البرمجية الأخرى للتشغيل لبضعة أيام لأنني كنت أواجه مشكلات في إعادة الاتصال.

#include <WiFi.h>
#include "time.h"

const char* ssid       = "ssid1";
const char* password   = "password1";

const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 3600;
const int   daylightOffset_sec = 3600;

byte wfConnectTry = 0;
byte loopCnt = 0;

void printLocalTime()
{
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("Failed to obtain time");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}

void setup()
{
  Serial.begin(115200);

  //connect to WiFi
  Serial.printf("Connecting to %s ", ssid);
  //WiFi.begin(ssid, password);
  wifiStart();
  //init and get the time
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  if (WiFi.status() == WL_CONNECTED) {
    printLocalTime();
  }

}

void loop()
{
  delay(10000);
  printLocalTime();
  while (WiFi.status() != WL_CONNECTED || wfConnectTry >=5) {
    wfConnectTry++;
    wifiReconnect();

  }
  if (loopCnt >= 10){
    wifiReconnect();
  }
  loopCnt++;
}

void wifiReconnect()
{
  Serial.println(F("Disconnecting"));
  WiFi.disconnect(true);
  delay(500);
  Serial.println(F("Starting WiFi!"));
  wifiStart();
  loopCnt = 0;
}

void wifiStart()
{
  unsigned long timer1 = millis();
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED && millis() - timer1 < 5000UL) {
    delay(500);
    Serial.print(".");
  }
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println(F(" CONNECTED"));
    wfConnectTry = 0;
  }
  else {
    Serial.println(F("Could not connect!"));
  }
}

.... شكرا لنصيحة الرمز

استخدم أسوار الكود ثلاث علامات التجزئة الجديدة قبل amd بعد

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

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

gdombiak ، هل لديك أي معلومات تصحيح لإظهار ما يفعله ESP32 عند قفله؟ كان لدي مشكلة حديثة حيث عملت إحدى رسوماتي مثل البطل إلا عندما انقلب يوم جديد وكان هناك سطرين يضعانه في حلقة مستمرة وأخيراً قام ESP بالتخلص من نفسه حتى أقوم بإعادة التعيين أو إعادة التحميل. كانت هناك مشكلة أخرى لدي وهي أن لدي ESP آخر كان يعمل كـ AP_STA وظل يحاول الاتصال به بدلاً من WiFI العادي. كان لا بد من إعادة تحميل ESP الآخر واشتراط WiFi.mode (WIFI_STA) لإصلاح ذلك.

تضمين التغريدة

تحقق من المنشور الذي وضعته على: https://github.com/espressif/arduino-esp32/issues/1100
ابحث عن " SmartConfig / WiFi skeleton "

لقد كتبت هيكلًا عظميًا كاملاً ؛ يحفظ ، مضبوطًا مع SmartConfig ، ويتعامل مع WiFi UP و DOWN ، ويعيد الاتصال التلقائي إذا كان Down.

إنه هيكل كامل وقد تمت إعادة الاتصال به دائمًا عندما تعطل WiFi أو انقطع الاتصال لأسباب غير معروفة.

دون ملاحظة في الحلقة () لـ " // WiFi DOWN ". أستخدم if () / else بسيطًا لتتبع حالة WiFi.
بسبب مكتبات espressif ، يستغرق الأمر حوالي 30-40 ثانية للإبلاغ عندما تكون شبكة WiFi معطلة ثم تبدأ في البحث عن إعادة الاتصال.

إذا تم تدوير الطاقة لـ AP ، يستغرق تشغيل AP حوالي 30 ثانية و 15 ثانية أخرى لإعادة الاتصال ولكن يتم إعادة الاتصال دائمًا.

تضمين التغريدة

هناك طريقة للبحث عن قفل إذا تمت طباعة Traceback على الجهاز.

تثبيت "فك استثناء ESP" من ؛ https://github.com/me-no-dev/EspExceptionDecoder
التعليمات هناك.

بمجرد التثبيت ، ما عليك سوى نسخ ولصق سطر traceback وسيخبرك بما يحدث عند الإغلاق.

تحية للجميع،

الكود التالي يعمل لأجلي.

wifi باطل إعادة الاتصال () {
بينما (WiFi.status ()! = WL_CONNECTED) {
WiFi.begin (SSID ، كلمة المرور) ؛
لـ (int i = 0 ؛ i <= 50 ؛ i ++) {
الكتابة الرقمية (LED_BUILTIN ، عالية) ؛
تأخير (100) ؛
Serial.print (".") ؛
الكتابة الرقمية (LED_BUILTIN ، منخفضة) ؛
تأخير (100) ؛
}
}
}

استخدم هذا في الحلقة () كـ

إذا (WiFi.status ()! = WL_CONNECTED) {
wifiReconnect () ؛
}

تحية للجميع
كنت أستخدم ESP32 الأساسية التي تم تحديثها منذ حوالي شهرين.
في برنامجي ، أستخدم Wifi.begin (ssid ، pass) في الإعداد () واستدعاء طريقة WiFi.reconnect () في حدث "SYSTEM_EVENT_STA_DISCONNECTED". كان النظام يتصل تلقائيًا إذا كان هناك أي انقطاع. لكن بالأمس قمت بالتحديث إلى أحدث نواة وبدأت في إعطاء خطأ برمز السبب 8.
بعد بعض النتائج والتجارب ، قمت بالتعليق على WiFi.reconnect () ثم بدأ العمل بشكل مثالي. كما يعيد wifi الاتصال تلقائيًا إذا تم إيقاف تشغيل AP وتشغيله.

في حالتي فقط في طريقة الإعداد التي أستخدمها
WiFi.mode (WIFI_STA) ؛
Wifi.begin ()

هذا يعمل بشكل صحيح.
هل يمكننا القول أنه في النواة الجديدة ليست هناك حاجة لاستدعاء إعادة الاتصال () ويعمل الاتصال التلقائي الآن في أحدث نواة؟

صيح. ليست هناك حاجة للاتصال بإعادة الاتصال بعد الآن ؛) لقد تم إصلاح ذلك: P

يوجد عيب خطير في شبكة wifi. أعد الاتصال ().

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

لقد أثبتت ذلك بمجرد شراء إضافة مكالمة UDP في بعض كود الاختبار. - يمكنني التحدث إلى AP بواسطة UDP ولكن لم يكن لدي عنوان IP. في نفس الوقت ظهر MAC في قائمة اتصال AP.

تريد استخدام wifi.begin () فهو موثوق به دائمًا. - يجب عليك ببساطة التأكد من أنك تعطل عند الاتصال به للاتصال أو قد ينتهي بك الأمر بمشكلات تجاوز سعة المكدس.

_ القالب الذي كتبته أدناه لم يفشل أبدًا في إعادة الاتصال. _ إنه يستخدم SmartConfig والتفضيلات بدلاً من الترميز الثابت لـ AP / Pass على الرغم من أنه يمكن تغيير ذلك بسهولة.

بعض الكود الخاص بي مملوك لمصباح LED لذا تركت التعليقات في مكانها بدلاً من ذلك. يمكنك وضع أي رمز مؤشر تريده هناك.

ألقِ نظرة على الجزء السفلي من wifi من الحلقة (). اتصل بـ WiFi.begin (PrefSSID.c_str () ، PrefPassword.c_str ()) ؛ أثناء الاختبار دائمًا لحالة إرجاع WL_CONNECTED.

أتمنى أن يساعد هذا البعض.

// ESP32 only,  8266 will not work here
#include "FS.h"
#include "esp_system.h"
#include <esp_wifi.h>
#include <string.h>
#include <WiFi.h>
#include <Preferences.h> // WiFi storage

const char* rssiSSID;        // NO MORE hard coded set AP, all SmartConfig
const char* password;
String PrefSSID, PrefPassword;   // used by preferences storage

int WFstatus;
int UpCount; = 0;
int32_t rssi;         // store WiFi signal strength here
String getSsid;
String getPass;
String MAC;

// SSID storage
  Preferences preferences;       // declare class object
// END SSID storage

void setup() {
  Serial.begin(115200);

  Serial.printf("\tWiFi Setup -- \n" ); 
  wifiInit();      // get WiFi connected
  IP_info();
  MAC = getMacAddress();

  delay(2000);  // let thing settle
} // END setup()

void loop()
{
  if ( WiFi.status() == WL_CONNECTED )
  {   // Main connected loop

         // ANY MAIN LOOP CODE HERE

  }   // END Main connected loop()
  else
  {      // WiFi DOWN

    //  wifi down start LED flasher here

    WFstatus = getWifiStatus( WFstatus );
    WiFi.begin(  PrefSSID.c_str() , PrefPassword.c_str() );
    int WLcount = 0;
    while (  WiFi.status() != WL_CONNECTED && WLcount < 200 )
    {
      delay( 100 );
      Serial.printf(".");

        if (UpCount >= 60)  // keep from scrolling sideways forever
        {
           UpCount = 0;
           Serial.printf("\n");
        }
        ++UpCount;
        ++WLcount;
    }

    if( getWifiStatus( WFstatus ) == 3 )   //wifi returns
    { 
      // stop LED flasher, wifi going up
    }
   delay( 1000 );
  } // END WiFi down
} // END loop()


void wifiInit() //
{
  WiFi.mode(WIFI_AP_STA); // required to read NVR before WiFi.begin()

  // load credentials from NVR, a little RTOS code here
  wifi_config_t conf;
  esp_wifi_get_config(WIFI_IF_STA, &conf);     // load wifi settings to struct comf
  rssiSSID = reinterpret_cast<const char*>(conf.sta.ssid);
  password = reinterpret_cast<const char*>(conf.sta.password);

  //  Serial.printf( "SSID = %s\n", rssiSSID );  // un-comment for debuging
  //  Serial.printf( "Pass = %s\n", password );  // un-comment for debuging
  // Open Preferences with wifi namespace. Namespace is limited to 15 chars
  preferences.begin("wifi", false);
    PrefSSID     = preferences.getString("ssid", "none"); //NVS key ssid
    PrefPassword = preferences.getString("password", "none"); //NVS key password
  preferences.end();

  // keep from rewriting flash if not needed
  if( !checkPrefsStore() )   // see is NV and Prefs are the same
  {                          // not the same, setup with SmartConfig
    if( PrefSSID == "none" ) // New...setup wifi
    {
      initSmartConfig();
      delay( 3000);
      ESP.restart(); // reboot with wifi configured
    }
  }

  // I flash LEDs while connecting here

  WiFi.begin( PrefSSID.c_str() , PrefPassword.c_str() );

  int WLcount = 0;
  while (WiFi.status() != WL_CONNECTED && WLcount < 200 ) // can take > 100 loops depending on router settings
  {
    delay( 100 );
    Serial.printf(".");
    ++WLcount;
  }
  delay( 3000 );

  // stop the led flasher here

} // END wifiInit()

// match WiFi IDs in NVS to Pref store, assumes WiFi.mode(WIFI_AP_STA); was executed
bool checkPrefsStore()
{
  bool val = false;
  String NVssid, NVpass, prefssid, prefpass;

  NVssid = getSsidPass( "ssid" );
  NVpass = getSsidPass( "pass" );

  // Open Preferences with my-app namespace. Namespace name is limited to 15 chars
  preferences.begin("wifi", false);
    prefssid  =  preferences.getString("ssid",     "none"); //NVS key ssid
    prefpass  =  preferences.getString("password", "none"); //NVS key password
  preferences.end();

  if( NVssid.equals(prefssid) && NVpass.equals(prefpass) )
  { 
    val = true; 
  }
  return val;
} // END checkPrefsStore()

void initSmartConfig()
{
  // start LED flasher here
  int loopCounter = 0;

  WiFi.mode( WIFI_AP_STA );     //Init WiFi, start SmartConfig
  Serial.printf( "Entering SmartConfig\n" );

  WiFi.beginSmartConfig();

  while (!WiFi.smartConfigDone())
  { // flash led to indicate not configured
    Serial.printf( "." );
    if( loopCounter >= 40 )
    {
      loopCounter = 0;
      Serial.printf( "\n" );
    }
    delay(600);
    ++loopCounter;
  }
  loopCounter = 0;

  // stopped flasher here

  Serial.printf("\nSmartConfig received.\n Waiting for WiFi\n\n");
  delay(2000 );

  while( WiFi.status() != WL_CONNECTED )
  { // check till connected
     delay(500);
  }
  IP_info();

  preferences.begin("wifi", false); // put it in storage
    preferences.putString( "ssid" ,    getSsid);
    preferences.putString( "password", getPass);
  preferences.end();

  delay(300);
} // END SmartConfig()

void IP_info()
{
  getSsid = WiFi.SSID();
  getPass = WiFi.psk();
  rssi = getRSSI( rssiSSID );
  WFstatus = getWifiStatus( WFstatus );
  MAC = getMacAddress();

  Serial.printf( "\n\n\tSSID\t%s, ", getSsid.c_str() );
  Serial.print( rssi);  Serial.printf(" dBm\n" );  // printf??
  Serial.printf( "\tPass:\t %s\n", getPass.c_str() ); 
  Serial.print( "\n\n\tIP address:\t" );  Serial.print(WiFi.localIP() );
  Serial.print( " / " );              Serial.println( WiFi.subnetMask() );
  Serial.print( "\tGateway IP:\t" );  Serial.println( WiFi.gatewayIP() );
  Serial.print( "\t1st DNS:\t" );     Serial.println( WiFi.dnsIP() );
  Serial.printf( "\tMAC:\t\t%s\n", MAC.c_str() );
}  // END IP_info()

int getWifiStatus( int WiFiStatus )
{
  WiFiStatus = WiFi.status();
  Serial.printf("\tStatus %d", WiFiStatus );
  switch( WiFiStatus )
  {
    case WL_IDLE_STATUS : // WL_IDLE_STATUS = 0,
        Serial.printf(", WiFi IDLE \n");
        break;
    case WL_NO_SSID_AVAIL: // WL_NO_SSID_AVAIL = 1,
        Serial.printf(", NO SSID AVAIL \n");
        break;
    case WL_SCAN_COMPLETED: // WL_SCAN_COMPLETED = 2,
        Serial.printf(", WiFi SCAN_COMPLETED \n");
        break;
    case WL_CONNECTED: // WL_CONNECTED = 3,
        Serial.printf(", WiFi CONNECTED \n");
        break;
    case WL_CONNECT_FAILED: // WL_CONNECT_FAILED = 4,
        Serial.printf(", WiFi WL_CONNECT FAILED\n");
        break;
    case WL_CONNECTION_LOST: // WL_CONNECTION_LOST = 5,
        Serial.printf(", WiFi CONNECTION LOST\n");
        WiFi.persistent(false); // don't write FLASH
        break;
    case WL_DISCONNECTED: // WL_DISCONNECTED = 6
        Serial.printf(", WiFi DISCONNECTED ==\n");
        WiFi.persistent(false); // don't write FLASH when reconnecting
        break;
  }
  return WiFiStatus;
}  // END getWifiStatus()

// Get the station interface MAC address.
// <strong i="14">@return</strong> String MAC
String getMacAddress(void)
{
  WiFi.mode(WIFI_AP_STA); // required to read NVR before WiFi.begin()
  uint8_t baseMac[6];
  esp_read_mac( baseMac, ESP_MAC_WIFI_STA ); // Get MAC address for WiFi station
  char macStr[18] = { 0 };
  sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", baseMac[0], baseMac[1], baseMac[2], baseMac[3], baseMac[4], baseMac[5]);
  return String(macStr);
}  // END getMacAddress()

// Return RSSI or 0 if target SSID not found
// const char* SSID = "YOUR_SSID"; // declare in GLOBAL space
// call: int32_t rssi = getRSSI(SSID);
int32_t getRSSI( const char* target_ssid )
{
  byte available_networks = WiFi.scanNetworks();

  for (int network = 0; network < available_networks; network++)
  {
    if ( strcmp( WiFi.SSID( network).c_str(), target_ssid ) == 0)
    {
      return WiFi.RSSI( network );
    }
  }
  return 0;
} // END getRSSI()

// Requires; #include <esp_wifi.h>
// Returns String NONE, ssid or pass arcording to request
// ie String var = getSsidPass( "pass" );
String getSsidPass( String s )
{
  String val = "NONE"; // return "NONE" if wrong key sent
  s.toUpperCase();
  if( s.compareTo("SSID") == 0 )
  {
    wifi_config_t conf;
    esp_wifi_get_config( WIFI_IF_STA, &conf );
    val = String( reinterpret_cast<const char*>(conf.sta.ssid) );
  }
  if( s.compareTo("PASS") == 0 )
  {
    wifi_config_t conf;
    esp_wifi_get_config( WIFI_IF_STA, &conf );
    val = String( reinterpret_cast<const char*>(conf.sta.password) );
  }
  return val;
}  // END getSsidPass()

لقد لاحظت هذا أيضًا ، لكنني لم أضيقه أبدًا ، لكنني لاحظت أن إعادة الاتصال () والبدء (ssid ..) لا يتم دائمًا إعادة تعيين dhcp ، حالة الحافة على ما أعتقد

ابدأ (أرجس)
يعيد dhcp فقط إذا لم يكن التكوين متساويًا أو غير متصل بالفعل ، وإلا فإنه سيعود ، مما قد يمثل مشكلة.

    wifi_config_t current_conf;
    esp_wifi_get_config(WIFI_IF_STA, &current_conf);
    if(!sta_config_equal(current_conf, conf)) {
        if(esp_wifi_disconnect()){
            log_e("disconnect failed!");
            return WL_CONNECT_FAILED;
        }

        esp_wifi_set_config(WIFI_IF_STA, &conf);
    } else if(status() == WL_CONNECTED){
        return WL_CONNECTED;
    }
 // We do not always get here
    if(!_useStaticIp) {
        if(tcpip_adapter_dhcpc_start(TCPIP_ADAPTER_IF_STA) == ESP_ERR_TCPIP_ADAPTER_DHCPC_START_FAILED){
            log_e("dhcp client start failed!");
            return WL_CONNECT_FAILED;
        }
    } else {
        tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA);
    }

mickeypop شكرا لمشاركة التعليمات البرمجية. لكن لدي شك واحد.
كما قلت:
I proved this once buy adding a UDP call in some test code. - I could talk to the AP by UDP but had no IP address. At the same time the MAC showed up on the AP connection list.

ولكن على حد علمي ، لا يمكننا إجراء اتصال UDP بدون وجود IP. UDP مبني على طبقة IP.

تضمين التغريدة

لا يتطلب UDP أي IP على الإطلاق ، إنه فقط MAC الخاص به.

UDP هو المكان الذي يوجد فيه السحر في SmartConfig. يرسل التطبيق الموجود في خليتك حزمة UDP منسقة خصيصًا لـ ESP32 مع بيانات اعتماد AP.

نظرًا لأن UDP غير متصل ، يمكن لجميع أجهزة WiFi الموجودة في نقطة الوصول أو خارجها رؤيتها.

عندما يرى ESP32 هذا ، فإنه يرسل UDP مختلفًا إلى AP للحصول على اتصال وعنوان IP من AP. تذكر قبل الاتصال لا يوجد IP.

UDP هي الطبقة السفلية المستخدمة في DHCP للحصول على IP في المقام الأول ولكنها تستخدم أيضًا بعدة طرق أخرى.

mickeypop هل من الممكن أن تقوم بخلط TCP / UDP مع البث / البث المتعدد؟
يقع كل من TCP و UDP على طبقة النقل ، والتي تم إنشاؤها فوق طبقة الإنترنت ، حيث يوجد IP.

mickeypopbedenko لكم على حد سواء قد يكون على حق، وأعتقد أنه يمكن أن يكون البث UDP على عنوان 255.255.255.255.
على أي حال ، لقد وجدت مشكلة جديدة مع أحدث الريبو.
كنت أمتلك esp32 التي كانت متصلة بـ AP ، قمت بإيقاف تشغيل AP وقمت بإعادة تشغيله بعد مرور بعض الوقت.
عند قطع الاتصال إذا كان كود السبب هو 201 (REASON_NO_AP_FOUND) ، فإنه يتصل تلقائيًا
لكن في بعض الأحيان يكون رمز سبب قطع الاتصال 7 (REASON_NOT_ASSOCED) لا يتصل أبدًا مرة أخرى ، فقط أعد الاتصال بعد إعادة تشغيل الجهاز.
لماذا يأتي رمز السبب 7 إذا قمت بإيقاف تشغيل AP؟

ربما ، لأنه تمت إعادة تغيير الكود 201 هنا ، ولكن تم تجاهل الكود 7 .

تضمين التغريدة

فكر في الأمر للحظة.
يجب أن يكون هناك بروتوكول للاتصال قبل أن يكون للجهاز عنوان IP وإلا فلن يكون لدى DHCP أي وسيلة للاتصال بخادم DHCP من أجل "الحصول" على IP.

كنت مهندس شبكات لأكثر من 30 عامًا ، وإذا لم يكن UDP جزءًا لا يتجزأ من TCP / IP ، فسيتعين عليك إعادة إعداد عناوين IP في كل مرة تنتقل فيها إلى شبكة أخرى.

هذا القليل من التمهيدي.

بروتوكول DHCP

_DHCP بروتوكول هو بروتوكول غير متصل باستخدام UDP_ المنفذ 68 و 67. يعمل على طراز العميل والخادم. عميل DHCP هو جهازنا (المسافر) وخادم DHCP هو الذي يوفر لنا IP (صاحب الحانة).

يعمل DHCP على UDP لأن عميل DHCP يعمل على عمليات البث ، والتي لا يمكن دعمها إلا بواسطة UDP. هذا ضروري لأن جهاز العميل لم يستلم حتى الآن عنوان IP (هذا هو غرض بروتوكول تفاوض DHCP) ولن تكون هناك أي طريقة لإنشاء دفق TCP بدون عنوان IP نفسه.

يبدأ عميل DHCP ببث حزمة DHCP DISCOVER. يتم استقبال البث بواسطة خادم (خوادم) DHCP ، والذي بدوره يرد برسالة DHCP OFFER. تحتوي رسالة DHCP OFFER على عنوان IP الذي يقدمه الخادم والفترة الزمنية التي يتم تخصيص عنوان IP لها (قد يكون عنوان IP عشوائيًا أو يعتمد على سياسة المسؤول).

قد يتلقى عميل DHCP عدة رسائل DHCP OFFER ، ولكنه يختار رسالة DHCP OFFER واحدة فقط بناءً على السياسة التي تم تكوينها في عميل DHCP. عادة ما يكون على أساس من يأتي أولاً يخدم أولاً. ومع ذلك ، يمكننا تكوين عميل DHCP لاختيار عرض DHCP الذي يتمتع بأطول وقت تأجير أو بعض الشبكات الفرعية المفضلة. يقوم عميل DHCP الآن بالرد برسالة DHCP REQUEST.

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

mickeypop : أتفق مع معلومات ).

تضمين التغريدة
عليك أن توافق كثيرا. قمت بقصها ولصقها مباشرة من المستندات الرسمية.

أنت على صواب وخاطئ على حد سواء وإليك السبب.

تستخدم جميع بروتوكولات الشبكة نفس بنية الحزمة. AppleTalk ، و TCP / IP ، و Arpnet ، و AIX ، وما إلى ذلك ... يتيح لهم ذلك التعايش على نفس الإيثرنت دون تعارض.

تشتمل البنية على وحدات بت للبروتوكول ، والنوع ، والمجموعة الاختبارية ، والوجهة ، إلخ ... ابحث جميعها عن 24 (255.255.255.255) بت في معرف الوجهة كمعرف خاص.

هكذا قال؛

تتم معالجة حركة مرور IP من خلال قناع الشبكة حتى تتمكن جميع الأجهزة من تحديد ما إذا كانت الحزمة مخصصة لها أم لا بالإضافة إلى التوجيه.

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

ملاحظة: يرسل UDP بواسطة MAC وليس بواسطة IP.

خذ DHCP على سبيل المثال ، ليس لديك IP أو قناع شبكة حتى الآن ، لذلك ينتقل الجهاز إلى الوضع المختلط بحثًا عن أي حزمة بعنوان MAC الخاص به.

يتم إرسال حزمة DHCP DISCOVER بواسطة UDP مع عنوان MAC للمرسلين حيث يجب أن يعرف خادم DHCP من يطلب IP.

من الواضح أن المرسل لا يمكنه معالجتها كحركة مرور IP حتى الآن ولهذه الغاية لا يمكن لخادم DHCP استخدام IP لإرسال استجابة. ومن ثم UDP.

يجب أن تتضمن رسالة DHCP OFFER التي تم إرجاعها بواسطة UDP عنوان MAC للعميل ليعرف أنها تخصه. ضع في اعتبارك أن كل حركة المرور منظمة بنفس الطريقة ولكنها ليست IP على الإطلاق حتى الآن.

لن يكون من الممكن حتى إجراء أي حركة مرور IP حتى تنتهي جميع المفاوضات.

=====
يجب أن أشير إلى Seperatly ؛
كنت ضمن الفريق في 1968 - 70 لتطوير نظام التشغيل UNIX. هناك حيث جاء TCP / IP ليكون.
استخدمنا مسودة مبكرة من UDP قبل وجود TCP / IP.

mickeypop شكرا لعملك! يمكننا جميعًا لمس السماء لأننا نقف على أكتاف العمالقة!

تشاك.

مرحبا.
أنا استخدم هذا الرمز لهذا الغرض

  if (WiFi.status() != WL_CONNECTED)
{
  digitalWrite(26,0);
  WIFI_Connect();
} else {
  digitalWrite(26,1);
}

وهذه هي الوظيفة "WIFI_Connect"

WIFI_Connect () باطل
{
digitalWrite (26 ، عالية) ؛
WiFi.disconnect () ؛
Serial.println ("Reconectando WiFi ...") ؛
WiFi.mode (WIFI_AP_STA) ؛
WiFi.begin (SSID ، كلمة المرور) ؛
// انتظر الاتصال
لـ (int i = 0 ؛ i <50 ؛ i ++)
{
إذا (WiFi.status ()! = WL_CONNECTED) {
تأخير (500) ؛
digitalWrite (26،0) ؛
Serial.print (".") ؛
تأخير (500) ؛
digitalWrite (26،1) ؛
}
}
digitalWrite (26،0) ؛
}

بالنسبة لي هذا الرمز يعمل.
Obs: الإصدار 2.3

تضمن

تضمن

حدد WIFI_SSID "===="

حدد WIFI_PASSWORD "==="

// تم حذف مشروع Firebase هذا
// ستحتاج إلى إدخال معلومات قاعدة النار الخاصة بك

تعريف FIREBASE_HOST "home-automation-1122.firebaseio.com"

حدد FIREBASE_AUTH "============"

تحديد LED1 5

تحديد LED2 4

حدد LED3 0

حدد LED4 2

حدد LED5 14

حدد LED6 12

تحديد LED7 13

حدد LED8 15

الإعداد باطل() {

pinMode (LED1 ، الإخراج) ؛

الكتابة الرقمية (LED1،0) ؛

pinMode (LED2 ، الإخراج) ؛

digitalWrite (LED2،0) ؛

pinMode (LED3 ، الإخراج) ؛

digitalWrite (LED3،0) ؛

pinMode (LED4 ، الإخراج) ؛

digitalWrite (LED4،0) ؛

pinMode (LED5 ، الإخراج) ؛

digitalWrite (LED5،0) ؛

pinMode (LED6 ، الإخراج) ؛

digitalWrite (LED6،0) ؛

pinMode (LED7 ، الإخراج) ؛

الكتابة الرقمية (LED7،0) ؛

pinMode (LED8 ، الإخراج) ؛

digitalWrite (LED8،0) ؛

Serial.begin (9600) ؛

WiFi.begin (WIFI_SSID ، WIFI_PASSWORD) ؛

Serial.print ("اتصال") ؛

بينما (WiFi.status ()! = WL_CONNECTED) {

Serial.print (".") ؛

تأخير (500) ؛

}

Serial.println () ،

Serial.print ("متصل:") ؛

Serial.println (WiFi.localIP ()) ؛

Firebase.begin (FIREBASE_HOST، FIREBASE_AUTH) ،

Firebase.setInt ("LEDStatus"، 0) ؛

}

حلقة فارغة() {

إذا (Firebase.getInt ("field1"))

{

الكتابة الرقمية (LED1 ، منخفضة) ؛

}

آخر

{
الكتابة الرقمية (LED1 ، عالية) ؛

}
إذا (Firebase.getInt ("field2"))

{

الكتابة الرقمية (LED2 ، منخفضة) ؛

}

آخر

{

الكتابة الرقمية (LED2 ، عالية) ؛

}

إذا (Firebase.getInt ("field3"))

{

الكتابة الرقمية (LED3 ، منخفضة) ؛

}

آخر

{
الكتابة الرقمية (LED3 ، عالية) ؛

}

إذا (Firebase.getInt ("field4"))

{

الكتابة الرقمية (LED4 ، منخفضة) ؛

}

آخر

{

الكتابة الرقمية (LED4 ، عالية) ؛

}
إذا (Firebase.getInt ("field5"))

{

الكتابة الرقمية (LED5 ، منخفضة) ؛

}

آخر

{

الكتابة الرقمية (LED5 ، عالية) ؛

}
إذا (Firebase.getInt ("field6"))

{

الكتابة الرقمية (LED6 ، منخفضة) ؛

}

آخر

{

الكتابة الرقمية (LED6 ، عالية) ؛

}
إذا (Firebase.getInt ("field7"))

{

الكتابة الرقمية (LED7 ، منخفضة) ؛

}

آخر

{

الكتابة الرقمية (LED7 ، عالية) ؛

}
إذا (Firebase.getInt ("field8"))

{

الكتابة الرقمية (LED8 ، منخفضة) ؛

}

آخر

{

الكتابة الرقمية (LED8 ، عالية) ؛

}

//Serial.println(Firebase.getInt("led1 ")) ؛
//Serial.println(Firebase.getInt("led2 ")) ؛
//Serial.println(Firebase.getInt("led3 ")) ؛
//Serial.println(Firebase.getInt("led4 ")) ؛
//Serial.println(Firebase.getInt("led5 ")) ؛
//Serial.println(Firebase.getInt("led6 ")) ؛
//Serial.println(Firebase.getInt("led7 ")) ؛
//Serial.println(Firebase.getInt("led8 ")) ؛

Serial.println ("...............") ؛
إذا (Firebase.failed ()) // تحقق من وجود أخطاء {

Serial.print ("فشل الإعداد / الرقم:") ؛

Serial.println (Firebase.error ()) ،

إرجاع؛

}

لم يتم إعادة توصيل nodemcu esp8226 الخاص بي بعد فقد الاتصال حتى أقوم بإعادة تشغيله

هذا الموضوع مخصص لـ esp32. هل تستخدم esp8266 أم أنها خطأ مطبعي؟

esp82255 nodemcu

في الثلاثاء ، 11 سبتمبر 2018 1:45 مساءً كتب بيدنكو ، [email protected] :

هذا الموضوع مخصص لـ esp32. هل تستخدم esp8266 أم أنها خطأ مطبعي؟

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/espressif/arduino-esp32/issues/653#issuecomment-420196435 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/ApKpJ7SS4fk4KrHA1sVKmwV7brGVeh93ks5uZ3gxgaJpZM4PfOia
.

آسف هذا هو esp8266

في الثلاثاء ، 11 سبتمبر 2018 1:48 م كتب إعجاز أحمد ، [email protected] :

esp82255 nodemcu

في الثلاثاء ، 11 سبتمبر 2018 1:45 مساءً كتب بيدنكو ، [email protected] :

هذا الموضوع مخصص لـ esp32. هل تستخدم esp8266 أم أنها خطأ مطبعي؟

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/espressif/arduino-esp32/issues/653#issuecomment-420196435 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/ApKpJ7SS4fk4KrHA1sVKmwV7brGVeh93ks5uZ3gxgaJpZM4PfOia
.

احد هنا يساعدني

هذا الخيط مخصص لـ ESP32 ، وليس 8266. جرب ريبو مختلف.

هل يمكنك مساعدتي من فضلك مع 8226

vseven كيف يمكنني حل هذه المشكلة؟

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

مرحبًا جميعًا ، أخيرًا ، حصلت على هذا الرمز يعمل على الاتصال وإعادة توصيل نقطة اتصال wifi / المحمولة عدة مرات

بفضل ThiagoCas لرموزه

`/ * * * * * * * * * * * *
تضمين المكتبات
* * * * * * * * * * * * /

تضمن

/ * * * * * * * * * * * *
تحديد الثوابت
* * * * * * * * * * * * /

حدد WIFISSID "== Wifi SSID الخاص بك ==" // ضع WifiSSID الخاص بك هنا

حدد كلمة المرور "== كلمة المرور الخاصة بك ==" // ضع كلمة مرور wifi هنا

// لن تتغير الثوابت. يُستخدم هنا لتعيين رقم التعريف الشخصي:
const int ledPin = 2 ؛ // رقم دبوس LED

/ * * * * * * * * * * * *
تحديد المتغيرات
* * * * * * * * * * * * /
// ستتغير المتغيرات:
int ledState = منخفض ؛ // ledState تستخدم لضبط LED

الفاصل الزمني int = 100 ؛ // الفاصل الزمني الذي يومض فيه (مللي ثانية)

// بشكل عام ، يجب استخدام "unsigned long" للمتغيرات التي تحمل الوقت
// ستصبح القيمة بسرعة كبيرة جدًا بحيث يتعذر على int تخزينها
ميلليس طويل بدون توقيع = 0 ؛ // سيتم تخزين آخر مرة تم فيها تحديث LED

/ * * * * * * * * * * * *
وظائف مألوفة
* * * * * * * * * * * * /
WIFI_Connect () باطل
{
WiFi.disconnect () ؛
Serial.println ("الاتصال بشبكة WiFi ...") ؛
WiFi.mode (WIFI_AP_STA) ؛
WiFi.begin (WIFISSID ، كلمة المرور) ؛

لـ (int i = 0 ؛ i <60 ؛ i ++)
{
إذا (WiFi.status ()! = WL_CONNECTED)
{
تأخير (250) ؛
digitalWrite (ledPin ، منخفض) ؛
Serial.print (".") ؛
تأخير (250) ؛
digitalWrite (ledPin ، عالية) ؛
}
}
إذا (WiFi.status () == WL_CONNECTED)
{
Serial.println ("") ؛
Serial.println ("WiFi متصل") ؛
Serial.println ("عنوان IP:") ؛
Serial.println (WiFi.localIP ()) ؛
}
digitalWrite (ledPin ، 0) ؛
}

/ * * * * * * * * * * * *
وظائف رئيسيه
* * * * * * * * * * * * /

الإعداد باطل()
{
Serial.begin (115200) ؛

// اضبط الدبوس الرقمي كإخراج:
pinMode (ledPin ، الإخراج) ؛
WIFI_Connect () ،
}

حلقة فارغة()
{
تيار طويل بدون توقيع ميليس = ميلي () ؛

إذا (currentMillis - previousMillis> = الفاصل الزمني)
{
إذا (WiFi.status ()! = WL_CONNECTED)
{
Serial.println ("wifi غير متصل") ؛
WIFI_Connect () ،
}
// حفظ آخر مرة تومض فيها مؤشر LED
السابق ميليس = التيار ميليس ؛
// إذا كان مؤشر LED مطفأ ، فقم بتشغيله والعكس صحيح:
إذا (ledState == منخفض)
{
ledState = عالية ؛
الفاصل الزمني = 100 ؛
}
آخر
{
ledState = منخفض ؛
الفاصل الزمني = 2500 ؛
}
// اضبط مؤشر LED مع مؤشر LED حالة المتغير:
digitalWrite (ledPin ، ledState) ؛
}
} `

يبدو أن البرامج الثابتة الأحدث تساعد ، سأغلق هذا.

vseven بواسطة أحدث البرامج الثابتة ... هل تقصد أحدث إصدار من

شكرا للتوضيح
جاستون

فتحت هذا منذ أكثر من عام الآن ، لذا نعم ، أحدث كما في الشهرين الماضيين.

عظيم. شكرا على التوضيح. لست متأكدًا من آخر مرة قمت فيها بالتحديث (منذ شهرين؟) ولكنني لم أر هذا الخطأ مطلقًا بعد التحديث الأخير (وكان يحدث مرة كل شهرين). اعتقدت أنني كنت محظوظًا ولكني الآن أرى أن الأمر كان أكثر من مجرد حظ. ؛)

عمل عظيم.
جاستون

يبدو أن هذا أيضًا يساعد:

    esp_wifi_set_ps(WIFI_PS_NONE);

تضمين التغريدة

يبدو أن البرامج الثابتة الأحدث تساعد ، سأغلق هذا.

مرحبا،
لطالما اعتقدت أن platformio من خلال تحديث مكتبة arduino-esp32 كانت قادرة أيضًا على تحديث ما أطلقت عليه اسم البرنامج الثابت. هل انا مخطئ ما زلت أعاني من هذه المشكلة!

تضمين التغريدة
يبدو أن البرامج الثابتة الأحدث تساعد ، سأغلق هذا.

مرحبا،
لطالما اعتقدت أن platformio من خلال تحديث مكتبة arduino-esp32 كانت قادرة أيضًا على تحديث ما أطلقت عليه اسم البرنامج الثابت. هل انا مخطئ ما زلت أعاني من هذه المشكلة!

كذلك هنا. أرغب في الحصول على مؤشر حول كيفية تحديث البرامج الثابتة بواسطة platformio للتغلب على مشكلة قطع الاتصال بنفسي ...

تضمين التغريدة
يتم تناول إرشادات إعداد النظام الأساسي للإدخال والإخراج والتحديث هنا
https://github.com/espressif/arduino-esp32/blob/master/docs/platformio.md

ومع ذلك ، فإن الأمر بسيط: في كل من Arduino و Platform IO عندما أستخدم git لتحديث SDK ، وجدت في بعض المناسبات أن التحديث لم يكن كاملاً وكان به مشكلات.

أعد تسمية مجلد esp32 وأعد التثبيت من بوابة جديدة ولقد حصلت دائمًا على تحديث نظيف.
فقط اتبع تعليماتهم.

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

@ Miq1 هل توجد هذه المشكلة إذا استخدم مثال IDF فقط؟

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

فقط للسجلات: لقد وجدت أن الحل البديل مع قطع الاتصال () والبدء اللاحق () يعمل بالنسبة لي إذا قمت بعمل وضع (WIFI_OFF) ووضع (WIFI_STA) بينهما. أحاول حاليًا إعادة الاتصال 5 مرات متتالية وسأقوم بإجراء esp.restart () إذا فشلت جميع المحاولات ، ولكن حتى الآن لم يكن من الضروري إعادة التشغيل.

لقد لاحظت بعض عمليات إعادة التشغيل في هذه الأثناء ، لذلك يبدو أن الحل البديل غير فعال.

هل هناك أي تحديث حول هذا الخطأ؟

FWIW أرى هذا غالبًا على وحدات ESP8266 أيضًا - نفس الأعراض بالضبط. لقد وجدت أنه يمكنني تغيير الاتصال بشكل جذري تمامًا عن طريق توجيه الوحدة بشكل مختلف - لذلك يبدو أنه مرتبط بكيفية استجابة الوحدات (كلاهما ESP8266 و ESP32) للإشارة السيئة.

نظرًا لأنني أستخدم NonOS و ESP8266 ، يبدو أن القاسم المشترك هو الشبكات منخفضة المستوى أسفل lwIP

(باستخدام إصدار 1.0.4 من Arduino-esp32)

واجهت نفس المشكلة هنا (باستخدام ESP32). وجدت أن إعادة تشغيل جهاز التوجيه تحل المشكلة ... مرة واحدة . أي أنه بعد إعادة التشغيل ، يكون ESP32 قادرًا على الاتصال بـ AP والحصول على عنوان IP والبقاء على اتصال ، ولكن إذا تسبب شيء ما في فشل الاتصال (مثل إعادة تشغيل ESP32) ، فلن يتمكن ESP32 إذن من الاتصال بـ AP مرة أخرى_.

جهاز التوجيه هو TP-Link TL-MR2030 الذي احتفظ به لإجراء اختبارات إيثرنت سلكية ويحتوي على برامج ثابتة عفا عليها الزمن بشكل يائس منذ سنوات ولا توجد برامج ثابتة رسمية جديدة.

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

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

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

لا ، لا يقع اللوم على جهاز التوجيه. على الأقل في حالتي. بالتأكيد ، ليس هذا هو الأحدث (wnr2200) ولكن مع تثبيت DD-WRT محدث والعديد من أجهزة android و linux و windows تعمل بدون مشاكل.

لحل هذه المشكلة بنفسي أخيرًا ، بدأت من جديد بتطبيق جديد تمامًا ، استنادًا إلى WiFiClientEvents.ino - لذا فهو يعتمد على الحدث. قرأت أيضًا أحدث رسائل الالتزام من arduino-esp32 والتي كشفت عن التزامات حديثة جدًا ولكنها ذات صلة. اضطررت إلى إجراء بعض التصحيح في WiFiGeneric.cpp ووجدت أن هذا الوضع لا يفعل دائمًا ما هو متوقع (https://github.com/espressif/arduino-esp32/issues/1306).

النتيجة النهائية: مع تصحيح صغير على WiFiGeneric.cpp (انظر نهاية الملف) ، تمكنت من الاتصال وفصل عدة مرات من / إلى AP الخاص بي - يا هلا :)

اسمحوا لي أن أعرف إذا كنت ترى شيئا لتحسين.

/*
 * This is a very stable example of repeated connecting and disconnecting to/from a wifi access point on STA32
 * Unfortunately, it needs patching of the WiFiGeneric.cpp library file
 * Author: Daniel Alder, based on the example WiFiClientEvents.ino
 * Tested with Arduino 1.8.5 and 1.8.10 with ESP library from Nov 11 2019 (cec3fca4) + patch
*/

#include <WiFi.h>   

#include "HomeWifiConfig.h" // use an extra include or uncomment the following 2 lines
//const char* ssid     = "myssid"; // your network SSID (name of wifi network)
//const char* password = "****";   // your network password

typedef enum {
  MYSTATE_OFFLINE = 0,
  MYSTATE_CONNECTING,
  MYSTATE_ONLINE,
  MYSTATE_DISCONNECTING
} mystate_t;
mystate_t mystate = MYSTATE_OFFLINE;
long state_since = 0;

#define TIMEOUT_ONLINE     20  // reconnect after this [s] offline time
#define TIMEOUT_OFFLINE    20  // disconnect after this [s] online time
#define TIMEOUT_CONNECTING 20  // cancel connecting after this [s] without success

////////////////////////////////////////////////////////////////////////////////

long getUptime() {
  return esp_timer_get_time() / 1000000L;
}

void changeState(mystate_t state) {
  mystate = state;
  state_since = getUptime();
}

void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info)
{
    Serial.printf("[WiFi-event] event: %d\n", event);

    switch (event) {
        case SYSTEM_EVENT_WIFI_READY: 
            Serial.println("WiFi interface ready");
            break;
        case SYSTEM_EVENT_SCAN_DONE:
            Serial.println("Completed scan for access points");
            break;
        case SYSTEM_EVENT_STA_START:
            Serial.println("WiFi client started");
            break;
        case SYSTEM_EVENT_STA_STOP:
            Serial.println("WiFi client stopped");
            changeState(MYSTATE_OFFLINE);
            break;
        case SYSTEM_EVENT_STA_CONNECTED:
            Serial.println("Connected to access point");
            break;
        case SYSTEM_EVENT_STA_DISCONNECTED:
            Serial.println("Disconnected from WiFi access point");
            break;
        case SYSTEM_EVENT_STA_AUTHMODE_CHANGE:
            Serial.println("Authentication mode of access point has changed");
            break;
        case SYSTEM_EVENT_STA_GOT_IP:
            Serial.print("Obtained IP address: ");
            //Serial.println(WiFi.localIP());
            //Serial.println("WiFi connected");
            //Serial.print("IP address: ");
            Serial.println(IPAddress(info.got_ip.ip_info.ip.addr));

            changeState(MYSTATE_ONLINE);

            break;
        case SYSTEM_EVENT_STA_LOST_IP:
            Serial.println("Lost IP address and IP address is reset to 0");
            //changeState(MYSTATE_OFFLINE);
            break;
        case SYSTEM_EVENT_STA_WPS_ER_SUCCESS:
            Serial.println("WiFi Protected Setup (WPS): succeeded in enrollee mode");
            break;
        case SYSTEM_EVENT_STA_WPS_ER_FAILED:
            Serial.println("WiFi Protected Setup (WPS): failed in enrollee mode");
            break;
        case SYSTEM_EVENT_STA_WPS_ER_TIMEOUT:
            Serial.println("WiFi Protected Setup (WPS): timeout in enrollee mode");
            break;
        case SYSTEM_EVENT_STA_WPS_ER_PIN:
            Serial.println("WiFi Protected Setup (WPS): pin code in enrollee mode");
            break;
        case SYSTEM_EVENT_AP_START:
            Serial.println("WiFi access point started");
            break;
        case SYSTEM_EVENT_AP_STOP:
            Serial.println("WiFi access point  stopped");
            break;
        case SYSTEM_EVENT_AP_STACONNECTED:
            Serial.println("Client connected");
            break;
        case SYSTEM_EVENT_AP_STADISCONNECTED:
            Serial.println("Client disconnected");
            break;
        case SYSTEM_EVENT_AP_STAIPASSIGNED:
            Serial.println("Assigned IP address to client");
            break;
        case SYSTEM_EVENT_AP_PROBEREQRECVED:
            Serial.println("Received probe request");
            break;
        case SYSTEM_EVENT_GOT_IP6:
            Serial.println("IPv6 is preferred");
            break;
        case SYSTEM_EVENT_ETH_START:
            Serial.println("Ethernet started");
            break;
        case SYSTEM_EVENT_ETH_STOP:
            Serial.println("Ethernet stopped");
            break;
        case SYSTEM_EVENT_ETH_CONNECTED:
            Serial.println("Ethernet connected");
            break;
        case SYSTEM_EVENT_ETH_DISCONNECTED:
            Serial.println("Ethernet disconnected");
            break;
        case SYSTEM_EVENT_ETH_GOT_IP:
            Serial.println("Obtained IP address");
            break;
        default: break;
    }
}

#include "esp_wifi.h" // only for fixWifiPersistencyFlag()
/**
 * Disable persistent mode, see https://github.com/espressif/arduino-esp32/issues/1393
 */
void fixWifiPersistencyFlag() {
  wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  Serial.printf("cfg.nvs_enable before: %d\n", cfg.nvs_enable);
  cfg.nvs_enable = 0;
}

////////////////////////////////////////////////////////////////////////////////

void setup()
{
  Serial.begin(115200);
  Serial.println("-----------------------------------------");
  Serial.println("THIS IS: newWifiImplementationUsingEvents");
  Serial.println("-----------------------------------------");

  WiFi.persistent(false);
  fixWifiPersistencyFlag();

  //Serial.setDebugOutput(true); 
  //WiFi.printDiag(Serial); 

  // delete old config
  WiFi.disconnect(true);

  state_since = getUptime();

  delay(1000);

  // warning: only the last defined event handler gets events!
  WiFi.onEvent(WiFiEvent);

  Serial.println("End of setup");
}

bool firstTime = true;

void loop()
{
  long uptime = getUptime();
  if (mystate == MYSTATE_ONLINE && state_since + TIMEOUT_ONLINE < uptime) {
    Serial.println("Disconnecting NOW");
    changeState(MYSTATE_DISCONNECTING);
    WiFi.disconnect(true);
    WiFi.mode(WIFI_OFF);
  } else if (mystate == MYSTATE_OFFLINE && state_since+TIMEOUT_OFFLINE < uptime) {
    Serial.println("Connecting NOW");
    changeState(MYSTATE_CONNECTING);
    if (firstTime) {
      Serial.println("(firstTime)");
      WiFi.begin(ssid, password);
      firstTime = false;
    } else {
      // doesn't work without WiFiGeneric.cpp patch below
      WiFi.mode(WIFI_STA);
      WiFi.reconnect();
    }
  } else if (mystate == MYSTATE_CONNECTING && state_since+TIMEOUT_CONNECTING < uptime) {
    Serial.println("Cancelling NOW after no connect success");
    changeState(MYSTATE_DISCONNECTING);
    WiFi.disconnect(true);
    WiFi.mode(WIFI_OFF);
  }

  delay(1000);
  if (uptime % 10 == 0) {
    Serial.printf("uptime %d\n", uptime);
  }
}

/* PATH FOR LIBRARY
diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp
index e562921..aab5805 100644
--- a/libraries/WiFi/src/WiFiGeneric.cpp
+++ b/libraries/WiFi/src/WiFiGeneric.cpp
@@ -483,8 +483,10 @@ void WiFiGenericClass::enableLongRange(bool enable)
 bool WiFiGenericClass::mode(wifi_mode_t m)
 {
     wifi_mode_t cm = getMode();
+    log_d("mode() cm=%d, m=%d", cm, m);
     if(cm == m) {
-        return true;
+        log_d("HACK: skip return true");
+        //return true;
     }
     if(!cm && m){
         if(!wifiLowLevelInit(_persistent)){
*/


/* ISSUES:
 *  
 * 1) The example WiFiClientEvents.ino says:
 * 
 *   WiFi.onEvent(WiFiEvent);
 *   WiFi.onEvent(WiFiGotIP, WiFiEvent_t::SYSTEM_EVENT_STA_GOT_IP);
 *   
 *   but the WiFiEvent function never receives a SYSTEM_EVENT_STA_GOT_IP!
 *   
 * 2) I used code from https://github.com/espressif/arduino-esp32/issues/1393 to fix the persistent config issue
 * 
 * 3) The list of events in WiFiClientEvents.ino (comment block) is missing an event. Same bug as fixed in 188560e7f33
 * 
 * 4) Without pathing of WiFiGeneric.cpp, the mode() function doesn't do anything anymore once WiFi it was initialized (not even connected)
 * 
 *   see also: https://github.com/espressif/arduino-esp32/issues/1306 (but the this patch is not yet mentioned there)
 * 
 * 5) just a note: there is a STA_LOST_IP event, 2 minutes after disconnecting. 
 *   So if you want to make your code stable, you should also test with TIMEOUT_OFFLINE > 130
 */

هل قام أحد بتوصيل هذا؟

واجهت مشكلة مماثلة مع اردوينو wifi rev 2 (أجهزة مختلفة ، ولكن كانت مشكلات التفاوض بين aps والجهاز متشابهة بشكل مخيف.)

https://github.com/arduino/nina-fw/issues/14

mrarmyant ماذا تتوقع أن ترى باستخدام wireshark؟ أعتقد أننا نتحدث عن مشكلات في طبقات OSI 1 و 2. بشكل مختلف: لا يوجد SSID ، ولا تردد ، ولا حزم

الكود الخاص بي (فوق منشورك) يعمل بشكل مستقر منذ أن قمت بنشره. لكنني لا أعتقد أن المشكلة محمولة إلى شيء مختلف عن رقائق ESP * لأنها تعالج مشكلات ESP SDK ، وليس Arduino

ألوم مثل هذه القضايا على إمدادات الطاقة

لن ألوم PS ، فمن غير المرجح أن يحدث هذا ما لم يكن لديك إمداد ضعيف حقًا.

Wireshark حقًا عديم الفائدة هنا.

لكي تفهم ، عليك التعمق في مكتبات RTOS حيث يتم العمل الحقيقي ، وليس حزم Arduino لأنها عبارة عن غلاف.

إذا كنت تستخدم WiFi.reconnect () بدلاً من WiFi.begin () ، فأنت بحاجة إلى معرفة بعض الأشياء.

يبدأ WiFi.begin () من خلال تعيين جميع السجلات المطلوبة على شريحة wifi وحالات RTOS قبل الاتصال ، وإعادة الاتصال () لا.
تم الإبلاغ عن هذا منذ أكثر من 2 سنوات.

غالبًا ما تقوم WiFi.reconnect () بإجراء نصف الاتصال فقط ، مما يؤدي إلى إنشاء اتصال MAC على مستوى الشريحة مع UDP ولكن لا يتم إجراء اتصال TCP / IP مطلقًا لأن هذه بروتوكولات منفصلة. هذا بسبب الحالات المطلوبة التي لم يتم ضبطها مسبقًا عن طريق إعادة الاتصال () ، فهي تفترض ببساطة أنها موجودة هناك.
هذا هو السبب في أن البعض منكم لا يحصل على SYSTEM_EVENT_STA_GOT_IP عند إعادة الاتصال.

تذكر؛ إعادة الاتصال مطلوب لأن الدول قد تغيرت بالفعل.

أقوم دائمًا بإعادة الاتصال بـ WiFi.begin () ولم أفشل أبدًا.

======
فيما يتعلق بإعادة الضبط غير المتصل والقول إن هناك بالفعل اتصال تحتاج إلى معرفة DHCP.
عادة ما يتم إعادة إنشاء عنوان IP الخاص بـ DHCP كل 15 ثانية.
لنفترض الآن ثانيتين بعد إعادة التأسيس ، اضغط على إعادة التعيين.
لن يقوم خادم DHCP بإصدار عنوان IP لمدة 13 ثانية أخرى وعند محاولة الاتصال به سيبلغ عن استخدامه.

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

سيساعدك مؤقت البدء الجيد هنا.
تأخذ فار طويل = ميلي () ؛ في السطر الأول من الإعداد () و Serial.print (مللي () - var) ؛ مباشرة قبل WiFi.begin () واكتشف مدى سرعة الإقلاع الفعلي. ثم اضبط وفقًا لذلك.

لقد كنت أستخدم ESP32 منذ أكثر من 6 سنوات وقد نجح هذا دائمًا.

تحديث؛ أرى الكثير من WiFiEvent المستخدم ولتصحيح أخطائه الجيدة ولكن ببساطة لاكتشاف wifi لأسفل وإعادة توصيل IF / ELSE أدناه يعمل بشكل موثوق في كل مرة.

يعمل هذا لأنه يستغرق حوالي 18 ثانية من الأسفل إلى الإبلاغ عن تغيير WL_CONNECTED ، وهذا يمنح خادم DHCP الوقت لتحرير IP من أجل إعادة اتصال موثوقة لاحقًا.

لقد كانت تعمل لأكثر من 6 سنوات وما زالت مستمرة.

loop()
{
  if ( WiFi.status() ==  WL_CONNECTED ) 
  {
    // WiFi is UP,  do what ever
  } else
  {
    // wifi down, reconnect here
   WiFi.begin(  );
    int WLcount = 0;
    while (WiFi.status() != WL_CONNECTED && WLcount < 200 ) 
    {
      delay( 100 );
         Serial.printf(".");
         if (UpCount >= 60)  // just keep terminal from scrolling sideways
         {
            UpCount = 0;
               Serial.printf("\n");
         }
         ++UpCount;
      ++WLcount;
    }
  }
} // END loop()

ألق نظرة على كود الهيكل العظمي الذي نشرته على https://github.com/espressif/arduino-esp32/issues/1100

على الرغم من أنه كان من أجل الإعداد مع SmartConfig إلا أنه يعمل فقط.

mrarmyant ماذا تتوقع أن ترى باستخدام wireshark؟ أعتقد أننا نتحدث عن مشكلات في طبقات OSI 1 و 2. بشكل مختلف: لا يوجد SSID ، ولا تردد ، ولا حزم

الكود الخاص بي (فوق منشورك) يعمل بشكل مستقر منذ أن قمت بنشره. لكنني لا أعتقد أن المشكلة محمولة إلى شيء مختلف عن رقائق ESP * لأنها تعالج مشكلات ESP SDK ، وليس Arduino

لم أكن أشير حقًا إلى اردوينو ، لكن شبكة wifi الموجودة على متن تلك الوحدة بالذات. كانت لديها مشاكل في إعادة الاتصال على أساس كونها هينكي مع dhcp. أبلغ شخص ما أن إعادة تشغيل جهاز التوجيه الخاص به قد تم إصلاحه ، وهي المشكلة التي واجهتنا (حسنًا إعادة تشغيل خادم windows dhcp). كانت هناك مشكلة في الطريقة التي تم بها الاعتراف بالطقس أو عدم فصلها. فقط اعتقدت أنه قد يساعد في حل هذه المشكلات هناك ، لأنه لن تظهر أي من الوحدتين على أنها متصلة في إعادة الاتصال ، وأظهر لنا wireshark السبب. IP الثابت ليس لديه مشكلة. انتهى الأمر بكونه برنامج wifi soc الثابت الذي كان لا بد من إصلاحه للتعامل مع التأخير المذكور لمشكلات DHCP. تم اكتشاف كل ذلك عبر wireshark.

هل كانت هذه الصفحة مفيدة؟
5 / 5 - 1 التقييمات

القضايا ذات الصلة

docloulou picture docloulou  ·  3تعليقات

DrewHoyt picture DrewHoyt  ·  4تعليقات

mpatafio picture mpatafio  ·  4تعليقات

NickChungVietNam picture NickChungVietNam  ·  3تعليقات

lonerzzz picture lonerzzz  ·  3تعليقات