# লোকেশন ডেটা সংরক্ষণ ![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-12.jpg) > স্কেচনোটটি তৈরী করেছেন [Nitya Narasimhan](https://github.com/nitya)। বড় সংস্করণে দেখার জন্য ছবিটিতে ক্লিক করতে হবে। ## লেকচার-পূর্ববর্তী কুইজ [লেকচার-পূর্ববর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/23) ## সূচনা গত পাঠে কীভাবে অবস্থানের ডেটা ক্যাপচার করতে একটি জিপিএস সেন্সর ব্যবহার করতে হয় তা আমরা শিখেছিলাম। খাদ্যসামগ্রীতে ভর্তি একটি ট্রাকের অবস্থান এবং এটির যাত্রার জন্য এই ডেটাটি ব্যবহার করতে, এটি ক্লাউডে আইওটি সার্ভিসে প্রেরণ করতে হবে এবং তারপরে কোথাও সংরক্ষণ করা দরকার। এই পাঠে আইওটি ডেটা সঞ্চয় করার বিভিন্ন উপায় সম্পর্কে আমরা শিখব এবং সার্ভারলেস কোড ব্যবহার করে কীভাবে আইওটি পরিষেবা থেকে ডেটা সংরক্ষণ করা যায় তাও শিখতে পারবো। এই পাঠে আমরা দেখবো: * [কাঠামোগত এবং কাঠামোবিহীন ডেটা](#কাঠামোগত-এবং-কাঠামোবিহীন-ডেটা) * [GPS ডেটা IoT Hub এ প্রেরণ](#send-gps-data-to-an-iot-hub) * [Hot, Warm, এবং Cold Path](#Hot-Warm-এবং-Cold-Path) * [সার্ভারবিহীন কোড ব্যবহার করে জিপিএস ইভেন্টগুলি পরিচালনা](#সার্ভারবিহীন-কোড-ব্যবহার-করে-জিপিএস-ইভেন্টগুলি-পরিচালনা) * [Azure স্টোরেজ অ্যাকাউন্ট](#azure-স্টোরেজ-অ্যাকাউন্ট) * [সার্ভারবিহীন-কোডকে-স্টোরেজে-সংযুক্তকরণ](#সার্ভারবিহীন-কোডকে-স্টোরেজে-সংযুক্তকরণ) ## কাঠামোগত এবং কাঠামোবিহীন ডেটা কম্পিউটার সিস্টেমগুলি ডেটা নিয়ে কাজ করে এবং এই ডেটা বিভিন্ন আকার এবং ধরণের হয়ে থাকে। এটি একক সংখ্যা থেকে শুরু করে প্রচুর পরিমাণে টেক্সট, ভিডিও, চিত্র বা আইওটি ডেটা হতে পারে। ডেটা সাধারণত দুই ভাগে বিভক্ত করা যায় - *কাঠামোগত* ডেটা এবং *কাঠামোবিহীন* ডেটা। * **কাঠামোগত ডেটা (Structured Data)** হল এমন ধরণের ডেটা যা একটি সংজ্ঞায়িত, অনমনীয় কাঠামোযুক্ত, যা পরিবর্তিত হয়না এবং সাধারণত টেবিল আকারে সাজানো যায় এবং অন্যান্য ডেটার সাথে কোনোভাবে সম্পর্কিত করা যায়। একটি উদাহরণ হল কোনো ব্যক্তির নাম, জন্ম তারিখ এবং ঠিকানা সহ বিশদ বিবরণ। * **কাঠামোবিহীন ডেটা (Unstructured Data)** হল একটি অসংজ্ঞায়িত, নমনীয় কাঠামোযুক্ত ডেটা, যা ঘন ঘন কাঠামো পরিবর্তন করতে পারে। একটি উদাহরণ হলো - লিখিত নথি বা স্প্রেডশিট । ✅ আর কী কী উদাহরণ আমরা কাঠামোগত এবং কাঠামোবিহীন ডেটাতে ভাবতে পারি তা চিন্তা করি। > 💁 এছাড়াও আধা-কাঠামোগত (Semi-Structured) ডেটা রয়েছে যা কাঠামোগত, তবে তথ্যের নির্দিষ্ট টেবিল আকারে সাজানো যায়না । আইওটি ডেটা সাধারণত কাঠামোবিহীন ডেটা (Unstructured Data) হিসাবে বিবেচিত হয়। কল্পনা করি আমরা একটি বড় বাণিজ্যিক খামারের জন্য যানবাহনের বহরে আইওটি ডিভাইস যুক্ত করেছি। বিভিন্ন ধরণের গাড়ির জন্য বিভিন্ন ডিভাইস ব্যবহার করার দরকার হতে পারে। উদাহরণস্বরূপ: * ট্রাক্টরের জন্য জিপিএস ডেটা দরকার হতে পারে এটি নিশ্চিত করার জন্য যে তারা সঠিক খামারে বা ক্ষেতে কাজ করছে * চালকরা নিরাপদে গাড়ি চালাচ্ছে কিনা, ড্রাইভারের পরিচয় নিশ্চিতকরণ এবং কতক্ষণ কাজ করছে তা নিশ্চিত করার জন্য খাদ্যসামগ্রী পরিবহনের ট্রাকগুলিতে জিপিএস ডেটার পাশাপাশি গতিসংক্রান্ত ডেটাও প্রয়োজন। * রেফ্রিজারেটেড ট্রাকের জন্য তাপমাত্রার তথ্য খুব গুরুত্বপূর্ণ যাতে খাবার খুব গরম বা ঠান্ডা না হয় এবং পরিবহণের সময় তা নষ্ট না হয়। এই ডেটা পরিবর্তিত হতে পারে। উদাহরণস্বরূপ, যদি আইওটি ডিভাইসটি একটি ট্রাকের ক্যাবে থাকে, তবে ট্রেলার পরিবর্তনের সাথে সাথে ডেটাও পরিবর্তিত হতে পারে, উদাহরণস্বরূপ যখন একটি রেফ্রিজারেটেড ট্রেলার ব্যবহার করা হবে, তখনই শুধু তাপমাত্রার ডেটা প্রেরণ করা হবে। ✅ আর কোন কোন আইওটি ডেটা গ্রহণ যেতে পারে? ট্রাকগুলি যে ধরণের বোঝা বহন করতে পারে সে সম্পর্কে একটু চিন্তা করি এবং সেইসাথে রক্ষণাবেক্ষণের ডেটা সম্পর্কেও ভাবা যেতে পারে। এই তথ্য যানবাহনের উপর নির্ভর করে পরিবর্তিত হয়, কিন্তু এসব তথ্যাবলি আসলে প্রক্রিয়াকরণের জন্য একই IoT সার্ভিসে পাঠানো হয়। আইওটি সার্ভিসটিকে এই কাঠামোবিহীন ডেটা প্রক্রিয়া করতে পারতে হবে, এটিকে এমনভাবে সংরক্ষণ করতে হবে যা এটি অনুসন্ধান বা বিশ্লেষণের অনুমতি দেয় আবার এই ডেটা বিভিন্ন কাঠামোর সাথেও যেন কাজ করতে পারে। ### SQL এবং NoSQL স্টোরেজ ডেটাবেসগুলি এমন পরিষেবা যা ডেটা সংরক্ষণ এবং কুয়েরি করার সুযোগ দেয়। ডাটাবেস দুই প্রকার হয় - SQL এবং NoSQL #### SQL databases প্রথমদিকের ডাটাবেসগুলো ছিল রিলেশনাল ডাটাবেস ম্যানেজমেন্ট সিস্টেমস (আরডিবিএমএস), বা রিলেশনাল ডাটাবেস। স্ট্রাকচার্ড ক্যোয়ারী ল্যাঙ্গুয়েজ (এসকিউএল) এখানে ডেটা যোগ, অপসারণ, আপডেট বা কোয়েরি করার জন্য তাদের সাথে ইন্টারঅ্যাক্ট করার পরে এটি এসকিউএল ডেটাবেস নামেও পরিচি্তি লাভ করে। এই ডাটাবেসগুলো একটি স্কিমা নিয়ে গঠিত যা স্প্রেডশীটের মতই ডেটা টেবিলের একটি সু-সংজ্ঞায়িত সেট। প্রতিটি টেবিলে একাধিক নামযুক্ত কলাম রয়েছে। যখন ডেটা যোগ বা insert করা, টেবিলে একটি সারি যোগ করা, প্রতিটি কলামে মান রাখা - এসব করা যায়। এটি ডেটাগুলিকে একটি অত্যন্ত কঠোর কাঠামোর মধ্যে রাখে - যদিও কলামগুলি আমরা চাইলে খালি রাখতে পারি, তবে একটি নতুন কলাম যুক্ত করতে চাইলে অবশ্যই বিদ্যমান সারির (ROW) মানগুলি পূরণ করতে হবে। এই ডেটাবেসগুলি রিলেশনাল - তাই এখানে একটি টেবিলের অন্যটির সাথে সম্পর্ক থাকতে পারে। ![A relational database with the ID of the User table relating to the user ID column of the purchases table, and the ID of the products table relating to the product ID of the purchases table](../../../../images/sql-database.png) উদাহরণস্বরূপ, যদি কোন একটি টেবিলে আমরা কোনো ব্যবহারকারীর ব্যক্তিগত বিবরণ সংরক্ষণ করি, তাহলে প্রতি ব্যবহারকারীর জন্য অভ্যন্তরীণ স্বতন্ত্র (UNIQUE) আইডি থাকবে যা ব্যবহারকারীর নাম এবং ঠিকানা সম্বলিত সারিতে ব্যবহৃত হয়। আমরা যদি সেই ব্যবহারকারী সম্পর্কে অন্যান্য বিবরণ যেমন তাদের ক্রয় তালিকা অন্য টেবিলে সংরক্ষণ করতে চাই, তাহলে সেই ব্যবহারকারীর আইডির জন্য আমাদের নতুন টেবিলে একটি কলাম থাকবে। যখন আমরা কোন ব্যবহারকারী্র তথ্য খুঁজবো, আমরা তাদের আইডি ব্যবহার করে তাদের ব্যক্তিগত তথ্য এক টেবিল থেকে এবং অন্য টেবিল থেকে তাদের কেনাকাটার সকল তথ্য পেয়ে যাব। এসকিউএল ডেটাবেসগুলি কাঠামোগত ডেটা সংরক্ষণের জন্য এবং স্কিমার সাথে সামঞ্জস্য রাখার জন্য আদর্শ। ✅ এসকিউএল ব্যবহারের অভিজ্ঞতা না থাকলে [SQL page - Wikipedia](https://wikipedia.org/wiki/SQL) থেকে বিস্তারিত জানতে পারবো। কিছু বহুল পরিচিত এসকিউএল ডেটাবেস হলো Microsoft SQL Server, MySQL এবং PostgreSQL । ✅ কিছু গবেষণা করা যাক: এসকিউএল ডেটাবেস এবং এদের কর্মপরিধি সম্পর্কে জ্ঞান অর্জন করি। #### NoSQL ডেটাবেস NoSQL ডেটাবসেসের নামের আগে NO বা 'না' রাখার কারণই হলো তাদের সেই সুগঠিত কাঠামো নেই। তারা 'ডকুমেন্ট ডেটাবেস' নামেও পরিচিত কারণ তারা ডকুমেন্টের মতো অসংগঠিত ডেটা সংরক্ষণ করতে পারে। > 💁 এক্ষেত্রে জেনে রাখা ভালো যে কিছু NoSQL ডেটাবেসে আমরা SQL এর মত করে কুয়েরি করতে পারবো। ![Documents in folders in a NoSQL database](../../../../images/noqsl-database.png) NoSQL ডাটাবেসের একটি পূর্বনির্ধারিত স্কিমা নেই যা ডেটা কিভাবে সংরক্ষণ করা হয় তা সীমাবদ্ধ করবে, বরং এর পরিবর্তে আমরা সাধারণত JSON ডকুমেন্ট ব্যবহার করে যেকোনো অবিক্রিত ডেটা সন্নিবেশ করতে পারি। এই ডকুমেন্টগুলো আমাদের কম্পিউটারের ফাইলের মতো ফোল্ডারে সংগঠিত হতে পারে। প্রতিটি ডকুমেন্টে ভিন্ন ভিন্ন ফিল্ড থাকতে পারে - উদাহরণস্বরূপ, যদি আমরা আমাদের খামারের যানবাহন থেকে আইওটি ডেটা সংরক্ষণ করি, কারও কারও জন্য অ্যাকসিলরোমিটার এবং গতির ডেটার ফিল্ড থাকতে পারে, অন্যদের ট্রেলারে তাপমাত্রার ফিল্ড থাকতে পারে। যদি আমরা একটি নতুন ধরণের ট্রাক যোগ করতে চাই, যেমন একটি বিল্ট-ইন স্কেল যুক্ত গাড়ি যা এতে থাকা ওজন ট্র্যাক করতে পারে, তাহলে আমাদের IoT ডিভাইসটি এই নতুন ফিল্ডটি যোগ করতে পারে এবং এটি ডাটাবেসের কোন পরিবর্তন ছাড়াই সংরক্ষণ করা যাবে। কিছু সুপরিচিত NoSQL database হলো Azure CosmosDB, MongoDB এবং CouchDB । ✅ একটু গবেষণা করা যাক: নোএসকিউএল ডেটাবেস এবং এদের কর্মপরিধি সম্পর্কে জ্ঞান অর্জন করি। এই পাঠে, আমরা আইওটি ডেটা সঞ্চয় (Store) করতে NoSQL স্টোরেজ ব্যবহার করব। ## GPS ডেটা IoT Hub এ প্রেরণ গত পাঠে আমরা আমাদের আইওটি ডিভাইসের সাথে সংযুক্ত একটি জিপিএস সেন্সর থেকে জিপিএস ডেটা ক্যাপচার করেছি। এই আইওটি ডেটা ক্লাউডে সংরক্ষণ করতে, তা একটি আইওটি পরিষেবাতে পাঠাতে হবে। এবারও আমরা Azure IoT Hub ব্যবহার করব, একই IoT ক্লাউড পরিষেবা যা আমরা আগের প্রজেক্টে ব্যবহার করেছিলাম। ![Sending GPS telemetry from an IoT device to IoT Hub](../../../../images/gps-telemetry-iot-hub.png) ### কাজ - GPS ডেটা IoT Hub এ প্রেরণ 1. নতুন একটি আইওটি হাব খুলতে হবে free tier এর । > ⚠️ এক্ষেত্রে [প্রজেক্ট-২ লেসন-৪ থেকে আইওটি হাব তৈরীর নির্দেশাবলি অনুসরণ করা যাবে](../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#create-an-iot-service-in-the-cloud) প্রয়োজনবোধে। নতুন একটি Resource Group খোলার বিষয়টি মনে রাখতে হবে, যেটির নাম `gps-sensor` দেয়া যায় নতুন IoT Hub এর জন্য একটি ইউনিক নাম যেমন `gps-sensor-` দেয়া যেতে পারে। > 💁 যদি পূর্ববর্তী প্রজেক্টে ব্যবহৃত আইওটি হাব থাকে, সেটিও পুনরায় ব্যবহার করা যাবে। এক্ষেত্রে আইওটি হাব এবং রিসোর্স গ্রুপের নাম সঠিকভাবে ব্যবহার করতে হবে সার্ভিস তৈরির সময়। 1. হাবে একটি নতুন ডিভাইস যোগ করি এবং `gps-sensor` নাম দিই। কানেকশন স্ট্রিং টি নোট রাখি 1. আগের ধাপ থেকে ডিভাইস সংযোগ স্ট্রিং ব্যবহার করে নতুন আইওটি হাব -এ জিপিএস ডেটা পাঠাতে ডিভাইস কোড আপডেট করতে হবে। > ⚠️ এক্ষেত্রে [প্রজেক্ট-২ লেসন-৪ থেকে আইওটি সার্ভিসের সাথে ডিভাইস সংযোজনের নির্দেশাবলি ](../../../../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md#connect-your-device-to-the-iot-service) অনুসরণ করা যাবে। 1. যখন জিপিএস ডেটা প্রেরণ করব, তখন এটি নিম্নলিখিত বিন্যাসে JSON হিসাবে করতে হবে: ```json { "gps" : { "lat" : , "lon" : } } ``` 1. প্রতি মিনিটে জিপিএস ডেটা পাঠাতে হবে যাতে দৈনিক ম্যাসেজ ব্যবহার এর লিমিট শেষ না হয়। আমরা যদি Wio টার্মিনাল ব্যবহার কর্রি, তাহলে সমস্ত প্রয়োজনীয় লাইব্রেরি যোগ করতে হবে এবং একটি NTP সার্ভার ব্যবহার করে সময় নির্ধারণ করার প্রয়োজন হবে। গত পাঠ থেকে বিদ্যমান কোড ব্যবহার করে , আমাদের কোডটি দ্বারা নিশ্চিত করতে হবে যে এটি জিপিএস লোকেশন পাঠানোর আগে সিরিয়াল পোর্ট থেকে সমস্ত ডেটা পড়েছে। JSON ডকুমেন্ট তৈরি করতে নিম্নলিখিত কোডটি ব্যবহার করি: ```cpp DynamicJsonDocument doc(1024); doc["gps"]["lat"] = gps.location.lat(); doc["gps"]["lon"] = gps.location.lng(); ``` ভার্চুয়াল আইওটি ডিভাইস ব্যবহার করলে, এটির জন্য প্রয়োজনীয় সমস্ত লাইব্রেরি ইনস্টল করার বিষয়টি মনে রাখতে হবে। রাস্পবেরি পাই এবং ভার্চুয়াল আইওটি উভয় ডিভাইসের জন্য, অক্ষাংশ এবং দ্রাঘিমাংশের মানগুলি পেতে গত পাঠ থেকে বিদ্যমান কোডটি ব্যবহার করে নিম্নলিখিত কোড সহ তাদের সঠিক JSON ফর্ম্যাটে পাঠাতে হবে: ```python message_json = { "gps" : { "lat":lat, "lon":lon } } print("Sending telemetry", message_json) message = Message(json.dumps(message_json)) ``` > 💁 প্রয়োজনীয় সকল কোড [code/wio-terminal](code/wio-terminal), [code/pi](code/pi) বা [code/virtual-device](code/virtual-device) ফোল্ডারে পাওয়া যাবে । Run your device code and ensure messages are flowing into IoT Hub using the `az iot hub monitor-events` CLI command. ডিভাইস কোডটি রান করে নিশ্চিত করতে হবে যে বার্তাগুলি আইওটি হাবের মধ্যে প্রবাহিত হচ্ছে `az iot hub monitor-events` এর মাধ্যমে, সিএলআই কমান্ড ব্যবহার করে। ## Hot, Warm, এবং Cold Path একটি IoT ডিভাইস থেকে ক্লাউডে প্রবাহিত ডেটা সবসময় রিয়েল টাইমে প্রসেস করা হয় না। কিছু ডেটা রিয়েল টাইম প্রক্রিয়াকরণের প্রয়োজন হয়, কিছু ডেটা অল্প কিছুক্ষণ পরে প্রক্রিয়া করা যায়, এবং অন্যান্য ডেটা অনেক পরে প্রক্রিয়া করলেও হয়। বিভিন্ন সময়ে ডেটা প্রক্রিয়া করে এমন বিভিন্ন পরিষেবাতে তথ্য প্রবাহকে Hot, Warm এবং Cold Path বলা হয়। ### Hot Path হট পাথ (Hot Path) এমন ডেটা বোঝায় যা রিয়েল টাইমে বা রিয়েল টাইমের কাছাকাছি সময়েই প্রক্রিয়াকরণের প্রয়োজন হয়। এলার্ট দেয়ার জন্য যেমন - যে কোনও গাড়ি একটি ডিপোর কাছে আসছে অথবা একটি রেফ্রিজারেটেড ট্রাকের তাপমাত্রা খুব বেশি এমন পরিস্থিতির মোকাবেলা করতে সতর্কতার জন্য হট পাথ ডেটা ব্যবহার করা হয়। হট পাথ ডেটা ব্যবহার করার জন্য, ক্লাউড পরিষেবাগুলি কোড পাওয়ার সাথে সাথে আমাদের ইভেন্টগুলিতে সাড়া দেবে। ### Warm path উষ্ণ পথ (Warm path) বলতে এমন তথ্যকে বোঝায় যা প্রাপ্তির পরে অল্প কিছুক্ষণ সময় নিয়ে প্রক্রিয়া করা যায়, উদাহরণস্বরূপ রিপোর্টিং বা স্বল্পমেয়াদী বিশ্লেষণ। আগের দিনের সংগৃহীত ডেটা ব্যবহার করে গাড়ির মাইলেজের দৈনিক রিপোর্টের জন্য এই ধরণের পদ্ধতি ব্যবহার করা হয়। ক্লাউড সার্ভিসের মাধ্যমে এই ডেটা এমনভাবে স্টোর করা হয় যাতে দ্রুত অ্যাক্সেস করা যায়। ### Cold path ঠান্ডা পথ (Cold path) বলতে ঐতিহাসিক তথ্য বোঝায়, দীর্ঘমেয়াদে তথ্য সংরক্ষণ করে যখনই প্রয়োজন হয় তখন বিশ্লেষণ করা হবে। উদাহরণস্বরূপ, যানবাহনের বার্ষিক মাইলেজ রিপোর্ট পেতে ঠান্ডা পথ ব্যবহার করা যায় অথবা জ্বালানি খরচ কমানোর জন্য সবচেয়ে অনুকূল রুট খুঁজে বের করার জন্য রুট বিশ্লেষণ চালাতেও এটি ব্যবহার করা যায় । কোল্ড পাথ ডেটা সাধারণত data warehouse এ সংরক্ষিত হয় - ডেটাগুলির বড় পরিমাণে সংরক্ষণের জন্য ডিজাইন করা ডেটাবেস যা কখনও পরিবর্তন হবে না এবং দ্রুত এবং সহজেই কুয়েরি করা যাবে। সাধারণত ক্লাউড অ্যাপ্লিকেশনে নিয়মিতভাবে প্রতিদিন, সপ্তাহ বা মাসে একটি নিয়মিত সময়ে চলবে উষ্ণ পথের স্টোরেজ থেকে ওয়্যারহাউসে এই ডেটা স্থানান্তর করার কাজ। ✅ এই পাঠগুলিতে আমরা এখন পর্যন্ত যে ডেটা ক্যাপচার করেছি সে সম্পর্কে চিন্তা করি। এগুলো কি hot, warm নাকি cold path এর তথ্য? ## সার্ভারবিহীন কোড ব্যবহার করে জিপিএস ইভেন্টগুলি পরিচালনা একবার আমাদের আইওটি হাবের মধ্যে ডেটা প্রবাহিত হয়ে গেলে, ইভেন্ট-হাব সামঞ্জস্যপূর্ণ এন্ডপয়েন্টে প্রকাশিত ইভেন্টগুলি শোনার জন্য কিছু সার্ভারলেস কোড লিখতে পারবো। এটি উষ্ণ পথে ডেটা সংরক্ষণ করা হবে এবং পরবর্তী পাঠে যাত্রার প্রতিবেদন তৈরী করার জন্য ব্যবহার করা হবে। ![Sending GPS telemetry from an IoT device to IoT Hub, then to Azure Functions via an event hub trigger](../../../../images/gps-telemetry-iot-hub-functions.png) ### কাজ - সার্ভারবিহীন কোড ব্যবহার করে জিপিএস ইভেন্টগুলি পরিচালনা 1. Azure Functions CLI ব্যবহার করে একটি Azure Functions অ্যাপ তৈরি করি। পাইথন রানটাইম ব্যবহার করি এবং এটি একটি ফোল্ডারে তৈরি করি যার নাম `gps-trigger` এবং ফাংশন অ্যাপ প্রজেক্টের নামের জন্য একই নাম ব্যবহার করতে হবে। Virtual environment তৈরীর বিষয়টি নিশ্চিত করতে হবে। > ⚠️ এক্ষেত্রে [প্রজেক্ট-২ লেসন-৫ থেকে আইওটি সার্ভিসের সাথে সার্ভারলেস এপ্লিকেশন তৈরীর নির্দেশাবলি](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-a-serverless-application) অনুসরণ করা যাবে। 1. Add an IoT Hub event trigger that uses the IoT Hub's Event Hub compatible endpoint. > ⚠️ এক্ষেত্রে [প্রজেক্ট-২ লেসন-৫ থেকে আইওটি হাব ইভেন্ট ট্রিগার তৈরীর নির্দেশাবলি](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger) অনুসরণ করা যাবে। 1. ইভেন্ট হাব সামঞ্জস্যপূর্ণ এন্ডপয়েন্ট সংযোগ স্ট্রিং সেট করতে হবে `local.settings.json` ফাইলে এবং `function.json` ফাইলের জন্য সেই এন্ট্রির KEY ব্যবহার করতে হবে। 1. এক্ষেত্রে Azurite app ব্যবহার করতে হবে local storage emulator হিসেবে। 1. জিপিএস ডিভাইস থেকে ইভেন্ট গ্রহণ করছে কিনা তা নিশ্চিত করতে ফাংশন অ্যাপটি চালাতে হবে। এখান থেকেই নিশ্চিত করা যাবে যে আইওটি ডিভাইসটি চলছে এবং জিপিএস ডেটা পাঠাচ্ছে। ```output Python EventHub trigger processed an event: {"gps": {"lat": 47.73481, "lon": -122.25701}} ``` ## Azure স্টোরেজ অ্যাকাউন্ট ![The Azure Storage logo](../../../../images/azure-storage-logo.png) Azure স্টোরেজ অ্যাকাউন্ট একটি সাধারণ উদ্দেশ্যে (General Purpose) ব্যবহৃত স্টোরেজ পরিষেবা যা বিভিন্ন উপায়ে ডেটা সংরক্ষণ করতে পারে। আমরা ব্লব হিসাবে, সারিতে, টেবিলে বা ফাইল হিসাবে ডেটা সংরক্ষণ করতে পারি। ### Blob storage *ব্লব* মানে হলো বাইনারি বড় বস্তু (binary large objects) তবে যেকোন কাঠামোবিহীন ডেটার জন্য এই শব্দ ব্যবহৃত হয়। আইওটি ডেটা ধারণকারী JSON ডকুমেন্ট থেকে শুরু করে ইমেজ এবং মুভি ফাইলগুলিতেও ব্লব স্টোরেজে যেকোন ডেটা সংরক্ষণ করা যায়। ব্লব স্টোরেজে *কনটেইনার* এর ধারণা রয়েছে, এগুলো নামযুক্ত বাকেট/পাত্র যার মধ্যে ডেটা সংরক্ষণ করা যায়, একটি রিলেশনাল ডাটাবেজে টেবিলের মতো। এই পাত্রে ব্লব সংরক্ষণের জন্য এক বা একাধিক ফোল্ডার থাকতে পারে এবং প্রতিটি ফোল্ডারে অন্যান্য ফোল্ডার থাকতে পারে, যেভাবে কম্পিউটারের হার্ডডিস্কে ফাইল সংরক্ষণ করা হয়। IoT ডেটা সংরক্ষণ করতে আমরা এই পাঠে ব্লব স্টোরেজ ব্যবহার করব। ✅ কিছু গবেষণা করা যাক:[Azure Blob Storage](https://docs.microsoft.com/azure/storage/blobs/storage-blobs-overview?WT.mc_id=academic-17441-jabenn) সম্পর্কে পড়ে আরো বিস্তারিত জানার চেষ্টা করি। ### Table storage টেবিল স্টোরেজ আমাদের আধা কাঠামোগত ডেটা সংরক্ষণ করতে দেয়। টেবিল স্টোরেজ আসলে একটি NoSQL ডাটাবেস, তাই টেবিলের একটি সংজ্ঞায়িত সেট প্রয়োজন হয় না, কিন্তু এটি এক বা একাধিক টেবিলে ডেটা সংরক্ষণ করার জন্য ডিজাইন করা হয়েছে, প্রতিটি সারির সংজ্ঞা দিতে অনন্য কী (unique key) দিয়ে। ✅ কিছু গবেষণা করা যাক: [Azure Table Storage](https://docs.microsoft.com/azure/storage/tables/table-storage-overview?WT.mc_id=academic-17441-jabenn) সম্পর্কে পড়ে আরো বিস্তারিত জানার চেষ্টা করি। ### Queue storage কিউ স্টোরেজ একটি সারিতে 64KB আকারের বার্তা সংরক্ষণ করতে দেয়। আমরা সারির পিছনের দিকে বার্তা যোগ করতে পা্রি এবং সেগুলি আবার সামনে থেকে পড়তে পারি। Queue এখানে বার্তাগুলিকে অনির্দিষ্টকালের জন্য সংরক্ষণ করে যতক্ষণ স্টোরেজ স্পেস রয়েছে, তাই এটি বার্তাগুলিকে দীর্ঘমেয়াদী সংরক্ষণ করতে দেয়। তারপর যখন প্রয়োজন হয় তা ব্যবহার করা যায়। উদাহরণস্বরূপ, যদি জিপিএস ডেটা প্রসেস করার জন্য একটি মাসিক কাজ চালাতে হয়, তাহলে প্রতিদিন এটিকে এক মাসের জন্য সারিতে যোগ করতে পারবো, তারপর মাসের শেষে সারির সব বার্তা একসাথে প্রক্রিয়া করতে পারবো। ✅ কিছু গবেষণা করা যাক: [Azure Queue Storage](https://docs.microsoft.com/azure/storage/queues/storage-queues-introduction?WT.mc_id=academic-17441-jabenn) সম্পর্কে পড়ে আরো বিস্তারিত জানার চেষ্টা করি। ### File storage ফাইল স্টোরেজ হল ক্লাউডে ফাইলের স্টোরেজ এবং যে কোনও অ্যাপ বা ডিভাইস স্বীকৃত স্ট্যান্ডার্ড প্রোটোকল ব্যবহার করে সংযোগ করতে পারে। আমরা ফাইল স্টোরেজে আমাদের তথ্য রাখতে পারি, তারপরে পিসি বা ম্যাকের ড্রাইভ হিসাবে মাউন্ট করা যায়। ✅ কিছু গবেষণা করা যাক: [Azure File Storage](https://docs.microsoft.com/azure/storage/files/storage-files-introduction?WT.mc_id=academic-17441-jabenn) সম্পর্কে পড়ে আরো বিস্তারিত জানার চেষ্টা করি। ## সার্ভারবিহীন কোডকে স্টোরেজে সংযুক্তকরণ আইওটি হাব থেকে বার্তাগুলি সঞ্চয় করতে আমাদের ফাংশন অ্যাপটিকে এখন ব্লব স্টোরেজের সাথে সংযুক্ত করতে হবে। এটি করার 2 টি উপায় রয়েছে: * ফাংশন কোডের ভিতরে, আমাদের ব্লব স্টোরেজ Python SDK ব্যবহার করে ব্লব স্টোরেজে সংযোগ করতে হবে এবং ডেটা ব্লব হিসাবে রাখতে হবে। * আমাদের একটি আউটপুট ফাংশন বাইন্ডিং ব্যবহার করতে হবে ফাংশনের রিটার্ন ভ্যালু ব্লোব স্টোরেজে বাইন্ড করতে এবং এক্ষেত্রে ব্লবটি স্বয়ংক্রিয়ভাবে সংরক্ষণ করতে হবে। এই পাঠে, আমরা ব্লব স্টোরেজের সাথে কীভাবে যোগাযোগ করতে হয় তা দেখতে Python SDK ব্যবহার করব। ![Sending GPS telemetry from an IoT device to IoT Hub, then to Azure Functions via an event hub trigger, then saving it to blob storage](../../../../images/save-telemetry-to-storage-from-functions.png) নিম্নলিখিত ফরম্যাটে ডেটা একটি JSON ব্লব হিসাবে সংরক্ষণ করা হবে: ```json { "device_id": , "timestamp" :