"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > إرسال بيانات جهاز إنترنت الأشياء عبر وسيط MQTT.

إرسال بيانات جهاز إنترنت الأشياء عبر وسيط MQTT.

تم النشر بتاريخ 2024-11-08
تصفح:626

Sending IoT Device Data via MQTT broker.

في منشور سابق، أظهرنا كيفية إرسال واستقبال الرسائل من أجهزة إنترنت الأشياء باستخدام وسيط MQTT. في هذا المنشور سنقوم بتوسيع هذه الفكرة إلى مثال حقيقي.

لنفترض أن لديك جهاز إنترنت الأشياء الذي يقيس درجة الحرارة والرطوبة في دفيئة (ليس من الصعب صنع جهاز باستخدام Raspberry Pi أو Arduino).

نريد مراقبة ظروف الاحتباس الحراري عن بعد من كمبيوتر آخر أو ربما من خدمة تسجيل مركزية. في المنشور السابق، أظهرنا تنفيذ Go للتعليمات البرمجية لإرسال الرسائل، لذلك سنقوم بتوسيع هذا المثال.

بدلاً من مجرد إرسال سلسلة تقول "درجة الحرارة هي x، والرطوبة هي y"، فلنحدد بنية الرسالة والجهاز. ضع في اعتبارك أن لديك (أو ترغب في إضافته في المستقبل) جهازًا لمراقبة الرطوبة أو هطول الأمطار وتريد توصيله أيضًا.

لترك إمكانية وجود أجهزة وأنواع متعددة مفتوحة، نحتاج إلى نموذج بيانات للتعامل مع ذلك.

type Message struct {
    Time   time.Time `json:"time"`
    Device Device    `json:"device"`
}

type Device interface {
    ID() string
    Name() string
}

type TempRHDevice struct {
    Id         string  `json:"id"`
    DeviceName string  `json:"name,omitempty"`
    Temp       float32 `json:"temp,omitempty"`
    Rh         float32 `json:"rh,omitempty"`
}

func (t TempRHDevice) ID() string {
    return t.Id
}

func (t TempRHDevice) Name() string {
    return t.DeviceName
}

بنية الرسالة هي ما سيتم إرساله إلى وسيط MQTT. لقد أنشأنا واجهة للتعامل مع السمات المشتركة لأجهزة إنترنت الأشياء لدينا واستخلاص تفاصيل الأجهزة المحددة.

جهاز TempRHD هو جهازنا الذي يقيس درجة الحرارة والرطوبة. يقوم بتنفيذ واجهة الجهاز، بحيث يمكن استخدامه في الرسالة.

بعد ذلك، نحتاج إلى إرسال الرسالة إلى الوسيط. سنستخدم تنسيق JSON لبساطته في هذا المثال. لاحظ أنه في نظام واسع النطاق يحتوي على آلاف أو أكثر من الأجهزة، قد نرغب في استخدام تنسيق أكثر إحكاما.

message := generateRandomMessage()
payload, err := json.Marshal(message)
if err != nil {
    panic(err)
}
token := client.Publish(topic, 0, false, payload)

يجعل Go التنظيم في JSON أمرًا سهلاً للغاية. بمجرد تنظيمها، يتم إرسال رسالة json إلى الوسيط.

ما الذي نريد فعله أيضًا بالبيانات بمجرد حصولنا عليها: تخزينها في قاعدة بيانات، وعرضها على لوحة المعلومات، والتحقق من قيم حالات الإنذار. سنحتاج إلى تحويل json لجعله قابلاً للاستخدام.

على الجانب المتلقي، نحتاج فقط إلى إلغاء تنظيم json في البنية. سنستخدم بنية مشابهة لتلك المستخدمة في جانب الإرسال؛ ولكننا نحتاج إلى طريقة للتنظيم في نوع ملموس بدلاً من واجهة الجهاز في الرسالة. سنضيف طريقة إلغاء تنظيم مخصصة في الرسالة لجعل الكود أكثر نظافة أيضًا

type rawMessage struct {
    Time   time.Time `json:"time"`
    Device TempRHDevice    `json:"device"`
}
func (m *Message) UnmarshalJSON(data []byte) error {
    var raw rawMessage
    if err := json.Unmarshal(data, &raw); err != nil {
        return err
    }
    m.Time = raw.Time
    m.Device = &raw.Device
    return nil
}

...

func processMsg(ctx context.Context, ....

...

    case msg, ok := 



ومن المناسب الإشارة هنا إلى أن هذه الطريقة تصبح معقدة عند إضافة المزيد من أنواع الأجهزة. على سبيل المثال، كيف ستعرف طريقة UnmarshalJSON نوع الجهاز الذي تحتوي عليه الرسالة. يمكننا القيام ببعض المنطق الذكي في UnmarshalJSON لاكتشاف النوع.

بالنسبة لبديل آخر، تذكر أنه يمكن استخدام MQTT للنشر في موضوعات متعددة ومن الممارسات الشائعة استخدام اصطلاح تسمية هرمي للموضوعات. لذا، في حالة وجود أنواع متعددة من الأجهزة في مثال الدفيئة، فإن الطريقة الموصى بها هي نشر أنواع مختلفة من الأجهزة في موضوعات مختلفة. هذه هي الطريقة التي سنتعامل بها مع المضي قدمًا عندما نضيف أنواعًا جديدة من الأجهزة.

في مثال الدفيئة، يمكن تنظيم أسماء المواضيع مثل:

/greenhouse/temprh/deviceid
/greenhouse/moisture/deviceid

في MQTT، يمكننا الاشتراك في المواضيع باستخدام موضوع بدل، مثل:

if token := client.Subscribe("/greenhouse/#", 0, nil); token.Wait() && token.Error() != nil {
        fmt.Println(token.Error())
        os.Exit(1)
    }

والتي سوف تتطابق مع جميع الأجهزة الموجودة في مساحة اسم الدفيئة. ثم سنحتاج فقط إلى إضافة منطق إلى ProcessMsg() للنظر في موضوع الرسالة الواردة لمعرفة كيفية إلغاء تنظيمها.

الآن بعد أن أصبح لدينا رسالة الجهاز في شكل قابل للاستخدام، ما الذي يجب فعله بها. في المقالة التالية من هذه السلسلة، سنوضح أسلوبنا في استمرار الرسالة في PostGres.

كالعادة يمكن العثور على رمز المصدر الكامل للمرسل هنا ويمكن العثور على رمز المشترك هنا.

اسمحوا لي أن أعرف أفكارك في التعليقات.

شكرًا!

بيان الافراج تم نشر هذه المقالة على: https://dev.to/johnscode/sending-iot-device-data-via-mqtt-broker-3ji6?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3