مقدمة
يُعد الحِفاظ على تزامُن الوقت أولويَّة قُصوى في بعض المشاريع التي تنجزها، فمثلاً إذا أردت تَفعيل (Relay) في وقتٍ مُعيَّن أو مُسجِّل بيانات (data logger) يُخزِّن القيم في فتراتٍ زمنيَّةٍ دقيقةٍ. فأوَّل شيء ستفكرُ به هو استخدام رُقاقة ساعة الوقت الحقيقي (Real time clock) أو ما تُعرف اختصارًا ب RTC، ولكن هذه الرُّقاقات غير دقيقةٍ بشكلٍ تام؛ إذْ يجب إجراء تعديلات يدويَّة عليها بشكلٍ مُنتَظم للحفاظ على تزامنها. ومن الجدير بالذكر أنَّ الحل هنا هو استخدام بروتوكول توقيت الانترنت (Net Time Protocol) والذي يرمز له اختصاراً ب NTP.
إذا كانت تعمل على مشروع باستخدام شريحة ESP8266 ولديها إمكانية الوصول إلى الإنترنت. فبإمكانك الحصول على التاريخ والوقت مجاناً وبدون أي مكوِّنات ماديَّة إضافيَّة (بدِّقة تصل إلى 50 ميلي ثانية من التوقيت العالميِّ المنسق UTC).
ما هو ال NTP؟
هو اختصار لبروتوكول توقيت الانترنت وهو بروتوكول إنترنت IP قياسي لمزامنة ساعة الحاسوب إلى الزَّمن المرجعيِّ عبر الانترنت.
يُستخدم هذا البروتوكول لمزامنة جميع الأجهزة المتصِّلة بالإنترنت إلى UTC لدِّقة تصل إلى ( 50 ميلي ثانية عبر شبكة الإنترنت العامَّة وبدِّقة تصل لأقل من 5 ثواني في بيئة شبكة المنطقة المحليِّة التي تعرف ب LAN)
يعتبر UTC معيار للوقت حول العالم المرتبط بشكل وثيق ب GMT (توقيت غرينتش)، لكن UTC ثابت ولا يتغير في أنحاء العالم.
الفكرة هنا هي استخدام NTP لضبط ساعات الحاسوب على التوقيت العالميِّ المنسق UTC ثم تطبيق أي إزاحة للمنطقة الزمنيَّة المحليَّة أو إزاحة التوقيت الصيفيِّ. يسمح لنا هذا بمزامنة ساعات ا لدينا بغض النَّظر عن الموقع أو عن اختلاف منطقة التوقيت الزمنيِّ.
بنية NTP
يستخدم NTP بنية هرميَّة وكل تسلسل فيه يعرف ب طبقة (Stratum)، ففي القمة توجد أجهزة حفظ الوقت عاليَّة الدِّقة مثل الساعات الذريِّة (Atomic Clocks) أو GPS أو ساعات الرَّاديو وتُعرف باسم ساعات الطبقة الصِّفريِّة (Stratum 0).
تتصل مُخدِّمات الطَّبقة الأولى (Stratum 1) مباشرةً مع ساعات الطَّبقة الصِّفريِّة الساعة الماديَّة التي تحوي التوقيت الأكثر دِّقة، نوضح لكم طبقات NTP في الشكل أدناه.
كل طبقة في البنيَّة الهرميَّة تتزامن مع الطبقة الأعلى منها وتعمل كمُخدِّم للحواسيب في الطبقة المنخفضة.
كيف يعمل NTP؟
يعمل NTP بطُرق متعدِّدة والطريقة الأكثر شيوعاً هي تشغيل وضع خدمة المستخدم وبدأ عملها كالتالي:
- يتصِّل جهاز المُستخدم-على سبيل المثَّال شريحة ESP8266-بمُخدِّم NTP بواسطة بروتوكول مخطِّط البيانات UDP عبر المنفذ 123.
- بعدها يرسل المستخدم حزمة طلبات لمخدم NTP.
- كاستجابة لذلك الطلب يرسل مخدم NTP حزمة الطابع الزمني (Time Stamp Packet) والتي تحوي العديد من المعلومات مثل الطابع الزمني ل UNIX والدقة والتأخير أو منطقة التوقيت.
- يستطيع المستخدم استخراج قيم التاريخ والتوقيت من حزمة الطابع الزمنيِّ التي استلمها.
تحضير IDE الأردوينو (برنامج بيئة التطوير المتكامل للأردوينو)
لنذهب للجزء العمليِّ الآن ولنبدأ يجب أن يتوفر لديك ESP8266 مضافة ل IDE الأردوينو.
تثبيت مكتبة مستخدم NTP
إن أسهل طريقة للحصول على التاريخ والوقت من مخدم NTP هي NTP client من مكتبات الأردوينو، تابع الخطوات التالية لتثبيت هذه المكتبة في IDE الأردوينو الخاص بك هي كالآتي:
“انتقل إلى sketch ثم تضمين مكتبة include library ثم إلى إدارة المكتبات manage libraries انتظر لمدير المكتبة ليحمل فهرس المكتبات وليحدث لائحة المكتبات المثبتة”، كما في الشكل أدناه.
قم بفلترة بحثك بكتابة”ntpclient” ستظهر العديد من النتائج. اختر ال NTPClient التي طورها Fabrice Weinberg ، اضغط عليها ثم اختر تثبيت install.
الحصول على اليوم والتوقيت الحاليان من مخدم NTP
ستفهم بشكل كامل من ال Sketch التالي كيف تحصل على اليوم والوقت الحقيقي من مخدم NTP
لكن قبل أن تبدأ بتحميل ال sketch، عليك إجراء بعض التعديلات لكي يعمل:
- عدَل المتغيرَين التاليين بناءً على بيانات الشبكة الخاصة بك (اسم الشبكة وكلمة السِّر). لكي يتمَّكن ESP8266 من إنشاء اتصال مع شبكة الانترنت الموجودة.
;”const char* ssid = “YOUR_SSID
;”const char* password = “YOUR_PASS
- عدِّل مطابقة UTC لمنطقة التوقيت الخاصة بك في الميلي ثانية. تشير اللائحة إلى مطابقات وقت UTC وهنا بعض الأمثلة لمناطق التوقيت المختلفة:
UTC -5.00 : -5 * 60 * 60 : -18000
UTC +1.00 : 1 * 60 * 60 : 3600
UTC +0.00 : 0 * 60 * 60 : 0
فمثلا UTC +1.00 معناه أن المنطقة الزمنيَّة تتقدم على توقيت UTC بساعة واحدة. ومن ثم نحوِّل السَّاعة إلى ثواني ويكون الناتج 3600 ثانية ونكتب ال sketch التالي:
;const long utcOffsetInSeconds = 3600
بعد تحميل ال sketch اضغط على زر RST في NodeMCU الخاص بك وبذلك تحصل على اليوم والتوقيت الحالي في كل ثانية كما هو موضح بالأسفل.
تفسير الكود
لنلقي نظرة بشكلٍ مبسط كيف يعمل الكود
أولاً نضمن المكتبات المطلوبة للمشروع وهي:
NTPClient.h- وهي مكتبة توقيت تقوم بمزامنة مخدم NTP بشكل مناسب
ESP8266Wifi.h- وهي مكتبة تزوِّد ال ESP8266 بطرق WiFi محدَّدة والتي نتصل بها لكي نصل شبكة الانترنت
WifiUdp.h- وهي مكتبة تتولى أمر بروتوكول UDP مثل فتح منفذ UDP وإرسال واستقبال حزم UDP….
<include <NTPClient.h#
<include <ESP8266WiFi.h#
<include <WiFiUdp.h#
بعد ذلك نضبط عدَّة ثوابت مثل SSID وكلمة سر WiFi ومطابقة UTC والتي أساساً اطلعت عليها، كذلك نعرف مصفوفة 2D أيام الأسبوع.
;”const char *ssid = “YOUR_SSID
;”const char *password = “YOUR_PASS
;const long utcOffsetInSeconds = 3600
;char daysOfTheWeek[7][12] = {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”}
الآن قبل تهيئة كائن NTP علينا تحديد عنوان مُخدِّم NTP الذي نريد استخدامه ويعتبر pool.ntp.org كمشروع NTP مفتوح ومناسب لتطبيقات كهذه.
;WiFiUDP ntpUDP
;NTPClient timeClient (ntpUDP, “pool.ntp.org”, utcOffsetInSeconds)
يقوم pool.ntp.org تلقائياً باختيار توقيت المخدِّمات القريبة منك جغرافياً. لكن إنْ لم تختر المنطقة بدِّقة. استخدم واحدة من sub-zones الموجودة في pool.ntp.org
في قسم الضبط (setup section) نهيئ أولاً اتصال الاتصال التسلسليِّ مع حاسوبٍ شخصي ونربط شبكة ال WiFi باستخدام تابع ()WiFi.begin
;Serial.begin(115200)
;WiFi.begin(ssid, password)
;while ( WiFi.status() != WL_CONNECTED )
}
;delay ( 500 )
;( “.” ) Serial.print
{
حالما تتصل ESP8266 مع الشبكة نهيئ مستخدم NTP باستخدام تابع ()begin
;()timeClient.begin
الآن ببساطة يمكننا استدعاء تابع update() في أيِّ وقتٍ نريد به اليوم والتوقيت الحاليين. فهذا التابع يرسل حزمة طلبٍ إلى مخدم NTP باستخدام بروتوكول UDP ويحلِّل حزمة الطابع الزمنيِّ المستقبلة إلى صيغة مقروءة.
;()timeClient.update
الآن يمكننا الحصول على معلومات اليوم والوقت عبر استدعاء توابع مكتبة مستخدم NTP
;Serial.print(daysOfTheWeek[timeClient.getDay()])
;(“, “)Serial.print
;Serial.print(timeClient.getHours())
;(“:”)Serial.print
;Serial.print(timeClient.getMinutes())
;(“:”)Serial.print
;Serial.println(timeClient.getSeconds())
المصدر: هنا
ترجمة: سها اديب, مراجعة: قاهر اليتيم, تدقيق لغوي: بولا ابراهيم, تصميم: علي العلي, تحرير: فادي الشعار