46 KiB
ذخیره دادههای موقعیت مکانی
اسکچنوت توسط نیتیا ناراسیمهان. برای مشاهده نسخه بزرگتر روی تصویر کلیک کنید.
آزمون پیش از درس
مقدمه
در درس قبلی یاد گرفتید که چگونه از یک حسگر GPS برای ثبت دادههای موقعیت مکانی استفاده کنید. برای استفاده از این دادهها جهت نمایش موقعیت یک کامیون حامل مواد غذایی و مسیر آن، لازم است این دادهها به یک سرویس IoT در فضای ابری ارسال شده و سپس در جایی ذخیره شوند.
در این درس با روشهای مختلف ذخیره دادههای IoT آشنا خواهید شد و یاد میگیرید که چگونه دادههای سرویس IoT خود را با استفاده از کد بدون سرور ذخیره کنید.
در این درس به موضوعات زیر خواهیم پرداخت:
- دادههای ساختاریافته و غیرساختاریافته
- ارسال دادههای GPS به یک IoT Hub
- مسیرهای داغ، گرم و سرد
- مدیریت رویدادهای GPS با استفاده از کد بدون سرور
- حسابهای ذخیرهسازی Azure
- اتصال کد بدون سرور به ذخیرهسازی
دادههای ساختاریافته و غیرساختاریافته
سیستمهای کامپیوتری با دادهها سروکار دارند و این دادهها در اشکال و اندازههای مختلفی ظاهر میشوند. این دادهها میتوانند از اعداد ساده تا متنهای طولانی، ویدیوها، تصاویر و دادههای IoT متغیر باشند. دادهها معمولاً به دو دسته تقسیم میشوند: دادههای ساختاریافته و دادههای غیرساختاریافته.
-
دادههای ساختاریافته دادههایی هستند که ساختاری مشخص و ثابت دارند و معمولاً به جداول داده با روابط مشخص نگاشت میشوند. یک مثال از این نوع دادهها، اطلاعات شخصی افراد شامل نام، تاریخ تولد و آدرس است.
-
دادههای غیرساختاریافته دادههایی هستند که ساختار مشخص و ثابتی ندارند و ممکن است ساختار آنها به طور مکرر تغییر کند. یک مثال از این نوع دادهها، اسناد متنی یا صفحات گسترده است.
✅ تحقیق کنید: آیا میتوانید مثالهای دیگری از دادههای ساختاریافته و غیرساختاریافته پیدا کنید؟
💁 همچنین دادههای نیمهساختاریافته وجود دارند که ساختار دارند اما در قالب جداول ثابت قرار نمیگیرند.
دادههای IoT معمولاً به عنوان دادههای غیرساختاریافته در نظر گرفته میشوند.
تصور کنید که قصد دارید دستگاههای IoT را به ناوگان وسایل نقلیه یک مزرعه بزرگ تجاری اضافه کنید. ممکن است بخواهید از دستگاههای مختلف برای انواع مختلف وسایل نقلیه استفاده کنید. برای مثال:
- برای وسایل نقلیه کشاورزی مانند تراکتورها، دادههای GPS برای اطمینان از کار در زمینهای صحیح مورد نیاز است.
- برای کامیونهای حمل مواد غذایی به انبارها، دادههای GPS به همراه دادههای سرعت و شتاب برای اطمینان از رانندگی ایمن و دادههای هویت راننده و زمان شروع/توقف برای رعایت قوانین محلی در مورد ساعات کاری راننده مورد نیاز است.
- برای کامیونهای یخچالدار، دادههای دما برای اطمینان از خراب نشدن مواد غذایی در حین حمل و نقل مورد نیاز است.
این دادهها ممکن است به طور مداوم تغییر کنند. برای مثال، اگر دستگاه IoT در کابین یک کامیون قرار داشته باشد، دادههایی که ارسال میکند ممکن است با تغییر تریلر تغییر کنند، مثلاً فقط در صورت استفاده از تریلر یخچالدار دادههای دما ارسال شود.
✅ چه دادههای دیگری از IoT ممکن است ثبت شوند؟ به انواع بارهایی که کامیونها میتوانند حمل کنند و همچنین دادههای مربوط به نگهداری فکر کنید.
این دادهها از وسیلهای به وسیله دیگر متفاوت است، اما همه آنها به یک سرویس IoT برای پردازش ارسال میشوند. سرویس IoT باید بتواند این دادههای غیرساختاریافته را پردازش کرده و آنها را به گونهای ذخیره کند که قابل جستجو یا تحلیل باشند، اما با ساختارهای مختلف این دادهها سازگار باشد.
ذخیرهسازی SQL در مقابل NoSQL
پایگاههای داده خدماتی هستند که به شما امکان ذخیره و جستجوی دادهها را میدهند. پایگاههای داده به دو نوع تقسیم میشوند: SQL و NoSQL.
پایگاههای داده SQL
اولین پایگاههای داده، سیستمهای مدیریت پایگاه داده رابطهای (RDBMS) یا پایگاه داده رابطهای بودند. این پایگاهها به عنوان پایگاههای داده SQL نیز شناخته میشوند، زیرا از زبان پرسوجوی ساختاریافته (SQL) برای تعامل با آنها جهت افزودن، حذف، بهروزرسانی یا جستجوی دادهها استفاده میشود. این پایگاهها شامل یک طرحواره (Schema) هستند - مجموعهای مشخص از جداول داده، مشابه یک صفحه گسترده. هر جدول دارای چندین ستون نامگذاری شده است. هنگام وارد کردن دادهها، یک ردیف به جدول اضافه میکنید و مقادیر را در هر یک از ستونها قرار میدهید. این ساختار دادهها را بسیار ثابت نگه میدارد - اگرچه میتوانید ستونها را خالی بگذارید، اما اگر بخواهید یک ستون جدید اضافه کنید، باید این کار را در پایگاه داده انجام دهید و مقادیر را برای ردیفهای موجود پر کنید. این پایگاهها رابطهای هستند - به این معنا که یک جدول میتواند با جدول دیگری رابطه داشته باشد.
برای مثال، اگر جزئیات شخصی کاربران را در یک جدول ذخیره کنید، برای هر کاربر یک شناسه یکتا خواهید داشت که در یک ردیف در جدولی که شامل نام و آدرس کاربر است استفاده میشود. اگر بخواهید جزئیات دیگری درباره آن کاربر، مانند خریدهای او، در جدول دیگری ذخیره کنید، یک ستون در جدول جدید برای شناسه کاربر خواهید داشت. هنگام جستجوی یک کاربر، میتوانید از شناسه او برای دریافت جزئیات شخصی از یک جدول و خریدهای او از جدول دیگر استفاده کنید.
پایگاههای داده SQL برای ذخیره دادههای ساختاریافته و زمانی که میخواهید دادهها با طرحواره شما مطابقت داشته باشند ایدهآل هستند.
✅ اگر تاکنون از SQL استفاده نکردهاید، لحظهای وقت بگذارید و درباره آن در صفحه SQL در ویکیپدیا مطالعه کنید.
برخی از پایگاههای داده SQL معروف شامل Microsoft SQL Server، MySQL و PostgreSQL هستند.
✅ تحقیق کنید: درباره برخی از این پایگاههای داده SQL و قابلیتهای آنها مطالعه کنید.
پایگاههای داده NoSQL
پایگاههای داده NoSQL به این دلیل NoSQL نامیده میشوند که ساختار سختگیرانه پایگاههای داده SQL را ندارند. این پایگاهها همچنین به عنوان پایگاههای داده سندی شناخته میشوند زیرا میتوانند دادههای غیرساختاریافته مانند اسناد را ذخیره کنند.
💁 با وجود نامشان، برخی از پایگاههای داده NoSQL به شما اجازه میدهند از SQL برای جستجوی دادهها استفاده کنید.
پایگاههای داده NoSQL طرحواره از پیش تعریفشدهای ندارند که نحوه ذخیره دادهها را محدود کند، بلکه میتوانید هر داده غیرساختاریافتهای را وارد کنید، معمولاً با استفاده از اسناد JSON. این اسناد میتوانند در پوشهها سازماندهی شوند، مشابه فایلها در رایانه شما. هر سند میتواند فیلدهای متفاوتی از سایر اسناد داشته باشد - برای مثال، اگر دادههای IoT از وسایل نقلیه مزرعه خود را ذخیره کنید، برخی ممکن است فیلدهایی برای دادههای شتابسنج و سرعت داشته باشند، در حالی که برخی دیگر ممکن است فیلدهایی برای دمای داخل تریلر داشته باشند. اگر بخواهید نوع جدیدی از کامیون، مانند کامیونی با ترازوهای داخلی برای ردیابی وزن محصولات حملشده، اضافه کنید، دستگاه IoT شما میتواند این فیلد جدید را اضافه کند و بدون هیچ تغییری در پایگاه داده ذخیره شود.
برخی از پایگاههای داده NoSQL معروف شامل Azure CosmosDB، MongoDB و CouchDB هستند.
✅ تحقیق کنید: درباره برخی از این پایگاههای داده NoSQL و قابلیتهای آنها مطالعه کنید.
در این درس، از ذخیرهسازی NoSQL برای ذخیره دادههای IoT استفاده خواهید کرد.
ارسال دادههای GPS به یک IoT Hub
در درس قبلی، دادههای GPS را از یک حسگر GPS متصل به دستگاه IoT خود ثبت کردید. برای ذخیره این دادههای IoT در فضای ابری، باید آنها را به یک سرویس IoT ارسال کنید. بار دیگر از Azure IoT Hub، همان سرویس IoT ابری که در پروژه قبلی استفاده کردید، استفاده خواهید کرد.
وظیفه - ارسال دادههای GPS به یک IoT Hub
-
یک IoT Hub جدید با استفاده از طرح رایگان ایجاد کنید.
⚠️ میتوانید در صورت نیاز به دستورالعملهای ایجاد IoT Hub از پروژه ۲، درس ۴ مراجعه کنید.
به یاد داشته باشید که یک گروه منابع جدید ایجاد کنید. نام گروه منابع جدید را
gps-sensor
و نام IoT Hub جدید را یک نام یکتا بر اساسgps-sensor
، مانندgps-sensor-<نام شما>
قرار دهید.💁 اگر هنوز IoT Hub خود را از پروژه قبلی دارید، میتوانید از آن مجدداً استفاده کنید. به یاد داشته باشید که هنگام ایجاد سایر خدمات، از نام این IoT Hub و گروه منابع آن استفاده کنید.
-
یک دستگاه جدید به IoT Hub اضافه کنید. نام این دستگاه را
gps-sensor
بگذارید. رشته اتصال دستگاه را دریافت کنید. -
کد دستگاه خود را بهروزرسانی کنید تا دادههای GPS را با استفاده از رشته اتصال دستگاه جدید به IoT Hub ارسال کند.
⚠️ میتوانید در صورت نیاز به دستورالعملهای اتصال دستگاه به IoT از پروژه ۲، درس ۴ مراجعه کنید.
-
هنگام ارسال دادههای GPS، آن را به صورت JSON با فرمت زیر ارسال کنید:
{ "gps" : { "lat" : <latitude>, "lon" : <longitude> } }
-
دادههای GPS را هر دقیقه ارسال کنید تا از محدودیت روزانه پیامها استفاده نکنید.
اگر از Wio Terminal استفاده میکنید، به یاد داشته باشید که تمام کتابخانههای لازم را اضافه کنید و زمان را با استفاده از یک سرور NTP تنظیم کنید. کد شما همچنین باید اطمینان حاصل کند که تمام دادهها را از پورت سریال قبل از ارسال موقعیت GPS خوانده است، با استفاده از کد موجود از درس قبلی. از کد زیر برای ساخت سند JSON استفاده کنید:
DynamicJsonDocument doc(1024);
doc["gps"]["lat"] = gps.location.lat();
doc["gps"]["lon"] = gps.location.lng();
اگر از یک دستگاه IoT مجازی استفاده میکنید، به یاد داشته باشید که تمام کتابخانههای لازم را با استفاده از یک محیط مجازی نصب کنید.
برای هر دو دستگاه Raspberry Pi و دستگاه IoT مجازی، از کد موجود از درس قبلی برای دریافت مقادیر عرض و طول جغرافیایی استفاده کنید، سپس آنها را با فرمت JSON صحیح با استفاده از کد زیر ارسال کنید:
message_json = { "gps" : { "lat":lat, "lon":lon } }
print("Sending telemetry", message_json)
message = Message(json.dumps(message_json))
💁 میتوانید این کد را در پوشه code/wio-terminal، code/pi یا code/virtual-device پیدا کنید.
کد دستگاه خود را اجرا کنید و اطمینان حاصل کنید که پیامها با استفاده از دستور CLI az iot hub monitor-events
به IoT Hub ارسال میشوند.
مسیرهای داغ، گرم و سرد
دادههایی که از یک دستگاه IoT به فضای ابری جریان مییابند، همیشه به صورت بلادرنگ پردازش نمیشوند. برخی دادهها نیاز به پردازش بلادرنگ دارند، برخی دیگر میتوانند کمی بعد پردازش شوند، و برخی دیگر میتوانند خیلی دیرتر پردازش شوند. جریان دادهها به خدمات مختلف که دادهها را در زمانهای مختلف پردازش میکنند، به مسیرهای داغ، گرم و سرد اشاره دارد.
مسیر داغ
مسیر داغ به دادههایی اشاره دارد که نیاز به پردازش بلادرنگ یا نزدیک به بلادرنگ دارند. شما از دادههای مسیر داغ برای هشدارها استفاده میکنید، مانند دریافت هشدارهایی که یک وسیله نقلیه به یک انبار نزدیک میشود یا دمای یک کامیون یخچالدار خیلی بالا است.
برای استفاده از دادههای مسیر داغ، کد شما به رویدادها به محض دریافت توسط خدمات ابری پاسخ میدهد.
مسیر گرم
مسیر گرم به دادههایی اشاره دارد که میتوانند کمی بعد از دریافت پردازش شوند، برای مثال برای گزارشگیری یا تحلیل کوتاهمدت. شما از دادههای مسیر گرم برای گزارشهای روزانه مسافت طیشده وسایل نقلیه استفاده میکنید، با استفاده از دادههای جمعآوریشده روز قبل.
دادههای مسیر گرم پس از دریافت توسط سرویس ابری در نوعی ذخیرهسازی که به سرعت قابل دسترسی است ذخیره میشوند.
مسیر سرد
مسیر سرد به دادههای تاریخی اشاره دارد، دادههایی که برای مدت طولانی ذخیره میشوند تا هر زمان که لازم باشد پردازش شوند. برای مثال، میتوانید از مسیر سرد برای دریافت گزارشهای سالانه مسافت طیشده وسایل نقلیه استفاده کنید یا تحلیلهایی روی مسیرها انجام دهید تا بهینهترین مسیر برای کاهش هزینه سوخت پیدا شود.
دادههای مسیر سرد در انبارهای داده ذخیره میشوند - پایگاههای دادهای که برای ذخیره حجم زیادی از دادههایی که هرگز تغییر نمیکنند طراحی شدهاند و میتوان به سرعت و به راحتی آنها را جستجو کرد. معمولاً یک کار منظم در برنامه ابری شما وجود دارد که در زمان مشخصی هر روز، هفته یا ماه اجرا میشود تا دادهها را از ذخیرهسازی مسیر گرم به انبار داده منتقل کند.
✅ به دادههایی که تاکنون در این درسها جمعآوری کردهاید فکر کنید. آیا این دادهها مسیر داغ، گرم یا سرد هستند؟
مدیریت رویدادهای GPS با استفاده از کد بدون سرور
پس از جریان یافتن دادهها به IoT Hub، میتوانید کدی بدون سرور بنویسید تا به رویدادهایی که به نقطه پایانی سازگار با Event Hub منتشر میشوند گوش دهد. این مسیر گرم است - این دادهها ذخیره میشوند و در درس بعدی برای گزارشگیری از مسیر استفاده خواهند شد.
وظیفه - مدیریت رویدادهای GPS با استفاده از کد بدون سرور
- یک برنامه Azure Functions با استفاده از CLI مربوط به Azure Functions ایجاد کنید. از زمان اجرای Python استفاده کنید و آن را در پوشهای به نام
gps-trigger
ایجاد کنید و از همین نام برای نام پروژه برنامه Functions استفاده کنید. مطمئن شوید که یک محیط مجازی برای استفاده ایجاد کردهاید.
⚠️ میتوانید در صورت نیاز به دستورالعملهای ایجاد یک پروژه Azure Functions از پروژه ۲، درس ۵ مراجعه کنید.
-
یک تریگر رویداد IoT Hub اضافه کنید که از نقطه پایانی سازگار با Event Hub در IoT Hub استفاده میکند.
⚠️ میتوانید به دستورالعملهای ایجاد یک تریگر رویداد IoT Hub از پروژه ۲، درس ۵ در صورت نیاز مراجعه کنید.
-
رشته اتصال نقطه پایانی سازگار با Event Hub را در فایل
local.settings.json
تنظیم کنید و کلید مربوط به آن ورودی را در فایلfunction.json
استفاده کنید. -
از برنامه Azurite به عنوان یک شبیهساز ذخیرهسازی محلی استفاده کنید.
-
برنامه توابع خود را اجرا کنید تا مطمئن شوید که رویدادها را از دستگاه GPS شما دریافت میکند. اطمینان حاصل کنید که دستگاه IoT شما نیز در حال اجرا است و دادههای GPS ارسال میکند.
Python EventHub trigger processed an event: {"gps": {"lat": 47.73481, "lon": -122.25701}}
حسابهای ذخیرهسازی Azure
حسابهای ذخیرهسازی Azure یک سرویس ذخیرهسازی چندمنظوره است که میتواند دادهها را به روشهای مختلف ذخیره کند. شما میتوانید دادهها را به صورت blob، در صفها، در جداول یا به صورت فایل ذخیره کنید و همه اینها به طور همزمان امکانپذیر است.
ذخیرهسازی Blob
کلمه Blob به معنای اشیاء بزرگ باینری است، اما به اصطلاحی برای هر نوع داده بدون ساختار تبدیل شده است. شما میتوانید هر نوع دادهای را در ذخیرهسازی blob ذخیره کنید، از اسناد JSON حاوی دادههای IoT گرفته تا فایلهای تصویری و ویدیویی. ذخیرهسازی blob دارای مفهومی به نام containers است، که به عنوان سطلهایی نامگذاری شدهاند که میتوانید دادهها را در آنها ذخیره کنید، مشابه جداول در یک پایگاه داده رابطهای. این کانتینرها میتوانند یک یا چند پوشه برای ذخیره blobها داشته باشند و هر پوشه میتواند شامل پوشههای دیگری باشد، مشابه نحوه ذخیره فایلها در هارد دیسک کامپیوتر شما.
شما در این درس از ذخیرهسازی blob برای ذخیره دادههای IoT استفاده خواهید کرد.
✅ تحقیق کنید: درباره ذخیرهسازی Blob در Azure مطالعه کنید.
ذخیرهسازی جدول
ذخیرهسازی جدول به شما امکان میدهد دادههای نیمهساختاریافته را ذخیره کنید. ذخیرهسازی جدول در واقع یک پایگاه داده NoSQL است، بنابراین نیازی به تعریف مجموعهای از جداول از پیش ندارد، اما برای ذخیره دادهها در یک یا چند جدول طراحی شده است، با کلیدهای منحصربهفرد برای تعریف هر سطر.
✅ تحقیق کنید: درباره ذخیرهسازی جدول در Azure مطالعه کنید.
ذخیرهسازی صف
ذخیرهسازی صف به شما امکان میدهد پیامهایی با حداکثر اندازه ۶۴ کیلوبایت را در یک صف ذخیره کنید. شما میتوانید پیامها را به انتهای صف اضافه کنید و از ابتدای صف بخوانید. صفها پیامها را به طور نامحدود ذخیره میکنند تا زمانی که فضای ذخیرهسازی موجود باشد، بنابراین امکان ذخیره پیامها برای مدت طولانی و سپس خواندن آنها در زمان مورد نیاز را فراهم میکند. به عنوان مثال، اگر بخواهید یک کار ماهانه برای پردازش دادههای GPS اجرا کنید، میتوانید هر روز پیامها را به صف اضافه کنید و سپس در پایان ماه همه پیامها را از صف پردازش کنید.
✅ تحقیق کنید: درباره ذخیرهسازی صف در Azure مطالعه کنید.
ذخیرهسازی فایل
ذخیرهسازی فایل به معنای ذخیره فایلها در فضای ابری است و هر برنامه یا دستگاهی میتواند با استفاده از پروتکلهای استاندارد صنعتی به آن متصل شود. شما میتوانید فایلها را در ذخیرهسازی فایل بنویسید و سپس آن را به عنوان یک درایو در کامپیوتر خود نصب کنید.
✅ تحقیق کنید: درباره ذخیرهسازی فایل در Azure مطالعه کنید.
اتصال کد بدون سرور به ذخیرهسازی
اکنون برنامه توابع شما باید به ذخیرهسازی blob متصل شود تا پیامها را از IoT Hub ذخیره کند. دو روش برای انجام این کار وجود دارد:
- در داخل کد تابع، با استفاده از SDK پایتون برای ذخیرهسازی blob به آن متصل شوید و دادهها را به صورت blob بنویسید.
- از یک اتصال خروجی تابع استفاده کنید تا مقدار بازگشتی تابع به ذخیرهسازی blob متصل شود و blob به طور خودکار ذخیره شود.
در این درس، شما از SDK پایتون استفاده خواهید کرد تا ببینید چگونه میتوان با ذخیرهسازی blob تعامل داشت.
دادهها به صورت یک blob JSON با فرمت زیر ذخیره خواهند شد:
{
"device_id": <device_id>,
"timestamp" : <time>,
"gps" :
{
"lat" : <latitude>,
"lon" : <longitude>
}
}
وظیفه - اتصال کد بدون سرور به ذخیرهسازی
-
یک حساب ذخیرهسازی Azure ایجاد کنید. نام آن را چیزی مانند
gps<نام شما>
بگذارید.⚠️ میتوانید به دستورالعملهای ایجاد یک حساب ذخیرهسازی از پروژه ۲، درس ۵ در صورت نیاز مراجعه کنید.
اگر هنوز یک حساب ذخیرهسازی از پروژه قبلی دارید، میتوانید از آن استفاده مجدد کنید.
💁 شما میتوانید از همان حساب ذخیرهسازی برای استقرار برنامه توابع Azure خود در ادامه این درس استفاده کنید.
-
فرمان زیر را برای دریافت رشته اتصال حساب ذخیرهسازی اجرا کنید:
az storage account show-connection-string --output table \ --name <storage_name>
<storage_name>
را با نام حساب ذخیرهسازی که در مرحله قبل ایجاد کردید جایگزین کنید. -
یک ورودی جدید به فایل
local.settings.json
برای رشته اتصال حساب ذخیرهسازی خود اضافه کنید، با استفاده از مقداری که در مرحله قبل دریافت کردید. نام آن راSTORAGE_CONNECTION_STRING
بگذارید. -
موارد زیر را به فایل
requirements.txt
اضافه کنید تا بستههای Pip ذخیرهسازی Azure نصب شوند:azure-storage-blob
بستهها را از این فایل در محیط مجازی خود نصب کنید.
اگر خطایی دریافت کردید، نسخه Pip خود را در محیط مجازی به آخرین نسخه با فرمان زیر ارتقا دهید و دوباره تلاش کنید:
pip install --upgrade pip
-
در فایل
__init__.py
برایiot-hub-trigger
، دستورات import زیر را اضافه کنید:import json import os import uuid from azure.storage.blob import BlobServiceClient, PublicAccess
ماژول سیستم
json
برای خواندن و نوشتن JSON استفاده خواهد شد، ماژول سیستمos
برای خواندن رشته اتصال استفاده خواهد شد، ماژول سیستمuuid
برای تولید یک شناسه منحصربهفرد برای خواندن GPS استفاده خواهد شد.بسته
azure.storage.blob
شامل SDK پایتون برای کار با ذخیرهسازی blob است. -
قبل از متد
main
، تابع کمکی زیر را اضافه کنید:def get_or_create_container(name): connection_str = os.environ['STORAGE_CONNECTION_STRING'] blob_service_client = BlobServiceClient.from_connection_string(connection_str) for container in blob_service_client.list_containers(): if container.name == name: return blob_service_client.get_container_client(container.name) return blob_service_client.create_container(name, public_access=PublicAccess.Container)
SDK blob پایتون یک متد کمکی برای ایجاد کانتینر در صورت عدم وجود ندارد. این کد رشته اتصال را از فایل
local.settings.json
(یا تنظیمات برنامه پس از استقرار در فضای ابری) بارگذاری میکند، سپس یک کلاسBlobServiceClient
از این رشته اتصال ایجاد میکند تا با حساب ذخیرهسازی blob تعامل داشته باشد. سپس از طریق تمام کانتینرهای حساب ذخیرهسازی blob حلقه میزند و به دنبال کانتینری با نام ارائه شده میگردد - اگر یکی پیدا کند، یک کلاسContainerClient
بازمیگرداند که میتواند با کانتینر برای ایجاد blobها تعامل داشته باشد. اگر یکی پیدا نکند، کانتینر ایجاد میشود و کلاینت برای کانتینر جدید بازمیگردد.هنگامی که کانتینر جدید ایجاد میشود، دسترسی عمومی برای جستجوی blobها در کانتینر اعطا میشود. این مورد در درس بعدی برای نمایش دادههای GPS روی نقشه استفاده خواهد شد.
-
برخلاف رطوبت خاک، در این کد میخواهیم هر رویداد را ذخیره کنیم، بنابراین کد زیر را در داخل حلقه
for event in events:
در تابعmain
، زیر دستورlogging
اضافه کنید:device_id = event.iothub_metadata['connection-device-id'] blob_name = f'{device_id}/{str(uuid.uuid1())}.json'
این کد شناسه دستگاه را از متادیتای رویداد دریافت میکند، سپس از آن برای ایجاد نام blob استفاده میکند. blobها میتوانند در پوشهها ذخیره شوند، و شناسه دستگاه برای نام پوشه استفاده خواهد شد، بنابراین هر دستگاه تمام رویدادهای GPS خود را در یک پوشه خواهد داشت. نام blob این پوشه، به دنبال آن نام سند، با اسلشهای جلو جدا شده است، مشابه مسیرهای لینوکس و macOS (مشابه ویندوز نیز، اما ویندوز از اسلشهای عقب استفاده میکند). نام سند یک شناسه منحصربهفرد است که با استفاده از ماژول
uuid
پایتون تولید شده است، با نوع فایلjson
.به عنوان مثال، برای شناسه دستگاه
gps-sensor
، نام blob ممکن استgps-sensor/a9487ac2-b9cf-11eb-b5cd-1e00621e3648.json
باشد. -
کد زیر را زیر این کد اضافه کنید:
container_client = get_or_create_container('gps-data') blob = container_client.get_blob_client(blob_name)
این کد کلاینت کانتینر را با استفاده از کلاس کمکی
get_or_create_container
دریافت میکند، و سپس یک شیء کلاینت blob با استفاده از نام blob دریافت میکند. این کلاینتهای blob میتوانند به blobهای موجود اشاره کنند، یا همانطور که در اینجا است، به blob جدید. -
کد زیر را بعد از این اضافه کنید:
event_body = json.loads(event.get_body().decode('utf-8')) blob_body = { 'device_id' : device_id, 'timestamp' : event.iothub_metadata['enqueuedtime'], 'gps': event_body['gps'] }
این کد بدنه blob را که در ذخیرهسازی blob نوشته خواهد شد، میسازد. این یک سند JSON است که شامل شناسه دستگاه، زمانی که تلهمتری به IoT Hub ارسال شده است، و مختصات GPS از تلهمتری است.
💁 مهم است که از زمان صفبندی پیام به جای زمان فعلی استفاده کنید تا زمانی که پیام ارسال شده است را دریافت کنید. ممکن است پیام برای مدتی در هاب باقی بماند تا زمانی که برنامه توابع اجرا شود.
-
کد زیر را زیر این کد اضافه کنید:
logging.info(f'Writing blob to {blob_name} - {blob_body}') blob.upload_blob(json.dumps(blob_body).encode('utf-8'))
این کد ثبت میکند که یک blob با جزئیات آن نوشته خواهد شد، سپس بدنه blob را به عنوان محتوای blob جدید آپلود میکند.
-
برنامه توابع را اجرا کنید. خواهید دید که blobها برای تمام رویدادهای GPS در خروجی نوشته میشوند:
[2021-05-21T01:31:14.325Z] Python EventHub trigger processed an event: {"gps": {"lat": 47.73092, "lon": -122.26206}} ... [2021-05-21T01:31:14.351Z] Writing blob to gps-sensor/4b6089fe-ba8d-11eb-bc7b-1e00621e3648.json - {'device_id': 'gps-sensor', 'timestamp': '2021-05-21T00:57:53.878Z', 'gps': {'lat': 47.73092, 'lon': -122.26206}}
💁 اطمینان حاصل کنید که مانیتور رویداد IoT Hub را همزمان اجرا نمیکنید.
💁 میتوانید این کد را در پوشه code/functions پیدا کنید.
وظیفه - تأیید blobهای آپلود شده
-
برای مشاهده blobهای ایجاد شده، میتوانید از Azure Storage Explorer، یک ابزار رایگان که به شما امکان مشاهده و مدیریت حسابهای ذخیرهسازی را میدهد، یا از CLI استفاده کنید.
-
برای استفاده از CLI، ابتدا به یک کلید حساب نیاز دارید. فرمان زیر را برای دریافت این کلید اجرا کنید:
az storage account keys list --output table \ --account-name <storage_name>
<storage_name>
را با نام حساب ذخیرهسازی جایگزین کنید.مقدار
key1
را کپی کنید. -
فرمان زیر را برای لیست کردن blobها در کانتینر اجرا کنید:
az storage blob list --container-name gps-data \ --output table \ --account-name <storage_name> \ --account-key <key1>
<storage_name>
را با نام حساب ذخیرهسازی جایگزین کنید و<key1>
را با مقدارkey1
که در مرحله قبل کپی کردید جایگزین کنید.این فرمان تمام blobها را در کانتینر لیست خواهد کرد:
Name Blob Type Blob Tier Length Content Type Last Modified Snapshot ---------------------------------------------------- ----------- ----------- -------- ------------------------ ------------------------- ---------- gps-sensor/1810d55e-b9cf-11eb-9f5b-1e00621e3648.json BlockBlob Hot 45 application/octet-stream 2021-05-21T00:54:27+00:00 gps-sensor/18293e46-b9cf-11eb-9f5b-1e00621e3648.json BlockBlob Hot 45 application/octet-stream 2021-05-21T00:54:28+00:00 gps-sensor/1844549c-b9cf-11eb-9f5b-1e00621e3648.json BlockBlob Hot 45 application/octet-stream 2021-05-21T00:54:28+00:00 gps-sensor/1894d714-b9cf-11eb-9f5b-1e00621e3648.json BlockBlob Hot 45 application/octet-stream 2021-05-21T00:54:28+00:00
-
یکی از blobها را با استفاده از فرمان زیر دانلود کنید:
az storage blob download --container-name gps-data \ --account-name <storage_name> \ --account-key <key1> \ --name <blob_name> \ --file <file_name>
<storage_name>
را با نام حساب ذخیرهسازی جایگزین کنید و<key1>
را با مقدارkey1
که در مرحله قبل کپی کردید جایگزین کنید.<blob_name>
را با نام کامل از ستونName
خروجی مرحله قبل، شامل نام پوشه جایگزین کنید.<file_name>
را با نام یک فایل محلی برای ذخیره blob جایگزین کنید.
پس از دانلود، میتوانید فایل JSON را در VS Code باز کنید و blob حاوی جزئیات مکان GPS را مشاهده کنید:
{"device_id": "gps-sensor", "timestamp": "2021-05-21T00:57:53.878Z", "gps": {"lat": 47.73092, "lon": -122.26206}}
-
وظیفه - استقرار برنامه توابع خود در فضای ابری
اکنون که برنامه توابع شما کار میکند، میتوانید آن را در فضای ابری مستقر کنید.
-
یک برنامه توابع Azure جدید ایجاد کنید، با استفاده از حساب ذخیرهسازی که قبلاً ایجاد کردید. نام آن را چیزی مانند
gps-sensor-
بگذارید و یک شناسه منحصربهفرد به انتهای آن اضافه کنید، مانند چند کلمه تصادفی یا نام خودتان.⚠️ میتوانید به دستورالعملهای ایجاد یک برنامه توابع از پروژه ۲، درس ۵ در صورت نیاز مراجعه کنید.
-
مقادیر
IOT_HUB_CONNECTION_STRING
وSTORAGE_CONNECTION_STRING
را به تنظیمات برنامه آپلود کنید.⚠️ میتوانید به دستورالعملهای آپلود تنظیمات برنامه از پروژه ۲، درس ۵ در صورت نیاز مراجعه کنید.
-
برنامه توابع محلی خود را در فضای ابری مستقر کنید.
⚠️ میتوانید در صورت نیاز به دستورالعملهای استقرار برنامه Functions خود از پروژه ۲، درس ۵ مراجعه کنید.
🚀 چالش
دادههای GPS کاملاً دقیق نیستند و مکانهای شناساییشده ممکن است چند متر یا بیشتر خطا داشته باشند، بهویژه در تونلها و مناطق با ساختمانهای بلند.
به این فکر کنید که چگونه ناوبری ماهوارهای میتواند این مشکل را حل کند؟ چه دادههایی در اختیار سیستم ناوبری ماهوارهای شما قرار دارد که میتواند پیشبینیهای بهتری درباره مکان شما ارائه دهد؟
آزمون پس از درس
مرور و مطالعه شخصی
- درباره دادههای ساختاریافته در صفحه مدل داده در ویکیپدیا مطالعه کنید.
- درباره دادههای نیمهساختاریافته در صفحه دادههای نیمهساختاریافته در ویکیپدیا مطالعه کنید.
- درباره دادههای غیرساختاریافته در صفحه دادههای غیرساختاریافته در ویکیپدیا مطالعه کنید.
- اطلاعات بیشتری درباره ذخیرهسازی Azure و انواع مختلف ذخیرهسازی در مستندات ذخیرهسازی Azure بخوانید.
تکلیف
سلب مسئولیت:
این سند با استفاده از سرویس ترجمه هوش مصنوعی Co-op Translator ترجمه شده است. در حالی که ما تلاش میکنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه میشود از ترجمه حرفهای انسانی استفاده کنید. ما مسئولیتی در قبال سوء تفاهمها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.