যোগাযোগ প্রোটোকল সেরা অনুশীলন এবং প্যাটার্নস


19

আমি যখনই দুটি আরডুইনোর মধ্যে ব্যবহার করার জন্য একটি সিরিয়াল প্রোটোকল ডিজাইন করি তখন আমার কিছুটা মনে হয় যে আমি চাকা পুনরায় সাজিয়ে নিচ্ছি। আমি অবাক হই যে লোকেরা অনুসরণ করে এমন কোনও সেরা অনুশীলন বা নিদর্শন রয়েছে কিনা। এই প্রশ্নটি আসল কোড সম্পর্কে কম, তবে বার্তাগুলির ফর্ম্যাট সম্পর্কে বেশি।

উদাহরণস্বরূপ, যদি আমি কোনও আরডুইনোকে ফ্ল্যাশ করতে বলি তবে এটি প্রথম প্রথম এলইডি 3 বার পাঠাতে পারে:

^L1,F3\n
  • '^': একটি নতুন কমান্ড শুরু করে
  • 'এল': কমান্ডটি সংজ্ঞায়িত করে, (এল: একটি কমান্ডকে একটি এলইডি লক্ষ্য করুন)
  • '1': প্রথম এলইডি লক্ষ্য করুন
  • ',': কমান্ড লাইন বিভাজক, অনুসরণ করতে এই বার্তায় নতুন মান
  • 'এফ': ফ্ল্যাশ সাব-কমান্ড
  • '3': 3 বার (তিনবার এলইডি ফ্ল্যাশ করুন)
  • '। n': কমান্ডটি শেষ করুন

থটস? আপনি সাধারণত একটি নতুন সিরিয়াল প্রোটোকল লেখার কাছে কীভাবে যান? আমি যদি আরডুইনো 1 থেকে আরডুইনো 2 তে কোনও জিজ্ঞাসা প্রেরণ করতে চাই এবং তারপরে কোনও প্রতিক্রিয়া পেতে চাই তবে কী হবে?

উত্তর:


13

আপনি কী কার্যকারিতা চাইতে পারেন এবং আপনার কত ত্রুটি পরীক্ষা করতে হবে তা নির্ভর করে সিরিয়াল প্রোটোকল লেখার অনেকগুলি উপায় রয়েছে।

আপনি পয়েন্ট টু পয়েন্ট প্রোটোকলগুলিতে দেখেন এমন কয়েকটি সাধারণ জিনিস হ'ল:

বার্তার সমাপ্তি

সবচেয়ে সহজ এএসসিআইআই প্রোটোকলটিতে কেবল বার্তা অক্ষরের ক্রমিকের সমাপ্তি হয়, প্রায়শই \rবা \nএন্ট্রি কী হিট হলে এটি মুদ্রিত হয়। বাইনারি প্রোটোকল 0x03বা অন্য কিছু সাধারণ বাইট ব্যবহার করতে পারে ।

বার্তা শুরু

বার্তাটি শেষ হওয়ার সমস্যাটি হ'ল আপনি নিজের বার্তাটি প্রেরণ করার আগে অন্যান্য বাইটগুলি ইতিমধ্যে কী পেয়েছে তা আপনি জানেন না। এই বাইটগুলি তখন বার্তাটির উপসর্গযুক্ত হয়ে এটিকে ভুলভাবে ব্যাখ্যা করার কারণ হবে। উদাহরণস্বরূপ, যদি আরডুইনো কেবল ঘুম থেকে জেগে থাকে তবে সিরিয়াল বাফারে কিছু আবর্জনা থাকতে পারে। এটি পেতে আপনাকে বার্তা ক্রম শুরু করতে হবে। আপনার উদাহরণে, ^প্রায়শই বাইনারি প্রোটোকলগুলিতে0x02

ত্রুটি পরীক্ষা করা

যদি বার্তাটি দূষিত হতে পারে তবে আমাদের কিছু ত্রুটি পরীক্ষা করা দরকার। এটি চেকসাম বা সিআরসি ত্রুটি বা অন্য কিছু হতে পারে।

অক্ষর

এটি হতে পারে যে চেকসাম একটি নিয়ন্ত্রণ চরিত্রের সাথে যুক্ত করে, যেমন 'বার্তা শুরু করা' বা 'বার্তার শেষ' বাইট, বা বার্তায় একটি নিয়ন্ত্রণ অক্ষরের সমান মান রয়েছে। সমাধানটি হ'ল পালাবার চরিত্রটি প্রবর্তন করা। আসল ক্যারেক্টারটি উপস্থিত না থাকায় পালানো অক্ষরটিকে পরিবর্তিত নিয়ন্ত্রণের অক্ষরের আগে স্থাপন করা হয়। উদাহরণস্বরূপ, যদি একটি প্রারম্ভের অক্ষর 0x02 হয়, এস্কেপ অক্ষর 0x10 ব্যবহার করে আমরা বার্তায় 0x10 0x12 (বাইট XOR নিয়ন্ত্রণ অক্ষর) হিসাবে বার্তায় 0x02 মানটি প্রেরণ করতে পারি

প্যাকেট নম্বর

যদি কোনও বার্তা দূষিত হয় তবে আমরা একটি ন্যাক বা পুনরায় চেষ্টা বার্তার সাথে পুনরায় পাঠানোর অনুরোধ করতে পারি, তবে যদি একাধিক বার্তা প্রেরণ করা হয় তবে কেবল সর্বশেষতম বার্তাটি আবার পাঠানো যেতে পারে। পরিবর্তে প্যাকেটটি এমন একটি নম্বর দেওয়া যেতে পারে যা নির্দিষ্ট সংখ্যক বার্তার পরে গড়িয়ে পড়ে। উদাহরণস্বরূপ, যদি এই সংখ্যাটি 16 হয়, প্রেরণকারী ডিভাইসটি শেষ 16 টি বার্তা প্রেরণ করতে পারে এবং যদি কোনও রিসিভড ডিভাইস ক্ষতিগ্রস্থ হয় তবে প্যাকেট নম্বর ব্যবহার করে পুনরায় পাঠানোর অনুরোধ করতে পারে।

লম্বা

প্রায়শই বাইনারি প্রোটোকলগুলিতে আপনি একটি দৈর্ঘ্য বাইট দেখতে পান যা প্রাপ্তির ডিভাইসটিকে বার্তায় কতগুলি অক্ষর রয়েছে তা বলে। এটি অন্য স্তরের ত্রুটি যাচাইয়ের যোগ করে যাতে সঠিক সংখ্যক বাইট পাওয়া যায় নি তবে ত্রুটি হয়েছিল।

আরডুইনো নির্দিষ্ট

আরডুইনোর জন্য একটি প্রোটোকল নিয়ে আসার সময় প্রথম বিবেচনাটি যোগাযোগ চ্যানেলটি কতটা নির্ভরযোগ্য। আপনি যদি বেশিরভাগ বেতার মাধ্যম, এক্সবি, ওয়াইফাই ইত্যাদি প্রেরণ করছেন তবে ইতিমধ্যে ত্রুটি পরীক্ষা করা এবং পুনরায় চেষ্টা করা হয়েছে এবং এটি আপনার প্রোটোকলে রাখার কোনও অর্থ নেই। আপনি যদি কয়েক কিলোমিটারের জন্য আরএস ৪২২ ছাড়িয়ে পাঠাচ্ছেন তবে এটি প্রয়োজনীয় হবে। আমি অন্তর্ভুক্ত জিনিসগুলি হ'ল বার্তা শুরু এবং বার্তা অক্ষরের সমাপ্তি, যেমন আপনার আছে। আমার সাধারণ বাস্তবায়ন দেখতে এমন কিছু দেখাচ্ছে:

>messageType,data1,data2,…,dataN\n

কমা দিয়ে ডেটা পার্টস ডিলিট করা সহজ পার্সিংয়ের অনুমতি দেয় এবং এএসসিআইআই ব্যবহার করে বার্তাটি প্রেরণ করা হয়। ASCII প্রোটোকল দুর্দান্ত কারণ আপনি সিরিয়াল মনিটরে বার্তা টাইপ করতে পারেন।

আপনি যদি বাইনারি প্রোটোকল চান, তবে বার্তার আকারগুলি সংক্ষিপ্ত করতে, আপনাকে কোনও ডেটা বাইট যেমন নিয়ন্ত্রণ বাইটের মতো হতে পারে তবে পলায়ন বাস্তবায়ন করতে হবে। বাইনারি নিয়ন্ত্রণের অক্ষরগুলি সেই সিস্টেমে আরও ভাল যেখানে ত্রুটি যাচাই এবং পুনরায় চেষ্টা করার পূর্ণ বর্ণালী পছন্দসই। পেলে লোডটি এখনও চাইলে এএসসিআইআই হতে পারে।


মেসেজ কোডের আসল শুরুর আগে যে আবর্জনায় বার্তা নিয়ন্ত্রণ কোডের একটি সূচনা থাকতে পারে তা কি সম্ভব নয়? আপনি কিভাবে এটি মোকাবেলা করবেন?
সিএমসিডিগ্রাগনকাই

@ সিএমসিডিগ্রাগনকাই হ্যাঁ এটি একটি সম্ভাবনা, বিশেষত একক বাইট নিয়ন্ত্রণ কোডগুলির জন্য। তবে আপনি যদি কোনও বার্তা পার্সিংয়ের মাধ্যমে যদি একটি শুরু নিয়ন্ত্রণ কোডের মুখোমুখি হন তবে বার্তাটি ফেলে দেওয়া হয় এবং পুনঃসূচনাগুলি পার্সিং করে।
জ্যামিতিকাল

9

সিরিয়াল প্রোটোকলগুলিতে আমার কোনও আনুষ্ঠানিক দক্ষতা নেই, তবে আমি এগুলি বেশ কয়েকবার ব্যবহার করেছি এবং আরও কম-বেশি এই স্কিমটিতে স্থির করেছি:

(প্যাকেট শিরোলেখ) (আইডি বাইট) (ডেটা) (ফ্লেচার 16 চেকসাম) (প্যাকেট ফুটার)

আমি সাধারণত হেডারটি 2 বাইট এবং পাদচরণ 1 বাইট করি make আমার পার্সার যখন কোনও নতুন প্যাকেট শিরোনাম দেখবে তখন সবকিছু ফেলে দেবে এবং পাদলেখ দেখলে বার্তাটি বিশ্লেষণের চেষ্টা করবে। যদি চেকসাম ব্যর্থ হয় তবে এটি বার্তাটি খালি করবে না, তবে পাদলেখের অক্ষর সন্ধান না করা এবং চেকসাম সফল না হওয়া পর্যন্ত যোগ করা চালিয়ে যাবে। এইভাবে পাদলেখকে কেবলমাত্র একটি বাইট হওয়া দরকার কারণ সংঘর্ষগুলি বার্তাটিকে ব্যাহত করে না।

আইডিটি স্বেচ্ছাসেবী হয়, কখনও কখনও ডেটা বিভাগের দৈর্ঘ্যের সাথে নীচের স্তনবৃন্ত হয় (4 বিট)। দ্বিতীয় দৈর্ঘ্যের বিটটি ব্যবহার করা যেতে পারে তবে আমি সাধারণত বিরক্ত করি না যেহেতু দৈর্ঘ্যটি সঠিকভাবে বিশ্লেষণের জন্য জানা দরকার না, সুতরাং প্রদত্ত আইডির জন্য সঠিক দৈর্ঘ্যটি দেখানো বার্তাটি সঠিক ছিল তা নিশ্চিতকরণ mation

ফ্লেচার 16 চেকসামটি 2 বাইট চেকসাম যা সিআরসি হিসাবে প্রায় একই মানের তবে এটি প্রয়োগ করা আরও সহজ। এখানে কিছু বিবরণ । কোডটি এর মতো সহজ হতে পারে:

for(int i=0; i < bufSize; i++ ){
   sum1 = (sum1 + buffer[i]) % 255;
   sum2 = (sum2 + sum1) % 255;
}
uint16_t checksum = (((uint16_t)sum1)<<8) | sum2;

আমি সমালোচনামূলক বার্তাগুলির জন্য একটি কল এবং রেসোন সিস্টেমও ব্যবহার করেছি, যেখানে পিসি প্রতি 500 মিমি বা তার পরে বার্তা প্রেরণ করবে যতক্ষণ না এটি সম্পূর্ণ আসল বার্তাটির চেকসামের সাথে ডেটা (মূল চেকসাম সহ) হিসাবে একটি ওকে বার্তা পায়।

এই স্কিমটি অবশ্যই আপনার উদাহরণের মতো টার্মিনালে টাইপ করার পক্ষে উপযুক্ত নয়। আপনার প্রোটোকলটি ASCII এর মধ্যে সীমাবদ্ধ থাকার জন্য বেশ ভাল বলে মনে হচ্ছে এবং আমি নিশ্চিত যে দ্রুত প্রকল্পের জন্য আপনি আরও সহজ যা আপনি সরাসরি বার্তাগুলি পড়তে এবং প্রেরণে সক্ষম হতে চান। বড় প্রকল্পগুলির জন্য বাইনারি প্রোটোকলের ঘনত্ব এবং একটি চেকসামের সুরক্ষা রাখা ভাল।


যেহেতু "[আপনার] পার্সার যখন নতুন প্যাকেট শিরোনাম দেখবে তখন সবকিছু ছিঁড়ে ফেলবে" আমি ভাবছি যদি সুযোগটি শিরোনামের সাথে শিরোনামের মুখোমুখি হয় তবে এটি যদি সমস্যা তৈরি করে না?
humanityANDpeace

@humanityANDpeace এটিকে নামানোর কারণ হ'ল কোনও প্যাকেটটি কেটে গেলে কখনই এটি সঠিকভাবে বিশ্লেষণ করতে পারে না, তাই আপনি কখন তার আবর্জনা স্থির করে সিদ্ধান্ত নেবেন? সবচেয়ে সহজ এবং আমার অভিজ্ঞতায় যথেষ্ট ভাল, সমাধানটি হ'ল পরের শিরোনামটি আসামাত্রই একটি খারাপ প্যাকেট ফেলে দেওয়া উচিত I've ব্যান্ডউইথ।
ব্রেটাম

সুতরাং আপনি শিরোনাম হিসাবে যা উল্লেখ করেছেন তা কিছুটা ম্যাজিক 16 বিটের সংমিশ্রণ। অর্থাৎ 010101001 10101010, তাই না? আমি সম্মতি দিচ্ছি যে এটি হিট করার জন্য কেবল 1/256 * 256 এর পরিবর্তন, তবে এটি আপনার ডেটার ভিতরে এই 16 বিটটি ব্যবহার করা কখনও অক্ষম করে, অন্যথায় এটি শিরোনাম হিসাবে ভুল ব্যাখ্যা করা যায় এবং আপনি বার্তাটি বাতিল করেন, তাই না?
humanityANDpeace

@ হিউম্যানিটিএন্ডপিস আমি জানি এটি এক বছর পরে, তবে আপনাকে একটি পালানোর ক্রমটি প্রবর্তন করতে হবে। প্রেরণের আগে সার্ভারটি কোনও বিশেষ বাইটের জন্য পেডলোড চেক করে, তারপরে তাদের অন্য একটি বিশেষ বাইটের সাথে পালিয়ে যায়। ক্লায়েন্ট পাশ, আপনাকে আবার মূল পেডলোড একসাথে রেখে দিতে হবে। এর অর্থ এই নয় যে আপনি স্থির দৈর্ঘ্যের প্যাকেটগুলি প্রেরণ করতে পারবেন না এবং বাস্তবায়নকে জটিল করে তুলবেন। এগুলি থেকে এই ঠিকানাটিকে বেছে নেওয়ার জন্য অনেক সিরিয়াল প্রোটোকল স্ট্যান্ডার্ড রয়েছে। এখানে একটি খুব ভাল পড়া বিষয়
রাবারডাক

1

আপনি যদি মানদণ্ডে থাকেন তবে আপনি ASN.1 / BER টিএলভি এনকোডিংটি একবার দেখে নিতে পারেন। ASN.1 হল এমন একটি ভাষা যা ডেটা স্ট্রাকচারের বর্ণনা দিতে ব্যবহৃত হয়, বিশেষত যোগাযোগের জন্য। বিআর এএসএন .১ ব্যবহার করে কাঠামোগত ডেটা এনকোড করার একটি টিএলভি পদ্ধতি। সমস্যাটি হ'ল এএসএন .১ এনকোডিং সর্বোত্তম হতে পারে। একটি পূর্ণাঙ্গ ASN.1 সংকলক তৈরি করা নিজের মধ্যে একটি প্রকল্প (এবং এটিতে বিশেষত একটি কৌশলযুক্ত, মাসগুলি ভাবেন )।


কেবলমাত্র টিএলভি কাঠামো রাখা ভাল। টিএলভিতে মূলত তিনটি উপাদান থাকে: একটি ট্যাগ, একটি দৈর্ঘ্য এবং একটি মান ক্ষেত্র। ট্যাগটি ডেটার ধরণ (পাঠ্য স্ট্রিং, অক্টেট স্ট্রিং, পূর্ণসংখ্যার ইত্যাদি) এবং মানটির দৈর্ঘ্যকে সংজ্ঞায়িত করে ।

বিআর তে টিও বোঝায় যে মানটি নিজেই টিএলভি কাঠামোগুলির একটি সেট (একটি নির্মিত নোড) বা সরাসরি কোনও মান (একটি আদিম নোড)। আপনি বাইনারি তে অনেকটা এক্সএমএলের মতো (তবে এক্সএমএল ওভারহেড ছাড়াই) গাছ তৈরি করতে পারেন।

উদাহরণ:

TT LL VV
02 01 FF

021 (দৈর্ঘ্য 01) এবং মান -1 (মান FF) এর মানের দৈর্ঘ্য সহ একটি পূর্ণসংখ্যা (ট্যাগ )। এএসএন ১ / বিআর-তে পূর্ণসংখ্যাগুলি বড় ইন্ডিয়ান সংখ্যায় স্বাক্ষরিত হয় তবে আপনি অবশ্যই নিজের ফর্ম্যাটটি ব্যবহার করতে পারেন।

TT LL (TT LL VV, TT LL VV VV)
30 07  02 01 FF  02 02 00 FF

দৈর্ঘ্য 7 সহ দুটি পূর্ণসংখ্যা, একটি মান -1 এবং একটি 255 মান সহ একটি সিকোয়েন্স (একটি তালিকা) two

আপনি খুব সহজেই এটি একটি অনলাইন ডিকোডারের মধ্যেও টস করতে পারেন, এত সুন্দর?


আপনি বিইআর-তে অনির্দিষ্ট দৈর্ঘ্যও ব্যবহার করতে পারেন যা আপনাকে ডেটা স্ট্রিম করার অনুমতি দেবে। সেক্ষেত্রে আপনার গাছে সঠিকভাবে পার্স করা দরকার। আমি এটিকে একটি উন্নত বিষয় হিসাবে বিবেচনা করব, আপনার প্রথমটির প্রস্থ এবং গভীরতার প্রথম পার্সিং সম্পর্কে জানতে হবে।


একটি টিএলভি স্কিম ব্যবহার করা আপনাকে মূলত যে কোনও ধরণের ডেটা স্ট্রাকচারের কথা ভাবতে এবং এটিকে এনকোড করার অনুমতি দেয়। এএসএন .১ এর চেয়ে আরও অনেক বেশি এগিয়ে যায়, আপনাকে অনন্য পরিচয়দাতা (ওআইডি'র), পছন্দগুলি (সি-ইউনিয়নগুলির মতো অনেকগুলি), অন্যান্য এএসএন .1 কাঠামো ইত্যাদির অন্তর্ভুক্ত করে ইত্যাদি but তবে এটি আপনার প্রকল্পের জন্য ওভারকিল হতে পারে। সম্ভবত সেরা সুপরিচিত ASN.1- সংজ্ঞায়িত কাঠামো হ'ল আপনার ব্রাউজার দ্বারা ব্যবহৃত শংসাপত্র।


0

যদি তা না হয় তবে আপনি বেসিকগুলি কভার করেছেন। আপনার আদেশগুলি মানব এবং মেশিন উভয়ই তৈরি এবং পড়তে পারে যা একটি বড় প্লাস। আপনার চ্যানেলটিতে দীর্ঘ তারের বা রেডিও লিঙ্ক অন্তর্ভুক্ত রয়েছে, বিশেষত যদি কোনও ম্যাল-ফর্মড কমান্ড বা ট্রানজিটে ক্ষতিগ্রস্থ একটি সনাক্ত করতে আপনি একটি চেকসাম যুক্ত করতে পারেন।

আপনার যদি শিল্প শক্তি প্রয়োজন হয় (আপনার ডিভাইসটি কারওর ক্ষতি করতে বা মরতে দেয় না; আপনার উচ্চ ডেটা হার, ফল্ট পুনরুদ্ধার, প্যাকেট সনাক্তকরণ ইত্যাদির প্রয়োজন হয়) তবে কিছু স্ট্যান্ডার্ড প্রোটোকল এবং ডিজাইনের অনুশীলনগুলি দেখুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.