يجب أن يؤكد خادم التطبيق جلسة الجهاز النهائي (على سبيل المثال ، نقل dev.PendingSession
إلى dev.Session
) في الأحداث التالية:
في الوقت الحالي ، من الممكن أن يقوم NS "بتبديل" الجلسة دون علم AS بحدوث هذا التبديل. أعادتrvolosatovs إنتاج هذا في v3.11
باستخدام التسلسل التالي.
dev.PendingSession
DownlinkQueueInvalidated
إلى ASdev.Session
في هذه المرحلة ، لن يتمكن AS مطلقًا من جدولة الروابط الهابطة مرة أخرى في هذه الجلسة ما لم يرسل NS إبطالًا آخر في وقت ما في المستقبل ، لأنه رفض بشكل أساسي الزيادة FCnt
التي حدثت عندما أرسل NS FPort = 0 الوصلة الهابطة (والآن يكون FCnt دائمًا منخفضًا جدًا).
لن يتم استرداد الجلسة ما لم يحدث إلغاء في المستقبل.
SessionKeyID
إلى DownlinkQueueInvalidation
. إذا كانت قائمة الانتظار فارغة ، فلن يتمكن AS في هذه اللحظة من معرفة أي قائمة انتظار تم إبطالها.dev.Session
.nacked
- من الممكن أن تكون رسالة nacked
من جلسة معلقة (من منظور AS) وبالتالي يجب إجراء تحديث FCnt في الجلسة الصحيحة.dev.PendingSession
و dev.Session
عند ظهور الرسائل المذكورة في Summary
.v3.11
handleUplink
وقم بذلك على جميع أنواع الارتباط الصاعد المناسبة.DownlinkQueue{Push|Replace}
بحد أدنى FCnt
وقم دائمًا بتحديث LastAFCntDown
لهذه القيمة. سيضمن هذا تقارب النظام إذا كنا في أي وقت خارج المزامنة بين AS و NS.حاول إعادة إنتاج التسلسل المذكور في خطوات الاستنساخ.
نعم ، ولكن نظرًا لأن هذا تغيير غير تافه ، أطلب وضع علامة على هذه المشكلة أولاً كـ discussion
- هل نريد تقديم هذه التغييرات؟ يبدو أن إبطال قائمة انتظار الوصلة الهابطة مطلبًا ، لكن الأنواع الأخرى جيدة للاتساق.
cc rvolosatovs
أنا أؤيد هذا ، كما ناقشنا بالفعل.
يجب أن يثق خادم التطبيق دائمًا في خادم الشبكة ، لأنه يحتوي دائمًا على أحدث البيانات حول جلسة الجهاز.
- يرسل End Device FPort = 0 ارتباطًا صاعدًا - ولن يتلقى AS هذا الارتباط الصاعد
ألا يجب علينا تغيير هذا حتى يرسل NS هذا ، ولكن مع حمولة فارغة و FPort 0 ، بحيث لا يتم إرسالها في اتجاه التيار؟
- يرسل End Device FPort = 0 ارتباطًا صاعدًا - ولن يتلقى AS هذا الارتباط الصاعد
ألا يجب علينا تغيير هذا حتى يرسل NS هذا ، ولكن مع حمولة فارغة و FPort 0 ، بحيث لا يتم إرسالها في اتجاه التيار؟
إنها زائدة عن الحاجة ، نظرًا لأن رسائل NS-> AS غير متزامنة ، يمكن أن يصل إبطال قائمة الانتظار قبل إرسال الوصلة الصاعدة FPort==0
إلى AS لتأكيد الجلسة ، لذلك يتعين علينا القيام بذلك على أي حال. السبب الوحيد لإرسال ارتباط صاعد إلى AS ردًا على الارتباط الصاعد FPort==0
إلى NS ، هو ضمان إخطار AS بتغيير الجلسة في أقرب وقت ممكن ، ولكن ليس لدينا مثل هذه الحاجة. حتى مع ذلك ، سيكون من المنطقي أكثر تقديم رسالة SessionSwitch
، والتي سيرسلها NS إلى AS بدلاً من الارتباط الصاعد FPort 0.
لقد قمت بترقية الأولوية إلى prio/high
لأنها تؤثر على عمليات نشر v3.11.1
.
يجب أن تكون التغييرات على النحو التالي:
SessionKeyID
إلى DownlinkQueueInvalidation
. إذا كانت قائمة الانتظار فارغة ، فلن يتمكن AS في هذه اللحظة من معرفة أي قائمة انتظار تم إبطالها.يجب أن تكون الإضافة التالية proto
(الحقل 3
) كافية.
message ApplicationInvalidatedDownlinks {
repeated ApplicationDownlink downlinks = 1;
uint32 last_f_cnt_down = 2;
bytes session_key_id = 3 [(gogoproto.customname) = "SessionKeyID", (validate.rules).bytes.max_len = 2048];
}
dev.Session
.بدلاً من استخدام dev.Session
دائمًا ، قم بالتبديل على SessionKeyID
أجل تحديد الجلسة التي يجب استخدامها. إذا لزم الأمر ، قم بتحديث dev.Session
.
nacked
- من الممكن أن تكون رسالة nacked
من جلسة معلقة (من منظور AS) وبالتالي يجب إجراء تحديث FCnt في الجلسة الصحيحة.كما كان من قبل ، قم بتبديل SessionKeyID
لتحديد الجلسة التي يجب استخدامها. إذا لزم الأمر ، قم بتحديث dev.Session
.
DownlinkQueue{Push|Replace}
بحد أدنى FCnt
وقم دائمًا بتحديث LastAFCntDown
لهذه القيمة. سيضمن هذا تقارب النظام إذا كنا في أي وقت خارج المزامنة بين AS و NS.يجب ملء الإضافة التالية proto
وإضافتها كتفاصيل خطأ إلى errFCntTooLow
في NS:
message UpdateDownlinkQueueErrorDetails {
bytes session_key_id = 1 [(gogoproto.customname) = "SessionKeyID", (validate.rules).bytes.max_len = 2048];
uint32 last_f_cnt_down = 2;
}
يمكن لـ AS بعد ذلك أخذ هذه التفاصيل وتحديث الجلسة الحالية.
التغييرات متوافقة مع الإصدارات السابقة ونأمل أن تكون ضئيلة من جانب NS. لقد خرج الجني بالفعل من الزجاجة - أصبح البروتوكول بأكمله بين AS و NS غير متزامن ببطء ، وببساطة لن يكون إرجاع التغيير FPort=0
كافيًا. لا أعتقد أن هذا التحول كان خاطئًا في نهاية اليوم ، ولكن يجب علينا إصلاح هذه المراوغات فيما يتعلق بتقليد الجلسة المزدوجة.
cc johanstokking ، rvolosatovs
يبدو أمرا جيدا لي!
هل يمكنني فعل أي شيء هنا؟ إذا كان الأمر كذلك ، فيرجى إعادة تعييني وإخباري بما يحدث.
هل يمكنني فعل أي شيء هنا؟ إذا كان الأمر كذلك ، فيرجى إعادة تعييني وإخباري بما يحدث.
أنا أعمل بالفعل على هذا ، مع التركيز بشكل كبير على النقطة التالية:
* (Optional) return error details on `DownlinkQueue{Push|Replace}` with the minimum `FCnt` and always update the `LastAFCntDown` to this value. This would ensure that the system converges if at any point we're for some reason out of sync between AS and NS.
والسبب في ذلك هو أن اتخاذ الإجراءات بناءً على الأحداث الواردة من NS ، كجزء من قائمة الانتظار ، لا يكفي في الأساس:
بالنظر إلى هذه الخصائص ، هناك خياران:
dev.Session.SessionKeyID
، dev.PendingSession.SessionKeyID
، و LastAFCntDown
، كجزء من تفاصيل الخطأ. ثم نستخدم تفاصيل الخطأ لإعادة بناء الجلسة في AS. يعني هذا أساسًا أنه عندما نحاول إجراء عملية قائمة انتظار للوصلة الهابطة ، باستخدام بيانات قديمة (ربما جلسة قديمة ، وربما تكون FCnt منخفضة جدًا) ، فإننا في النهاية نتقارب مع حالة NS. قد يستغرق الأمر محاولة واحدة أو اثنتين أو ثلاث محاولات ، وسأجعلها مقيدة لتجنب الدوران اللامتناهي ، لكننا على الأقل نعمل بمعلومات أحدث بشكل ملحوظ من تلك الموجودة في قائمة انتظار رسائل الارتباط الصاعد.
- فقط _ثق في NS_. ما أعنيه بهذا ، هو أن عمليات الدفع / الاستبدال تُرجع
dev.Session.SessionKeyID
،dev.PendingSession.SessionKeyID
، وLastAFCntDown
، كجزء من تفاصيل الخطأ. ثم نستخدم تفاصيل الخطأ لإعادة بناء الجلسة في AS. يعني هذا أساسًا أنه عندما نحاول إجراء عملية قائمة انتظار للوصلة الهابطة ، باستخدام بيانات قديمة (ربما جلسة قديمة ، وربما تكون FCnt منخفضة جدًا) ، فإننا في النهاية نتقارب مع حالة NS. قد يستغرق الأمر محاولة واحدة أو اثنتين أو ثلاث محاولات ، وسأجعلها مقيدة لتجنب الدوران اللامتناهي ، لكننا على الأقل نعمل بمعلومات أحدث بشكل ملحوظ من تلك الموجودة في قائمة انتظار رسائل الارتباط الصاعد.
أعتقد أن هذا هو الخيار الأفضل.
التعليق الأكثر فائدة
لقد قمت بترقية الأولوية إلى
prio/high
لأنها تؤثر على عمليات نشرv3.11.1
.يجب أن تكون التغييرات على النحو التالي:
SessionKeyID
إلىDownlinkQueueInvalidation
. إذا كانت قائمة الانتظار فارغة ، فلن يتمكن AS في هذه اللحظة من معرفة أي قائمة انتظار تم إبطالها.يجب أن تكون الإضافة التالية
proto
(الحقل3
) كافية.dev.Session
.https://github.com/TheThingsNetwork/lorawan-stack/blob/e2fa6c085eaaf1a0b70939020244875bd01e5857/pkg/applicationserver/applicationserver.go#L1020 -L1038
بدلاً من استخدام
dev.Session
دائمًا ، قم بالتبديل علىSessionKeyID
أجل تحديد الجلسة التي يجب استخدامها. إذا لزم الأمر ، قم بتحديثdev.Session
.nacked
- من الممكن أن تكون رسالةnacked
من جلسة معلقة (من منظور AS) وبالتالي يجب إجراء تحديث FCnt في الجلسة الصحيحة.https://github.com/TheThingsNetwork/lorawan-stack/blob/e2fa6c085eaaf1a0b70939020244875bd01e5857/pkg/applicationserver/applicationserver.go#L1060 -L1073
كما كان من قبل ، قم بتبديل
SessionKeyID
لتحديد الجلسة التي يجب استخدامها. إذا لزم الأمر ، قم بتحديثdev.Session
.DownlinkQueue{Push|Replace}
بحد أدنىFCnt
وقم دائمًا بتحديثLastAFCntDown
لهذه القيمة. سيضمن هذا تقارب النظام إذا كنا في أي وقت خارج المزامنة بين AS و NS.يجب ملء الإضافة التالية
proto
وإضافتها كتفاصيل خطأ إلىerrFCntTooLow
في NS:يمكن لـ AS بعد ذلك أخذ هذه التفاصيل وتحديث الجلسة الحالية.
التغييرات متوافقة مع الإصدارات السابقة ونأمل أن تكون ضئيلة من جانب NS. لقد خرج الجني بالفعل من الزجاجة - أصبح البروتوكول بأكمله بين AS و NS غير متزامن ببطء ، وببساطة لن يكون إرجاع التغيير
FPort=0
كافيًا. لا أعتقد أن هذا التحول كان خاطئًا في نهاية اليوم ، ولكن يجب علينا إصلاح هذه المراوغات فيما يتعلق بتقليد الجلسة المزدوجة.cc johanstokking ، rvolosatovs