بهینه سازی سرعت اتصال وای فای ESP8266 🥖 تصادفی های جان مولر

مدتی است که من در ابتدا به آنچه برای ایجاد یک اتصال وای فای بهینه با Espressif ESP8266 / ESP-01 (پست قدیمی) نیاز است، می گذرد. استفاده از کد پست قدیمی جواب نداد … دیگر؟ چه لعنتی برای عرضه نوع دیگری از دستگاه ESP8266 با باتری بسیار زیاد است. زمان آن است که در مورد آنچه که در مورد زمان بندی اتصال وای فای رخ می دهد تحقیق کنید.

کد در Github است. بیشتر این پست از فایل readme موجود است. که در گوگل رتبه بهتری خواهد داشت، الف دایرکتوری فرعی از یک دامنه شناخته شده، یا پست وبلاگ من؟ به هر حال، برای من یکسان است :-).

TLDR: سریعترین زمان اتصال وای فای ESP8266 می تواند کمتر از 170 میلی ثانیه باشد

سریعترین اتصال (که من پیدا کردم؛ از جمله انتشار به MQTT) با تنظیمات زیر انجام می شود:

  1. به طور معمولی وصل شوید. حافظه پنهان BSSID و کانال دریافت شد. O (4000 میلی‌ثانیه)
  2. تنظیم WiFi.persistent(true). با BSSID و کانال ارتباط برقرار کنید. O (1500 میلی‌ثانیه)
  3. تنظیم WiFi.persistent(true) برای دریافت اطلاعات مداوم دوباره با BSSID و کانال وصل شوید. O (170 میلی‌ثانیه)

شما باید تمام این مراحل را انجام دهید، سپس اتصالات مکرر حدود 170 میلی ثانیه خواهد بود. در C++، مراحل 2 و 3 به این صورت است:

WiFi.persistent(true);
WiFi.mode(WIFI_STA);
WiFi.config(IPAddress(data->ip_address),
    IPAddress(data->ip_gateway), IPAddress(data->ip_mask), 
    IPAddress(data->ip_dns1), IPAddress(data->ip_dns2));
WiFi.begin(data->wifi_ssid, data->wifi_auth, data->wifi_channel, data->wifi_bssid, true);
uint32_t timeout = millis() + FAST_TIMEOUT;
while ((WiFi.status() != WL_CONNECTED) && (millis()timeout)) { delay(10); }
// connected or timed out

من گمان می‌کنم که استفاده از این پیکربندی نه تنها BSSID و شماره کانال، بلکه اطلاعاتی از مبادله کلید برای اتصال WPA2 وجود دارد. عجیب، بدون استفاده persistent(true)، دستگاه همچنان بهترین کانال را اسکن می کند و زمان را تلف می کند. می‌توانید با انجام دستی کاری که ESP8266 Wifi-code انجام می‌دهد، همان پیکربندی را دوباره ایجاد کنید. احتمالاً کمی پوسته پوسته است زیرا نمی توانید بررسی کنید که سیستم عامل چه کاری انجام می دهد (شما فقط رابط ها را در user_interface.h مشاهده می کنید).

پیکربندی

طرح های آردوینو

این مخزن شامل طرح های آردوینو در صورت تمایل است. آنها در:

تغییرات تست شده

من زمان‌بندی میانگین و صدک 90 (“p90”) را در نظر گرفتم. صدک 90 به این معنی است که 90 درصد اجراها زیر این عدد بوده است. زمان ها با micros() عملکرد، و در چندین تکرار ردیابی شد. داده های زمان بندی به عنوان خروجی بود به پورت سریال، با یک اسکریپت که پورت سریال را نظارت می کند و ورودی های یک فایل CSV را ردیابی می کند.

کل زمان شامل:

  • بازیابی تنظیمات از فلش
  • اتصال به وای فای
  • اتصال به سرور MQTT
  • انتشار 1 موضوع MQTT (در آخرین نوع، 5 موضوع)

برخی از انواع آزمایش شده (برای اطلاعات بیشتر به variations.txt مراجعه کنید):

  • اتصال معمولی (فقط SSID، auth): میانه 3898ms، p90 4267ms
  • اتصال با BSSID، کانال (نوع «O»): میانه 1086 میلی‌ثانیه، p90 1146 میلی‌ثانیه
  • با persistent(true)، بدون BSSID، کانال مشخص شده (نوع “K”): میانگین 2911 میلی‌ثانیه، p90 3915 میلی‌ثانیه
  • با persistent(true)، دادن BSSID، کانال، با استفاده از اتصال دستی wifi_station_connect() (نوع “J”): میانه 940 میلی ثانیه، p90 1552 میلی ثانیه
  • با persistent(true)، دادن BSSID، کانال، با استفاده از اتصال دستی reconnect() (نوع “I”): میانه 587 میلی‌ثانیه، p90 1749 میلی‌ثانیه
  • با persistent(true)، دادن BSSID، کانال، درخواست اتصال در begin() (نوع “G”): میانه 197 میلی‌ثانیه، p90 1201 میلی‌ثانیه
  • به همین ترتیب، اما انجام 5 برابر MQTT به جای یک (نوع “P”): میانگین 188 میلی‌ثانیه، p90 1227 میلی‌ثانیه

آخرین نوع (“P”؛ مشابه دومی آخری) در مجموع سریعترین است، با میانگین زمان از شروع تا انتشار 5 موضوع MQTT 188 میلی‌ثانیه (stddev: 334 میلی‌ثانیه).

بخش MQTT از نوع “P” (اتصال به سرور، انتشار موضوعات) دارای زمان متوسط ​​19 میلی‌ثانیه است (p90: 25 میلی‌ثانیه، stddev: 290 میلی‌ثانیه!). انحراف استاندارد بالا برای انتشار MQTT احتمالاً چیزی است که انحراف استاندارد کل زمان را کاهش می دهد. سرور MQTT من بر روی Raspberry Pi محلی است که در حال اجرای Home Assistant است.

بدون انجام پیش اتصال IP/پورت (نوعی «Q»)، میانگین زمان کل به 190 میلی‌ثانیه می‌رسد (p90: 278 میلی‌ثانیه، stddev: 257 میلی‌ثانیه)، بنابراین پیش‌اتصال IP صرفه‌جویی زیادی نمی‌کند. با استفاده از نام میزبان به جای آدرس IP (نیاز به جستجوی DNS، نوع “R”)، کل زمان به 202 میلی‌ثانیه میانه می‌رسد (p90 840 میلی‌ثانیه، stddev 410 میلی‌ثانیه)، بنابراین ذخیره آدرس IP ایده خوبی است.

حکایت ها

عجیب و شگفت انگیز:

  • persistent() به طور پیش فرض در ESP SDK برای وای فای غیرفعال است. من به خاطر سایش فلاش مشکوکم؟ یولو.
  • Platformio از SDK های قدیمی ESP8266 “غیر سیستم عامل” (Arduino) استفاده می کند – SDK های ESP8266 بسیار جدیدتر هستند. شماره ثبت شده در سال 2018. WTH Platformio؟!
  • اتصال با BSSID و کانال (بدون persistent(true)، منجر به اسکن برای یک کانال می شود و ممکن است از کانال دیگری استفاده کند. این حدود 900 میلی ثانیه به زمان اتصال اضافه می کند. این احتمالا یک اشکال است. این پیکربندی است که بیشتر اشاره های خارجی برای بهینه سازی سرعت پیشنهاد می کنند، که بهتر از هیچ است، اما همچنان کندتر از آنچه که باید باشد.
  • کد ESP SDK در ESP8266WiFiSTA.cpp نحوه ایجاد اتصال را نشان می‌دهد، اما نمی‌توانید کد را برای آنچه واقعاً اتفاق می‌افتد بررسی کنید. با این حال، شما می توانید آن را با استفاده از persistent(true) بدون تعیین BSSID منجر به عدم استفاده از داده های دائمی می شود (علی رغم داشتن BSSID).
  • در کد نیز آن را مشاهده می کنید wifi_station_connect() قبل از تنظیم شماره کانال تماس گرفته می شود. آیا این به این معنی است که از کانال مداوم استفاده نمی شود؟ عجیب و غریب.
  • استفاده كردن persistent(true) بدون تعیین BSSID / کانال تنظیمات دریافتی را حفظ نمی کند.
  • خروجی اشکال زدایی (به زیر مراجعه کنید) برای همه انواع اتصال یکسان است. بهینه سازی سرعت بی فایده است.
  • نسخه‌های SDK ارائه شده توسط Platformio (نسخه 2.2.1 – 2.2.x، قبل از 3.0؛ 2018 تا 2019) همگی زمان‌بندی مشابهی دارند.
  • تفاوت نامشخص بین persistent(true) + اتصال با BSSID و imo کانال نشان می‌دهد که نسخه‌های SDK آینده ممکن است متفاوت باشند و ESP32 ممکن است این موضوع را متفاوت مدیریت کند. معلوم نیست چی persistent(true) در واقع انجام می دهد. شعبده بازي.

خروجی اشکال زدایی Wifi ESP8266

Platformio دارای پرچم‌هایی برای فعال کردن خروجی اشکال‌زدایی وای فای ESP است. متأسفانه تغییرات اصلی همه دقیقاً همان خروجی اشکال زدایی را نشان می دهند، بنابراین نمی توانید بگویید چه اتفاقی می افتد.

در platformio.ini (اسناد):

build_flags = -DDEBUG_ESP_WIFI -DDEBUG_ESP_PORT=Serial 

خروجی با اتصال معمولی (اسکن برای BSSID، کانال، اتصال)، اما همچنین بدون تعیین کانال، و اتصال سریع مداوم:

fpm close 3 
mode : sta(c4:5b:be:4a:69:34)
add if0
wifi evt: 8
wifi evt: 2
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 3
cnt 

connected with XXXXXX, channel 11
dhcp client start...
wifi evt: 0
ip:192.168.178.111,mask:255.255.255.0,gw:192.168.178.1
wifi evt: 3

نظرات / سوالات

در حال حاضر هیچ قابلیت نظر دادن در اینجا وجود ندارد. اگر می‌خواهید نظر بدهید، لطفاً از Mastodon استفاده کنید و من را (@[email protected]) در آنجا ذکر کنید. با تشکر!

صفحات مرتبط

Source link