پاسخ یک مهندس، «برای آنها که میخواهند بدانند ...»
✍ سجاد نفیسی - فوق لیسانس فناوری اطلاعات دانشگاه صنعتی شریف
مدتی قبل مطالبی درباره گم شدن مرموز سهمیه بنزین در فضای مجازی منتشر شد. اینکه در هربار سوختگیری، میزان بنزین مصرفی باید مضرب دقیقی از عدد عجیب ۳.۹۹ لیتر باشد، در غیر این صورت دستگاه کارتخوان موجود در پمپ بنزین عددی بیشتر از میزان بنزین مصرفی را از سهمیه شما کسر خواهد نمود. موضوعی که نهایتا به صداوسیما راه یافته، آنگونه که مجری برنامه «سلام صبح بخیر شبکه سه» رندانه جمعبندی میکند، این سوال را ایجاد میکند که چرا عدد ۳.۹۹؟ و چرا برای بنزین زدن باید فوق لیسانس ریاضی داشته باشیم؟!
? پاسخ کوتاه به این موضوع، همانگونه که در اطلاعیههای شرکت ملی پخش آمده و توسط هموطنان نیز عملا تست شده است، این است که: هر مقدار بنزین بزنید به همان میزان از سهمیه شما کسر میشود.
البته در این خصوص لازم است که هنگام سوختگیری عجله نکرده، و ابتدا نازل بنزین را روی پمپ قرار دهید و سپس، با مشاهده پیام «کارت سوخت خود را بردارید»، کارت را از دستگاه خارج نمایید. اگر شخصی در حین سوختگیری و قبل از قراردادن نازل بنزین کارت را از دستگاه خارج کند، دستگاه فرصت ذخیره میزان دقیق سهمیه مصرفی روی کارت را پیدا نکرده و لاجرم مقداری از سهمیه (بین صفر تا حداکثر ۳.۹۹ لیتر) از دست خواهد رفت.?
برای اغلب مردم دانستن همین نکته (اول نازل، بعد کارت!)، که واقعا بارها از سال ۸۶ و آغاز طرح سهمیهبندی بنزین در رسانهها مطرح شده است (+)، کافیست تا ضمن سوختگیری صحیح، از لحاظ سهمیه متضرر نیز نشوند. اما برخی ممکن است در خصوص چرایی و طراحی سامانه کنجکاو بوده و سوالاتی در ذهن داشته باشند. به همین جهت و برای رفع ابهامات بی پایه این روزها در فضای مجازی، در این مطلب تلاش میکنم چرایی طراحی سامانه سوخت به این شیوه را برای علاقمندان تشریح کنم تا بدانند علت طراحی موضوع به این صورت کاملا فنی بوده و چگونه یک موضوع ساده فنی، ولو بسیار دقیق و اصولی طراحی شده باشد، اگر به درستی تبیین نشود موجبات سردرگمی و نارضایتی عموم را فراهم میکند.
البته باید توجه کرد گاهی تشریح مطالب فنی برای عموم مردم که نه تجربه و نه حوصله پرداختن به آن را ندارند مشکل است، لذا خواهشمندم ادامه مطلب را با حوصله مطالعه نموده و در صورت نیاز با متخصصین آشنای خود جهت اطمینان در میان بگذارید. و در انتشار آن بهر نحو بکوشید.
آنچه در ادامه میآید حاصل بررسی سامانه از بیرون بوده و بنده نه طراح آن بودهام و نه از الزامات و پارامترهای دقیق تجهیزات به کار رفته مطلع هستم، اما به عنوان یک مهندس که تجربه چندین ساله در صنعت نرمافزار دارد، میتوانم علت طراحی انجام شده توسط یک مهندس دیگر را درک نموده و به وسع خود، گام به گام بیان کنم.
نکته ۱) سامانه کارت سوخت به صورت آفلاین طراحی شده است
برای شروع بحث درباره نحوه طراحی سامانه، نخست باید الزامات فنی آن را در نظر داشته باشید. نحوه عملکرد این سامانه به صورت نیمه آفلاین است، بدین ترتیب که در زمان سوختگیری، حداقل نیاز به ارتباط با یک سرور مرکزی وجود دارد.
به طور کلی طراحان سامانه کارت سوخت، دو راهکار پیش رو داشتند:
الف) طراحی آنلاین: در این حالت یک سرور مرکزی وظیفه نگهداری اینکه هر شخص، چه میزان سهمیه داشته و چه مقدار آن را مصرف کرده به عهده میگیرد. هر بار شما در یک پمپ بنزین اقدام به سوختگیری میکنید، پمپ مستقیما به سرور مرکزی وصل شده و اطلاعات سهمیه شما را دریافت کرده و برحسب میزان سهمیه موجود به شما بنزین میدهد. نهایتا نیز میزان مصرفی را به سرور مرکزی اعلام میکند تا از سهمیه شما کسر شده و در سوختگیری بعدی لحاظ گردد.
ب) طراحی آفلاین: در این حالت اغلب اطلاعات لازم درباره میزان سهمیه مصرفی شما روی خود کارت سوخت ذخیره میشود و نیاز به سرور مرکزی به حداقل میرسد. بدین ترتیب، حتی اگر ارتباط بین پمپ و سرور مرکزی قطع شود، بازهم امکان سوختگیری بر اساس اطلاعات موجود در کارت وجود خواهد داشت.
بررسی مطالب موجود اینترنتی نشان میدهد که طراحان کارت سوخت از روش نیمهآفلاین استفاده میکنند، به این معنی که هر زمان ارتباط با سرور مرکزی قطع باشد، سامانه توانایی کار به صورت آفلاین برمبنای اطلاعات داخل کارت را خواهد داشت. این مساله با توجه به گستردگی پمپ بنزینها در سراسر کشور و در مناطق دوردست که لینک ارتباطی ضعیفی دارند و حجم بالای درخواستهای روزانه منطقی میرسد. بخصوص که توجه کنیم این سامانه ۱۲ سال پیش، و با شرایط آن زمان فناوری اطلاعات کشور طراحی شده است.
اولین نتیجه: برای عملکرد آفلاین، لازم است که مقدار سهمیه مصرفی شما همیشه روی کارت درج شود تا در هر سوختگیری، بتوان از آن برای تعیین میزان سهمیه (در صورت عدم دسترسی به سرور) استفاده نمود.
نکته ۲) تقلب با بیرون کشیدن زودهنگام کارت حین سوختگیری
در نکته قبلی، به این نتیجه رسیدیم که مقدار سهمیه باید روی کارت سوخت ذخیره گردد. ذهنهای خلاق، بلافاصله این سوال را میپرسند که این کار چه زمانی انجام میگیرد؟
فرض الف) در پایان سوختگیری، دستگاه مقدار سهمیه را روی کارت مینویسد.
فرض ب) در ابتدای سوختگیری، دستگاه مقدار سهمیه را روی کارت بنویسد.
فرض ب عملا یک فرض غیرممکن است، چرا که در ابتدای سوختگیری، دستگاه نمیداند که شما چه میزان بنزین مصرف خواهید نمود! در عین حال فرض الف نیز یک نقص بزرگ دارد: اگر دستگاه اطلاعات را در پایان عملیات روی کارت بنویسد، یک فرد خرابکار میتواند به سادگی و حین زدن بنزین کارت را از دستگاه بیرون بکشد. (دستگاه هیچ کنترلی روی بیرون کشیده شدن کارت ندارد و این کار کاملا دستی و هر زمان ممکن است. برخلاف مثلا یک دستگاه خودپرداز که کارت را کاملا در اختیار گرفته و شما نمیتوانید کارت را از آن بیرون بکشید)
در این حالت و در صورت طراحی طبق فرض الف، بیرون کشیدن کارت باعث میشود که مقدار بنزین مصرفی روی کارت ثبت نشود. در نتیجه فرد خرابکار با این روش میتواند هر میزان بنزین که میخواهد بزند، بدون اینکه از سهمیه وی کم شود. با توجه به هدف این سامانه که جلوگیری از قاچاق سوخت بوده و انگیزه بالای افراد در خرابکاری، این موضوع قطعا یکی از دغدغههای اصلی طراحی سامانه است که بدون حل آن اساسا سامانه به درد نمیخورد.
در سامانه کارت سوخت روش سومی برای حل مساله اندیشیده شده است:
فرض ج) دستگاه مرتبا و در بازههای زمانی اطلاعات را روی کارت مینویسد. در نتیجه هر زمانی که کارت بیرون کشیده شود، اطلاعات روی آن نوشته شده است.
نکته ۳) کارت هم عمری دارد!
همانطور که در نکته قبلی به آن رسیدیم، دستگاه باید مرتبا اطلاعات را روی کارت بنویسد.
توجه به این نکته نیز لازم است که نوشتن اطلاعات بر روی کارت، عملی زمانبر است. همه ما تجربه دانلود یک فایل، یا نوشتن مجموعهای از فایلها روی یک فلش یا هارد را داشتهایم. نوشتن اطلاعات زمانبر است، و در مورد فناوری کارتهای مغناطیسی، سرعت انتقال اطلاعات از سرعت یک فلش معمولی بسیار کمتر است. از طرف دیگر، کارتهای مغناطیسی یک محدودیت بزرگتر دارند: تعداد دفعات نوشتن روی آنها محدود بوده و در صورتیکه روی یک کارت مرتبا نوشته شود، عمر کارت تمام شده و از کار میافتد.
در نتیجه طراحان دستگاه مجبور هستند تعداد دفعات نوشتن را محدود و کم کنند. در طراحی کارت سوخت، پس از حدودا مصرف هر ۴ لیتر، یکبار نوشتن روی کارت انجام میشود تا کارت مستهلک نشده و سرعت نوشتن نیز با سرعت سوختگیری مزاحمتی ایجاد نکند. به این حدود ۴ لیتر، اصطلاحا پیمانه گفته میشود.
لازم به ذکر است که انتخاب هر عددی برای پیمانه، پیامدهای فنی به دنبال دارد. هر چه عدد پیمانه کوچکتر باشد، تعداد دفعات نوشتن روی کارت بیشتر شده و عمر آن کاهش مییابد. به عنوان مثال اگر عدد ۱ لیتر انتخاب شود، سوختگیری کل ۶۰ لیتر نیازمند ۶۰ بار نوشتن و کاهش عمر کارت است، اما برای پیمانه ۴ لیتری تنها کافیست ۱۵ بار نوشتن انجام گیرد و عمر کارت ۴ برابر میشود.
نکته ۴) اول یا آخر، مساله این است!
با توجه به مطالب قبلی، مشخص شد که طراحان چارهای جز ذخیرهسازی مستمر اطلاعات به صورت پیمانهای روی کارت نداشتهاند. عدد پیمانه حدودا ۴ لیتری (در واقع ۳.۹۹ لیتر) از همینجا و با توجه به محاسبات انجام شده در سرعت نوشتن کارتخوان دستگاه، سرعت بنزیندهی پمپ و قاعدتا ملاحظات دیگری در مورد اعداد مرزی انتخاب شده است.
اما در نوشتن این اطلاعات بر روی کارت، باز هم دو سناریو و دو فرض مطرح است:
الف) نوشتن اطلاعات هر پیمانه بعد از مصرف آن
ب) نوشتن اطلاعات قبل از مصرف هر پیمانه
در این حالت نیز، اگر طراحان حالت الف را انتخاب کنند، همان مشکلات قبلی پابرجا بوده و فرد خرابکار با بیرون کشیدن زودهنگام کارت از کارتخوان دستگاه، میتواند تا حدود ۳.۹۹ لیتر در هر سوختگیری تقلب کند. چرا که در این فرض زمانی که کارت بیرون کشیده میشود، دستگاه هنوز فرصت نکرده است مصرف آخرین پیمانه را روی کارت ثبت نماید.
بنابراین طراحان ناچار به انتخاب سناریوی ب هستند: یعنی هنگامیکه سوختگیری را آغاز میکنید و قبل از شروع؛ یک پیمانه ۳.۹۹ لیتری از اطلاعات داخل کارت شما کسر میشود. سپس و در صورتیکه این پیمانه به اتمام برسد، دستگاه بلافاصله پیمانه بعدی را کسر کرده و بنزین زدن ادامه پیدا میکند. در این حالت، اگر فرد خرابکار کارت را ناگهان بیرون بکشد، اطلاعات سهمیه وی قبلا در کارت کسر شده و در نتیجه سر سیستم کلاه نمیرود.
اما از آنجاییکه اغلب سوختگیریها مضرب دقیقی از پیمانه انتخابی (هر عددی که باشد) نخواهند بود، سیستم ناچار است در پایان عملیات سوختگیری، اطلاعات موجود در کارت را تصحیح نماید. این کار همان زمانی انجام میشود که شما نازل را در جایگاه قرار میدهید. در این لحظه سیستم متوجه میشود که سوختگیری شما واقعا پایان یافته و قصد ادامه ندارید. در نتیجه سیستم اطلاعات موجود در کارت را تصحیح کرده و میزان مصرف دقیق را در کارت ذخیره میکند. (درست مثل زمانی که قبل از بیرون کشیدن فلش از لپتاپ، گزینه آزاد کردن آن را انتخاب میکنیم)
✅ نتیجه نهایی: به همین دلیل است که اگر شما کارت را قبل از تصحیح و ذخیره اطلاعات نهایی از دستگاه بیرون بکشید، اطلاعات میزان مصرف پیمانه نهایی به درستی ذخیره نمیشود. در این حالت، از سهمیه شما مقدار بیشتری برداشت شده که در واقع دستگاه موفق به بازگردانی آن به کارت شما نشده است. بنابراین: همیشه کارت خود را زمانی از دستگاه خارج کنید که کار تمام شده و پیام «کارت خود را بردارید» را مشاهده کردهاید.