قامت مؤسستنا بنشر خادم Zabbix لمراقبة سلامة الخوادم ومحطات العمل. نظرًا لخصائص العملية التقنية ، "تنتشر" المعدات في عدة غرف ويتم توزيعها في جميع أنحاء المؤسسة. بطبيعة الحال ، إلى جانب المعلمات الرئيسية لأجهزة الكمبيوتر (العمل / عدم العمل) ، أريد التحكم في المناخ المحلي في الخادم. في الوقت نفسه ، كالعادة ، الاحتمالات محدودة للغاية ، و "ضرب" الأموال الكبيرة لأنظمة مراقبة درجة الحرارة المعقدة (كما أشتمل أيضًا على لوحات تحكم مزودة بمستشعرات درجة حرارة لأجهزة APC UPS المثبتة على الرف) هي مهمة منفصلة.
كل شيء بسيط في الخادم الرئيسي: تم تثبيت لوحة واحدة (تم شراؤها منذ فترة طويلة من قبل السلف إلى جانب المعدات الرئيسية) ، تم تثبيت مستشعر APC ، تم تثبيت وكيل في Zabbix ، كل شيء يعمل عبر SNMP. مملة :) لا يوجد رصد للأجهزة البعيدة ، يعني أيضًا - انظر أعلاه. لذلك ، تقرر أن تكون ذكيًا ، وأن تحفظ الميزانية ، وفي الوقت نفسه تضخ مهارة جديدة من خلال إنشاء حل بسيط ورخيص "عميق للركبة" ، والذي يتناسب مع البنية التحتية للمراقبة الموجودة في Zabbix.
المكونات الضرورية:
التكلفة الإجمالية للمكونات هي 10 دولارات مع التسليم.
تجميع الجهاز ليس بالأمر الصعب. يتم وضع وحدة الشبكة على اللوحة الرئيسية مع "ساندويتش" ، ويتم لحام جهاز استشعار درجة الحرارة إلى دبابيسها. اتصال المستشعر: أحمر +5 فولت ، أسود - أرضي ، أصفر - بيانات ؛ بين + 5 فولت والبيانات ، قم بلحام مقاومة سحب 4.7 كيلو أوم.
يتم اختيار دبوس البيانات مع مراعاة المسامير المستخدمة من قبل وحدة الشبكة (D10 - SS ، D11 - MOSI ، D12 - MISO ، D13 - SCK ، D2 - IRQ).
أشعل النار في النموذج الأولي للجهاز واجهت صراعًا - تم إصدار بيانات درجة الحرارة بشكل عشوائي ، "من اثنين إلى ثلاثة". والسبب هو أنني قمت بتوصيل مستشعر درجة الحرارة إلى الطرف 2 ، والذي ، كما وجدته لاحقًا على الإنترنت ، يستخدم بواسطة وحدة الشبكة لإنشاء مقاطعة عند وصول الحزمة. تمت إعادة ترتيبها في الرابع - عملت مثل الساعة.بعد تجميع الأجهزة ، انتقل إلى البرنامج.
سيعمل الجهاز على الشبكة ويتظاهر بأنه وكيل zabbix ، لذلك يحتاج إلى MAC وعنوان IP. نقرر كيف أنها أكثر ملاءمة - من الصعب الخياطة أثناء البرمجة ، وإنشاء
MAC من عنوان مستشعر درجة الحرارة وتلقي IP عبر DHCP ، إلخ. لقد اتخذت أبسط مسار وقمت بترميز المعلمتين.
يتم وصف بروتوكول الاتصال مع خادم zabbix في
الوثائق . سيستجيب
جهازنا إلى أمرين -
agent.ping و
env.temp (هناك مساحة لمزيد من الإبداع ، يمكنك ربط أي من وحدات التمدد المتاحة لاردوينو - على الأقل مستشعر الرطوبة ، على الأقل إضاءة - مهما كان قلبك). ستقسم على جميع الأوامر الأخرى بإجابة قياسية ، مفهومة لخادم zabbix.
بالنسبة لأولئك الذين يبدأون من نقطة الصفر (مثلي) - تتم برمجة Arduino باستخدام
Arduino IDE ، والذي يعد التثبيت والتكوين الابتدائي. تتطلب المكونات مكتبات UIPEthernet و OneWire ، والتي يتم تثبيتها وتوصيلها بالمشروع من خلال قائمة Sketch - Connect Library - Manage libraries ...
إذا كان لديك مكونات أخرى (على سبيل المثال ، وحدة الشبكة ليست على enc28j60 ، ولكن على شريحة أخرى) - ستحتاج إلى مكتبات أخرى!يعتبر رمز العمل مع وحدة الشبكة ومستشعر درجة الحرارة نموذجيًا من الإنترنت ، مع بعض الافتراضات والتبسيط.
بعد ملء الرمز في وحدة التحكم وتوصيل كابل إيثرنت ، نتحقق من وحدة التحكم:
$ zabbix_get -s 192.168.4.5 -k agent.ping 1 $ zabbix_get -s 192.168.4.5 -k env.temp 23.12 $ zabbix_get -s 192.168.4.5 -k bla-blah ZBX_NOTSUPPORTED
Rake: الإصدار المتراكم من zabbix_get لـ Windows على zabbix.com قديم ويستخدم بروتوكول مختلف (مع الرأس ZBXD \ x01 في طلب الخادم). نسخة Linux محدثة والبروتوكول يتوافق مع الكود المحدد.كل شيء يعمل على النحو المنشود. في لوحة تحكم zabbix ، أنشئ مضيفًا جديدًا بعنوان IP المحدد ، ومفتاحين فيه ، وكيل رقمي (غير موقع). ping و env.temp رقمي (عائم) ، استمتع بالعمل. الرسوم البيانية والمحفزات - كل شيء على النحو المعتاد.
يعمل الجهاز من خلال USB الأصلي. الحالة - اختياري: صندوق بلاستيكي مناسب ، انكماش حراري ، شريط كهربائي أزرق.
تبلغ دقة المستشعر حوالي 0.06 (بتعبير أدق ، 1/16) درجة مئوية ، الدقة - عند غمرها في ذوبان الثلوج ، أظهرت 0.19 درجة مئوية (ربما كانت ستنخفض أقل ، ولكن كان هناك القليل من الثلج وذاب بسرعة). أعتقد لجهاز بقيمة 10 دولارات والأغراض الموصوفة - أكثر من كافٍ.
رسم #include <OneWire.h> #include <UIPEthernet.h> byte mac[] = { 0xDE, 0x05, 0xB6, 0x27, 0x39, 0x19 }; // random MAC byte ip[] = { 192, 168, 4, 5 }; // IP address in local network String readString = String(20); byte addr[8]; OneWire ds(4); // DS18B20 at pin 4 EthernetServer server(10050); // Zabbix port void setup() { Ethernet.begin(mac, ip); server.begin(); ds.search(addr); } void loop() { byte data[2]; float celsius; readString = ""; if (EthernetClient client = server.available()) { while (client.connected()) { if (client.available()) { char c = client.read(); if (c == '\n') // end of query from zabbix server { client.print("ZBXD\x01"); // response header if (readString == "agent.ping") { byte responseBytes [] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, '1'}; client.write(responseBytes, 9); } else if (readString == "env.temp") { ds.reset(); ds.select(addr); ds.write(0x44); // start conversion with regular (non-parasite!) power delay(1000); ds.reset(); ds.select(addr); ds.write(0xBE); // read Scratchpad data[0] = ds.read(); data[1] = ds.read(); int16_t raw = (data[1] << 8) | data[0]; celsius = (float)raw / 16.0; byte responseBytes [] = {(byte) String(celsius).length(), 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; client.write(responseBytes, 8); client.print(celsius); } else { byte responseBytes [] = {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; client.write(responseBytes, 8); client.print("ZBX_NOTSUPPORTED"); } break; } else if (readString.length() < 20) { readString = readString + c; } } } delay(10); client.stop(); } }