nl:: Weave:: النظام:: PacketBuffer
#include <src/system/SystemPacketBuffer.h>
فئة المخزن المؤقت للحزمة هي البنية الأساسية المستخدمة لمعالجة حِزم البيانات التسلسلية التسلسلية، وعادةً ما يكون ذلك في سياق شبكة اتصالات البيانات، مثل البلوتوث أو بروتوكول الإنترنت.
الملخّص
في البيئات المستندة إلى LwIP، تم إنشاء هذه الفئة استنادًا إلى بنية pbuf المحدّدة في تلك المكتبة. في حال عدم استخدام تقنية LwIP، تقدّم Weave إما تنفيذًا مستندًا إلى محتوى الوسائط المستند إلى محتوى مُجمّع (التصفح السريع في Drive)، أو تنفيذ مستند إلى مسبح يُقرب بشكل كبير من تحديات الذاكرة المتعلقة بالأجهزة المضمنة بشدة.
توفر فئة PacketBuffer، مثل العديد من البُنى المشابهة المستخدمة في حزم الشبكة ذات الطبقات، آلية لحجز مساحة لعناوين البروتوكول في كل طبقة من حِزمة الاتصالات القابلة للضبط. لمعرفة التفاصيل، يُرجى الاطّلاع على PacketBuffer::New()
بالإضافة إلى وثائق LwIP.
يتم احتساب كائنات PacketBuffer، ويكون وضع الاستخدام السائد في Weave هو "fire-and-forget". أثناء إرسال الحزمة (وعنصرها الأساسي PacketBuffer) من خلال طبقات بروتوكول مختلفة، تشير الطلب الناجح أو معاودة الاتصال الناجحة بين الطبقات إلى نقل الملكية، ويكون المتّصل مسؤولاً عن تحرير المخزن المؤقت. عند استدعاء مكالمة متعددة الطبقات، تقع مسؤولية تحرير المخزن المؤقت على عاتق المتصل.
يتم إعداد عناصر جديدة من الفئة PacketBuffer في بداية تخصيص الذاكرة التي تم الحصول عليها من البيئة الأساسية، على سبيل المثال من مجموعات LwIP المستهدفة pbuf، من الذاكرة العادية لمكتبة C، من مجموعة تخزين داخلية داخلية. في الحالة البسيطة، يكون حجم المخزن المؤقت للبيانات هو WEAVE_SYSTEM_PACKETBUFFER_SIZE. يتم توفير مؤلف يُتيح استخدام مخازن البيانات المؤقتة للأحجام الأخرى.
يمكن ربط كائنات PacketBuffer لاستيعاب الأحمال الأكبر. على الرغم من ذلك، لا تتسم السلسلة بالشفافية، ويجب أن يقرر مستخدمو الصف صراحةً دعم السلاسل. في ما يلي أمثلة للصفوف المكتوبة بدعم التسلسل:
@ref nl::Weave::WeaveTLVReader @ref nl::Weave::WeaveTLVWriter
الاكتساب
يكتسب من: pbuf
وظائف عامة |
|
---|---|
AddRef(void)
|
void
زيادة عدد المراجع للمخزن المؤقت الحالي.
|
AddToEnd(PacketBuffer *aPacket)
|
void
أضِف المخزن المؤقت للحزمة على نهاية السلسلة المخزّنة مؤقتًا، واضبط إجمالي طول كل مخزن مؤقت في السلسلة وفقًا لذلك.
|
AlignPayload(uint16_t aAlignBytes)
|
bool
محاذاة حمولة التخزين المؤقت على حد وحدات البايت المحددة.
|
AllocSize(void) const
|
size_t
عرض حجم التخصيص، بما في ذلك مساحات البيانات المحجوزة وحمولة البيانات، ولكن لا يشمل المساحة المخصصة للبنية PacketBuffer.
|
AvailableDataLength(void) const
|
uint16_t
الحصول على عدد وحدات البايت للبيانات التي يمكن إضافتها إلى المخزن المؤقت الحالي بالنظر إلى موضع البدء الحالي وطول البيانات.
|
CompactHead(void)
|
void
نقل البيانات من المخازن المؤقتة التالية في السلسلة إلى المخزن المؤقت الحالي حتى تمتلئ.
|
Consume(uint16_t aConsumeLength)
|
استهلاك البيانات في سلسلة من المخزن المؤقت.
|
ConsumeHead(uint16_t aConsumeLength)
|
void
ضبط المخزن المؤقت الحالي للإشارة إلى كمية البيانات المُستخدَمة.
|
DataLength(void) const
|
uint16_t
الحصول على طول البيانات بالبايت في المخزن المؤقت للحزمة
|
DetachTail(void)
|
افصل المخزن المؤقت الحالي عن سلسلته وارجع المؤشر إلى المخزن المؤقت المتبقي.
|
EnsureReservedSize(uint16_t aReservedSize)
|
bool
تأكد من أن المخزن المؤقت يحتوي على المساحة المحددة على الأقل.
|
MaxDataLength(void) const
|
uint16_t
الحصول على أقصى قدر بالبايت، من البيانات التي ستلائم المخزن المؤقت بناءً على موضع البدء الحالي وحجم المخزن المؤقت.
|
Next(void) const
|
يمكنك الحصول على إشارة إلى المخزن المؤقت التالي في السلسلة.
|
ReservedSize(void) const
|
uint16_t
الحصول على عدد وحدات البايت ضمن المخزن المؤقت الحالي بين بداية المخزن المؤقت وموضع بدء البيانات الحالية.
|
SetDataLength(uint16_t aNewLen, PacketBuffer *aChainHead)
|
void
ضبط طول البيانات بالبايت في المخزن المؤقت، مع ضبط إجمالي الطول وفقًا لذلك
|
SetStart(uint8_t *aNewStart)
|
void
يمكنك تحديد بيانات البدء في المخزن المؤقت وتعديل طولها وإجمالي طولها وفقًا لذلك.
|
Start(void) const
|
uint8_t *
الحصول على مؤشر لبدء البيانات في المخزن المؤقت
|
TotalLength(void) const
|
uint16_t
احصل على إجمالي طول بيانات الحزمة في سلسلة المخزن المؤقت.
|
الدوال الثابتة العامة |
|
---|---|
Free(PacketBuffer *aPacket)
|
void
إخلاء جميع المخازن المؤقتة للحزم في إحدى السلاسل.
|
FreeHead(PacketBuffer *aPacket)
|
تفريغ المخزن المؤقت الأول في السلسلة، مع إعادة المؤشر إلى المخزن المؤقت المتبقي.
|
New(void)
|
يتم تخصيص PacketBuffer واحد من الحجم الأقصى التلقائي (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPAcity_MAX) باستخدام الحجم المحجوز التلقائي (WEAVE_SYSTEM_CONFIG_x_RESERVE_SIZE) في الحمولة.
|
New(uint16_t aReservedSize)
|
تخصّص PacketBuffer واحدًا من الحد الأقصى لإجمالي الحجم مع حجم حجز عنوان محدد.
|
NewWithAvailableSize(size_t aAvailableSize)
|
ويتم تخصيص PacketBuffer باستخدام حجم محجوز تلقائي (WEAVE_SYSTEM_CONFIG_Header_RESERVE_SIZE) في الحمولة للعناوين، و
aAllocSize بايت على الأقل من البيانات الإضافية بعد مؤشر المؤشر الأولي. |
NewWithAvailableSize(uint16_t aReservedSize, size_t aAvailableSize)
|
ويخصص كائن PacketBuffer مع ما لا يقل عن
aReservedSize بايت محجوزة في الحمولة للعناوين، وaAllocSize مساحة بايت على الأقل للبيانات الإضافية بعد مؤشر المؤشر الأولي. |
RightSize(PacketBuffer *aPacket)
|
نسخ المخزن المؤقت المحدد إلى المخزن المؤقت بالحجم الصحيح إن أمكن.
|
وظائف عامة
إضافة مرجع
void AddRef( void )
زيادة عدد المراجع للمخزن المؤقت الحالي.
إضافة إلى نهاية
void AddToEnd( PacketBuffer *aPacket )
أضِف المخزن المؤقت للحزمة على نهاية السلسلة المخزّنة مؤقتًا، واضبط إجمالي طول كل مخزن مؤقت في السلسلة وفقًا لذلك.
التفاصيل | |||
---|---|---|---|
المعلَمات |
|
محاذاة Payload
bool AlignPayload( uint16_t aAlignBytes )
محاذاة حمولة التخزين المؤقت على حد وحدات البايت المحددة.
نقل الحمولة في المخزن المؤقت إذا لزم الأمر
التفاصيل | |||
---|---|---|---|
المعلَمات |
|
||
المرتجعات |
true إذا تمت المحاذاة بنجاح، false إذا لم تكن هناك مساحة كافية في المخزن المؤقت. |
تخصيص حجم
size_t AllocSize( void ) const
عرض حجم التخصيص، بما في ذلك مساحات البيانات المحجوزة وحمولة البيانات، ولكن لا يشمل المساحة المخصصة للبنية PacketBuffer.
التفاصيل | |
---|---|
المرتجعات |
حجم التخصيص
|
طول البيانات المتاحة
uint16_t AvailableDataLength( void ) const
الحصول على عدد وحدات البايت للبيانات التي يمكن إضافتها إلى المخزن المؤقت الحالي بالنظر إلى موضع البدء الحالي وطول البيانات.
التفاصيل | |
---|---|
المرتجعات |
طول البيانات بالبايت التي ستلائم المخزن المؤقت الحالي بالنظر إلى موضع البدء الحالي وطول البيانات.
|
مكثف مضغوط
void CompactHead( void )
نقل البيانات من المخازن المؤقتة التالية في السلسلة إلى المخزن المؤقت الحالي حتى تمتلئ.
يتم ضغط المخزن المؤقت فقط: يتم نقل البيانات داخل المخزن المؤقت الحالي إلى الجزء الأمامي من المخزن المؤقت، بدون حذف أي مساحة محجوزة. يتم ملء المساحة المتبقية المتبقية بالبيانات التي يتم نقلها من المخزن المؤقت اللاحقة في السلسلة، إلى أن يمتلئ المخزن المؤقت الحالي. إذا تم نقل مخزن مؤقت لاحق في السلسلة إلى المخزن المؤقت الحالي بالكامل، تتم إزالته من السلسلة ويتم تحريره. لا تستخدم الطريقة أي معلمات، ولا تعرض أي نتائج، ولا يمكن أن تفشل.
استهلاك
PacketBuffer * Consume( uint16_t aConsumeLength )
استهلاك البيانات في سلسلة من المخزن المؤقت.
تستهلك البيانات في سلسلة من المخزن المؤقت بدءًا من المخزن المؤقت الحالي وتتابِع خلال المخزن المؤقت المتبقي في السلسلة. يتم تحرير كل المخزن المؤقت الذي يتم استهلاكه بالكامل وتعرض الدالة المخزن المؤقت الأول (إن وجد) الذي يحتوي على البيانات المتبقية. يجب أن يكون المخزن المؤقت الحالي هو رأس سلسلة المخزن المؤقت.
التفاصيل | |||
---|---|---|---|
المعلَمات |
|
||
المرتجعات |
المخزن المؤقت الأول من السلسلة الحالية التي تحتوي على أي بيانات متبقية. في حال عدم وجود أي بيانات، يتم عرض NULL.
|
استخدام الاستهلاك
void ConsumeHead( uint16_t aConsumeLength )
ضبط المخزن المؤقت الحالي للإشارة إلى كمية البيانات المُستخدَمة.
تقديم موضع بدء البيانات في المخزن المؤقت الحالي بمقدار القيمة المحددة بالبايت، وذلك وصولاً إلى طول البيانات في المخزن المؤقت. قلّل طول المدة وإجمالي طولها بمقدار المبلغ المستهلَك.
التفاصيل | |||
---|---|---|---|
المعلَمات |
|
طول البيانات
uint16_t DataLength( void ) const
الحصول على طول البيانات بالبايت في المخزن المؤقت للحزمة
التفاصيل | |
---|---|
المرتجعات |
الطول، بالبايت (طول الحمولة الحالي).
|
فصل الهاتف
PacketBuffer * DetachTail( void )
افصل المخزن المؤقت الحالي عن سلسلته وارجع المؤشر إلى المخزن المؤقت المتبقي.
يجب أن يكون المخزن المؤقت الحالي هو رأس السلسلة.
التفاصيل | |
---|---|
المرتجعات |
ذيل المخزن المؤقت الحالي أو فارغ إذا كان المخزن المؤقت الحالي هو المخزن المؤقت الوحيد في السلسلة.
|
ضمان بحجم محجوز
bool EnsureReservedSize( uint16_t aReservedSize )
تأكد من أن المخزن المؤقت يحتوي على المساحة المحددة على الأقل.
تأكد من أن المخزن المؤقت يحتوي على المساحة المحددة على الأقل التي تعمل على نقل البيانات في المخزن المؤقت للأمام لتوفير مساحة، إذا لزم الأمر.
التفاصيل | |||
---|---|---|---|
المعلَمات |
|
||
المرتجعات |
true إذا كان المقاس المحجوز المطلوب متاحًا، false إذا لم تكن هناك مساحة كافية في المخزن المؤقت. |
الحد الأقصى لطول البيانات
uint16_t MaxDataLength( void ) const
الحصول على أقصى قدر بالبايت، من البيانات التي ستلائم المخزن المؤقت بناءً على موضع البدء الحالي وحجم المخزن المؤقت.
التفاصيل | |
---|---|
المرتجعات |
عدد وحدات البايت التي تناسب المخزن المؤقت نظرًا إلى موضع البدء الحالي.
|
التالي
PacketBuffer * Next( void ) const
يمكنك الحصول على إشارة إلى المخزن المؤقت التالي في السلسلة.
التفاصيل | |
---|---|
المرتجعات |
مؤشر إلى المخزن المؤقت التالي في السلسلة. يتم عرض
NULL عند عدم وجود مخازن مؤقتة في السلسلة. |
الحجم المحجوزة
uint16_t ReservedSize( void ) const
الحصول على عدد وحدات البايت ضمن المخزن المؤقت الحالي بين بداية المخزن المؤقت وموضع بدء البيانات الحالية.
التفاصيل | |
---|---|
المرتجعات |
المساحة بالبايت بين بداية المخزن المؤقت وموضع بدء البيانات الحالية.
|
طول البيانات
void SetDataLength( uint16_t aNewLen, PacketBuffer *aChainHead )
ضبط طول البيانات بالبايت في المخزن المؤقت، مع ضبط إجمالي الطول وفقًا لذلك
تضبط الدالة طول البيانات بالبايت، المخزّنة في المخزن المؤقت، مع ضبط الطول الإجمالي بشكل مناسب. عندما لا يكون المخزن المؤقت هو رأس سلسلة المخزن المؤقت (الحالة الشائعة: يضيف المتصل البيانات إلى المخزن المؤقت الأخير في سلسلة PacketBuffer قبل استدعاء طبقات أعلى)، يجب تمرير aChininHeader لتعديل الأطوال الإجمالية لكل مخزن مؤقت قبل المخزن المؤقت الحالي بشكل صحيح.
التفاصيل | |||||
---|---|---|---|---|---|
المعلَمات |
|
ضبط البدء
void SetStart( uint8_t *aNewStart )
يمكنك تحديد بيانات البدء في المخزن المؤقت وتعديل طولها وإجمالي طولها وفقًا لذلك.
التفاصيل | |||
---|---|---|---|
المعلَمات |
|
بدء
uint8_t * Start( void ) const
الحصول على مؤشر لبدء البيانات في المخزن المؤقت
التفاصيل | |
---|---|
المرتجعات |
في بداية البيانات.
|
الطول الإجمالي
uint16_t TotalLength( void ) const
احصل على إجمالي طول بيانات الحزمة في سلسلة المخزن المؤقت.
التفاصيل | |
---|---|
المرتجعات |
إجمالي الطول بالثمانيات
|
الدوال الثابتة العامة
مجاني
void Free( PacketBuffer *aPacket )
إخلاء جميع المخازن المؤقتة للحزم في إحدى السلاسل.
تقليل عدد المراجع إلى جميع المخزن المؤقت في السلسلة الحالية إذا وصل عدد المراجع إلى 0، يتم إخلاء المخزن المؤقت ذو الصلة أو يتم إرجاعه إلى مجموعات التخصيص حسب الحاجة. كقاعدة، يجب أن يتعامل المستخدمون مع هذه الطريقة باعتبارها مكافئة لدالة free()
وألا تستخدم الوسيطة بعد الاستدعاء.
التفاصيل | |||
---|---|---|---|
المعلَمات |
|
فري هيد
PacketBuffer * FreeHead( PacketBuffer *aPacket )
تفريغ المخزن المؤقت الأول في السلسلة، مع إعادة المؤشر إلى المخزن المؤقت المتبقي.
* @note When the buffer chain is referenced by multiple callers,
FreeHead()` سيفصل الرأس، ولكن لن يُعيد فرض المخزن المؤقت.
التفاصيل | |||
---|---|---|---|
المعلَمات |
|
||
المرتجعات |
سلسلة المخزن المؤقت للحزمة تتألف من ذيل المخزن المؤقت للإدخال (قد يكون
NULL ). |
New (جديد)
PacketBuffer * New( void )
يتم تخصيص PacketBuffer واحد من الحجم الأقصى التلقائي (WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPAcity_MAX) باستخدام الحجم المحجوز التلقائي (WEAVE_SYSTEM_CONFIG_x_RESERVE_SIZE) في الحمولة.
الحجم المحجوز (WEAVE_SYSTEM_CONFIG_ADGROUPCOUNT_RESERVE_SIZE) كبير بما يكفي للاحتفاظ بطبقات طبقة النقل، بالإضافة إلى العناوين المطلوبة من قِبل WeaveMessageLayer
وWeaveExchangeLayer
.
New (جديد)
PacketBuffer * New( uint16_t aReservedSize )
تخصّص PacketBuffer واحدًا من الحد الأقصى لإجمالي الحجم مع حجم حجز عنوان محدد.
المعلمة التي يتم تمريرها هي الحجم المحجوز قبل الحمولة لمطابقة عناوين الحزمة من طبقات تسلسل استدعاء الدوال البرمجية المختلفة، وليس الحجم الإجمالي للمخزن المؤقت المطلوب تخصيصه. حجم المخزن المؤقت WEAVE_SYSTEM_CONFIG_PACKETBUFFER_CAPAcity_MAX وغير محدد في المكالمة.
PacketBuffer::New(0)
: عند استدعاء هذا الأسلوب، سيتم إرجاع المخزن المؤقت بدون أي عنوان محجوز، وبالتالي تكون الحمولة بالكامل قابلة للاستخدام من قِبل المتصل. يكون هذا النمط مفيدًا على وجه الخصوص في الطبقات السفلية من حِزم الشبكات، في الحالات التي يعرف فيها المستخدم أنه سيتم نسخ الحمولة إلى الرسالة النهائية مع الاحتفاظ بالعناوين المناسبة أو عند إنشاء PacketBuffer الذي يتم إلحاقه بسلسلة من PacketBuffer عبرPacketBuffer::AddToEnd()
. المعلَمات[in] aReservedSize
مقدار مساحة العنوان للحجز.عند النجاح، المؤشر على PacketBuffer، عند تعذُّرNULL
.
جديد مع الحجم المتاح
PacketBuffer * NewWithAvailableSize( size_t aAvailableSize )
ويتم تخصيص PacketBuffer باستخدام حجم محجوز تلقائي (WEAVE_SYSTEM_CONFIG_Header_RESERVE_SIZE) في الحمولة للعناوين، وaAllocSize
بايت على الأقل من البيانات الإضافية بعد مؤشر المؤشر الأولي.
هذا الاستخدام هو الأكثر ملاءمة عند تخصيص PacketBuffer لرسالة طبقة.
التفاصيل | |||
---|---|---|---|
المعلَمات |
|
||
المرتجعات |
عند النجاح، أشِر إلى PacketBuffer في الكتلة المخصّصة. تعذّر التشغيل،
NULL . * |
جديد مع الحجم المتاح
PacketBuffer * NewWithAvailableSize( uint16_t aReservedSize, size_t aAvailableSize )
ويخصص كائن PacketBuffer مع ما لا يقل عن aReservedSize
بايت محجوزة في الحمولة للعناوين، وaAllocSize
مساحة بايت على الأقل للبيانات الإضافية بعد مؤشر المؤشر الأولي.
التفاصيل | |||||
---|---|---|---|---|---|
المعلَمات |
|
||||
المرتجعات |
عند النجاح، أشِر إلى PacketBuffer في الكتلة المخصّصة. تعذّر التشغيل،
NULL . |
الحجم الأيمن
PacketBuffer * RightSize( PacketBuffer *aPacket )
نسخ المخزن المؤقت المحدد إلى المخزن المؤقت بالحجم الصحيح إن أمكن.
هذه الدالة هي بيئة مستقلة للمقابس.
التفاصيل | |||
---|---|---|---|
المعلَمات |
|
||
المرتجعات |
المخزن المؤقت الجديد للحزمة أو المخزن المؤقت الأصلي
|