استخدام السياق (Context) لتوليد متوسطات التداخل :
وحدة خاصة تسمى السياق (Context) ، وتستخدم لتخزين البيانات بين استدعاءات الـ function، وهو متاح في عقد الـ Function . يمكن أن يكون هذا مفيدا عندما تحتاج الدالة (function) للاحتفاظ بالحالة للقيام بمعالجتها. على سبيل المثال، قد يكون من الضروري حساب قيمة متوسط قراءات بيانات جهاز الاستشعار على مدى فترة من الزمن .
في الكود الموضح أدناه يتم احتساب متوسط التداخل للقيم المتلقاة خلال الـخمس ثواني الأخيرة، يتم اضافة حقل ‘average’ إلى الحمولة (payload) ، عند انقضاء أكثر من 5 ثوان بين الرسائل المستلمة.
var currentTime = new Date().getTime(); if (!context.lastTime) { context.lastTime = currentTime; context.sum = msg.payload.value; context.count = 1; } if (currentTime-context.lastTime > 5000) { // calculate average for previous messages msg.payload.average = context.sum/context.count; // start tracking average again context.sum = msg.payload.value; context.count = 1; context.lastTime = currentTime; } else { context.sum += msg.payload.value; context.count +=1; } return msg;
عند النظر إلى الكود، سوف تحصل أولا على الوقت الحالي (السطر 1) . إذا لم يكن هناك آخر وقت (lastTime) مخزن في السياق (Context) ، ستقوم بحفظ الوقت الحالي (currentTime) ، و إعادة تعيين مجموع (sum) و عدد (count) متغيرات السياق (كما هو مبين بالأسطر من 3 إلى 7 ).
إذا كان الوقت الحالي currentTime)5) ثواني ( 5000 ميلي ثانية) أكبر من آخر وقت (السطر 9)، فإنك تحسب متوسط القيم الأخيرة المستلمة و تدرج ذلك مع الحمولة للرسالة (في الاسطر من 11 إلى 13 ) . ثم يمكنك إعادة تعيين مجموع sum و عدد count و تعيين آخر وقت lastTime و الوقت الحالي currentTime لبدء العد مرة أخرى.
إذا لم يتم انقضاء 5 ثواني منذ استلام الرسالة الأخيرة، ، يجب تحديث counts و sums (كما هو مبين بالأسطر من 16-19) . ثم تقوم بإخراج الرسالة التي تتضمن أحدث قيمة و متوسط اذا تم حسابها للفترة الزمنية (السطر 20 (.
قم بإضافة عقدة Function وكتابة الكود أعلاه .
لاختبار هذا، سنقوم بكتابة عقدة Function أخرى، التي تسمى ramp ويستخدم أيضا السياق (context) لتوليد القيم من 0 إلى 9 في التسلسل ، كما هو موضح بالكود ادناه ، دالة (function) لتوليد تسلسل القيم بإستخدام السياق .
if (!context.value) { context.value = 0; } msg.payload = { value:context.value } context.value +=1; if (context.value > 9) { context.value = 0; } return msg;
سنقوم إضافة و ربط عقدة inject إلى التدفق ، ثم قم بإعدادها لإرسال البيانات في كل ثانية، كما هو مبين بالشكل التالي :
عقدة inject لضخ حمولة فارغة كل ثانية .
ثم قم بربط التدفق كما هو مبين بالشكل التالي :
يجب أن يبدو الناتج كما هو موضح بالشكل التالي :