ব্যবহারকারী HAL বৈশিষ্ট্য

অনেক বর্তমান যানবাহন আর্কিটেকচারে একাধিক ইলেকট্রনিক কন্ট্রোল ইউনিট (ECUs) থাকে ইনফোটেইনমেন্ট সিস্টেমের বাইরে যেটি এর্গোনমিক্স নিয়ন্ত্রণ করে, যেমন সিট সেটিংস এবং মিরর সমন্বয়। বর্তমান হার্ডওয়্যার এবং পাওয়ার আর্কিটেকচারের উপর ভিত্তি করে, অ্যান্ড্রয়েড-ভিত্তিক ইনফোটেইনমেন্ট সিস্টেম চালিত হওয়ার আগে অনেক ECU পাওয়ার আপ হয়ে যায়। এই ECUগুলি ভেহিক্যাল হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (VHAL) এর মাধ্যমে একটি Android-ভিত্তিক ইনফোটেইনমেন্ট সিস্টেমের সাথে ইন্টারফেস করতে পারে।

Android 11 থেকে শুরু করে, Android Automotive OS (AAOS) ব্যবহারকারীদের শনাক্ত করার জন্য বাহ্যিক আনুষাঙ্গিক তৈরি, স্যুইচ, অপসারণ এবং সংযুক্ত করার জন্য VHAL-এ বৈশিষ্ট্যের একটি নতুন সেট চালু করেছে। উদাহরণস্বরূপ, এই নতুন বৈশিষ্ট্যগুলি একজন ড্রাইভারকে তাদের অ্যান্ড্রয়েড ব্যবহারকারীর সাথে একটি বাহ্যিক আনুষঙ্গিক, যেমন একটি কী ফোব, জোড়া বাঁধতে সক্ষম করে। তারপর, চালক গাড়ির কাছে গেলে, একটি ECU জেগে ওঠে এবং কী ফোব সনাক্ত করে। এই ECU HAL কে নির্দেশ করে যে কোন Android ব্যবহারকারীর ইনফোটেইনমেন্ট বুট আপ শুরু করা উচিত, যা একজন ড্রাইভার তাদের Android ব্যবহারকারীর লোড হওয়ার জন্য অপেক্ষা করার সময়কে কমিয়ে দেয়।

ব্যবহারকারী HAL সক্ষম করুন

সিস্টেম প্রপার্টি android.car.user_hal_enabled true হিসাবে সেট করা আছে তা নিশ্চিত করে ব্যবহারকারী HAL বৈশিষ্ট্যগুলিকে স্পষ্টভাবে সক্রিয় করতে হবে। (আপনি এটি car.mk ফাইলে করতে পারেন, যাতে এটি ম্যানুয়ালি সেট করার প্রয়োজন না হয়।) UserHalService ডাম্প করে user_hal_enabled=true সক্ষম হয়েছে কিনা তা পরীক্ষা করুন:

$ adb shell dumpsys car_service --hal UserHalService|grep enabled
user_hal_enabled=true

এছাড়াও আপনি adb shell getprop android.car.user_hal_enabled বা adb logcat CarServiceHelper *:s ব্যবহার করে user_hal_enabled চেক করতে পারেন। সম্পত্তি অক্ষম করা হলে, system_server শুরু হলে নিম্নলিখিত মত একটি বার্তা প্রদর্শিত হয়:

I CarServiceHelper: Not using User HAL

ম্যানুয়ালি user_hal_enabled সক্ষম করতে, android.car.user_hal_enabled সিস্টেম বৈশিষ্ট্য সেট করুন এবং system_server পুনরায় চালু করুন:

$ adb shell setprop android.car.user_hal_enabled true
$ adb shell stop && adb shell start

logcat আউটপুট নিম্নরূপ প্রদর্শিত হয়:

I CarServiceHelper: User HAL enabled with timeout of 5000ms
D CarServiceHelper: Got result from HAL: OK
I CarServiceHelper: User HAL returned DEFAULT behavior

ব্যবহারকারী HAL বৈশিষ্ট্য

ব্যবহারকারীর জীবনচক্র বৈশিষ্ট্য

নিম্নলিখিত বৈশিষ্ট্যগুলি ব্যবহারকারীর জীবনচক্রের অবস্থার জন্য HAL তথ্য প্রদান করে, যা Android সিস্টেম এবং একটি বহিরাগত ECU এর মধ্যে ব্যবহারকারীর জীবনচক্র সিঙ্ক্রোনাইজেশন সক্ষম করে। এই বৈশিষ্ট্যগুলি একটি অনুরোধ এবং প্রতিক্রিয়া প্রোটোকল ব্যবহার করে, যেখানে Android সিস্টেম একটি সম্পত্তির মান সেট করে একটি অনুরোধ করে এবং HAL একটি সম্পত্তি পরিবর্তন ইভেন্ট জারি করে প্রতিক্রিয়া জানায়৷

দ্রষ্টব্য: যখন ব্যবহারকারী HAL সমর্থিত হয়, তখন নিম্নলিখিত সমস্ত বৈশিষ্ট্য প্রয়োগ করতে হবে।

HAL সম্পত্তি বর্ণনা
INITIAL_USER_INFO
(পড়/লিখ)
ডিভাইসটি সাসপেন্ড-টু-র‍্যাম (STR) থেকে বুট বা পুনরায় শুরু হলে কোন Android ব্যবহারকারী সিস্টেমটি শুরু হবে তা নির্ধারণ করতে এই বৈশিষ্ট্যটি Android সিস্টেম দ্বারা বলা হয়। কল করা হলে, HAL-কে অবশ্যই এই বিকল্পগুলির মধ্যে একটি দিয়ে সাড়া দিতে হবে:
  • অ্যান্ড্রয়েড দ্বারা সেট করা ডিফল্ট আচরণ (সর্বশেষ ব্যবহৃত ব্যবহারকারীতে স্যুইচ করা বা এটি প্রথম বুট হলে একটি নতুন ব্যবহারকারী তৈরি করা)।
  • একটি বিদ্যমান ব্যবহারকারীতে স্যুইচ করুন।
  • একটি নতুন ব্যবহারকারী তৈরি করুন (নাম, পতাকা, সিস্টেম লোকেল ইত্যাদির ঐচ্ছিক বৈশিষ্ট্য সহ) এবং সেই নতুন ব্যবহারকারীতে স্যুইচ করুন।

দ্রষ্টব্য: যদি HAL সাড়া না দেয়, ডিফল্ট আচরণ হল একটি টাইমআউট পিরিয়ডের পরে (ডিফল্টভাবে পাঁচ সেকেন্ড), যা বুটকে বিলম্বিত করে। যদি HAL উত্তর দেয়, কিন্তু অ্যান্ড্রয়েড সিস্টেম অ্যাকশনটি কার্যকর করতে ব্যর্থ হয় (উদাহরণস্বরূপ, যদি ব্যবহারকারীর সর্বোচ্চ সংখ্যা পৌঁছে যায়), ডিফল্ট আচরণ ব্যবহার করা হয়।

উদাহরণ: ডিফল্টরূপে, অ্যান্ড্রয়েড সিস্টেম বুট করার পরে শেষ সক্রিয় ব্যবহারকারীতে শুরু হয়। যদি একটি ভিন্ন ব্যবহারকারীর জন্য একটি মূল fob সনাক্ত করা হয়, ECU HAL সম্পত্তিকে ওভাররাইড করে এবং, স্টার্ট আপের সময়, Android সিস্টেমটি সেই নির্দিষ্ট ব্যবহারকারীতে শুরু করতে সুইচ করে।

SWITCH_USER
(পড়/লিখ)
সক্রিয় ফোরগ্রাউন্ড অ্যান্ড্রয়েড ব্যবহারকারী স্যুইচ করার সময় এই বৈশিষ্ট্যটি বলা হয়। প্রপার্টিটি হয় অ্যান্ড্রয়েড সিস্টেমের দ্বারা বা HAL দ্বারা ব্যবহারকারীর সুইচের অনুরোধ করতে কল করা যেতে পারে। তিনটি কর্মপ্রবাহ হল:
  • আধুনিক। CarUserManager থেকে সুইচ শুরু হয়েছে।
  • উত্তরাধিকার। ActivityManager থেকে সুইচ শুরু হয়েছে।
  • যানবাহন। একটি ব্যবহারকারী পরিবর্তনের অনুরোধ করার জন্য HAL দ্বারা কল করা হয়েছে৷

অ্যান্ড্রয়েড সিস্টেম এবং বাহ্যিক ECU সিঙ্ক্রোনাইজ করা নিশ্চিত করতে আধুনিক ওয়ার্কফ্লো একটি দুই-ফেজ কমিট পদ্ধতি ব্যবহার করে। যখন অ্যান্ড্রয়েড সুইচ শুরু করে:

  1. ব্যবহারকারী পরিবর্তন করা যাবে কিনা তা নির্ধারণ করতে HAL চেক করুন।

    HAL SUCCESS বা FAILURE সাথে সাড়া দেয়, যাতে অ্যান্ড্রয়েড জানে যে এগিয়ে যেতে হবে কি না।

  2. অ্যান্ড্রয়েড ব্যবহারকারী সুইচ সম্পূর্ণ করুন।

    স্যুইচ সফল বা ব্যর্থতা নির্দেশ করতে Android HAL-কে একটি ANDROID_POST_SWITCH প্রতিক্রিয়া পাঠায়৷

HAL-এর ANDROID_POST_SWITCH প্রতিক্রিয়া না হওয়া পর্যন্ত অপেক্ষা করা উচিত যাতে ECUগুলিকে সিঙ্ক্রোনাইজ করতে বা HAL এর অন্যান্য বৈশিষ্ট্যগুলি আপডেট করতে তার অবস্থা আপডেট করা যায়৷

উদাহরণ: চলমান অবস্থায়, একজন ড্রাইভার অ্যান্ড্রয়েড ব্যবহারকারীদের ইনফোটেইনমেন্ট UI-তে পরিবর্তন করার চেষ্টা করে। যাইহোক, কারণ গাড়ির সিট সেটিংস অ্যান্ড্রয়েড ব্যবহারকারীর সাথে সংযুক্ত থাকে, ব্যবহারকারী সুইচের সময় সীট নড়ে। এইভাবে, ECU আসন নিয়ন্ত্রণ করে সুইচ নিশ্চিত করে না, HAL ব্যর্থতার সাথে প্রতিক্রিয়া জানায় এবং অ্যান্ড্রয়েড ব্যবহারকারী সুইচ করা হয় না।

লিগ্যাসি ওয়ার্কফ্লো হল একটি একমুখী কল যা ব্যবহারকারীর সুইচ করার পরে পাঠানো হয় (তাই HAL সুইচটি ব্লক করতে পারে না)। এটি শুধুমাত্র বুট করার সময় (প্রাথমিক ব্যবহারকারীর সুইচের পরে) অথবা যে অ্যাপগুলি CarUserManager.switchUser ActivityManager.switchUser() CarUserManager.switchUser() কল করে তাদের জন্য বলা হয়। রেফারেন্স Settings এবং SystemUI অ্যাপগুলি ইতিমধ্যেই পরেরটি ব্যবহার করে, কিন্তু যদি কোনও OEM ব্যবহারকারীদের পরিবর্তন করতে তাদের নিজস্ব সেটিংস অ্যাপ সরবরাহ করে, তাহলে OEMগুলির ব্যবহার পরিবর্তন করা উচিত।

উদাহরণ: যদি কোনো অ্যাপ ব্যবহারকারীদের সুইচ করতে ActivityManager.switchUser() ব্যবহার করে, তাহলে ব্যবহারকারীর সুইচ হয়েছে তা জানানোর জন্য HAL-কে একটি একমুখী কল পাঠানো হয়।

যানবাহনের কার্যপ্রবাহ HAL থেকে উদ্ভূত হয়, Android সিস্টেম থেকে নয়:

  1. HAL একটি ব্যবহারকারী সুইচের অনুরোধ করে৷
  2. সিস্টেমটি অ্যান্ড্রয়েড ব্যবহারকারী সুইচ সম্পূর্ণ করে।
  3. স্যুইচ সফল বা ব্যর্থতা নির্দেশ করতে Android HAL-কে একটি ANDROID_POST_SWITCH প্রতিক্রিয়া পাঠায়৷

উদাহরণ: বব গাড়িটি খুলতে অ্যালিসের কী ফোব ব্যবহার করেছে এবং HAL অ্যালিসের ব্যবহারকারী আইডি সহ INITIAL_USER_INFO অনুরোধের উত্তর দিয়েছে৷ এরপরে, একটি বায়োমেট্রিক সেন্সর ECU ড্রাইভারকে বব হিসাবে চিহ্নিত করেছে, তাই ব্যবহারকারী HAL ব্যবহারকারীদের পরিবর্তন করার জন্য একটি SWITCH_USER অনুরোধ পাঠিয়েছে।

CREATE_USER
(পড়/লিখ)
যখন একজন নতুন অ্যান্ড্রয়েড ব্যবহারকারী তৈরি করা হয় ( CarUserManager.createUser() API ব্যবহার করে) তখন এই প্রপার্টিটি Android সিস্টেম দ্বারা বলা হয়।

HAL SUCCESS বা FAILURE সাথে প্রতিক্রিয়া জানায়। যদি HAL ব্যর্থতার সাথে সাড়া দেয়, তাহলে Android সিস্টেম ব্যবহারকারীকে সরিয়ে দেয়।

উদাহরণ: একজন ড্রাইভার একটি নতুন অ্যান্ড্রয়েড ব্যবহারকারী তৈরি করতে একটি ইনফোটেইনমেন্ট UI আইকনে ট্যাপ করে৷ এটি HAL এবং বাকি যানবাহন সাবসিস্টেমের কাছে একটি অনুরোধ পাঠায়। ECUs নতুন তৈরি ব্যবহারকারীর অবহিত করা হয়. অন্যান্য সাবসিস্টেম এবং ECUগুলি তারপরে তাদের অভ্যন্তরীণ ব্যবহারকারী আইডিকে Android ব্যবহারকারী আইডির সাথে সংযুক্ত করে।

REMOVE_USER
(শুধুমাত্র লিখুন)
অ্যান্ড্রয়েড ব্যবহারকারীকে সরিয়ে দেওয়ার পরে ( CarUserManager.removeUser() পদ্ধতিতে) Android সিস্টেম এই বৈশিষ্ট্যটিকে কল করে।

এটি একমুখী আহ্বান, HAL থেকে কোনো প্রতিক্রিয়া আশা করা যাচ্ছে না।

উদাহরণ: একজন ড্রাইভার ইনফোটেইনমেন্ট UI-তে বিদ্যমান অ্যান্ড্রয়েড ব্যবহারকারীকে সরাতে ট্যাপ করে। HAL কে অবহিত করা হয় এবং অন্যান্য যানবাহন সাবসিস্টেম এবং ECU-কে ব্যবহারকারী অপসারণের বিষয়ে জানানো হয় যাতে তারা তাদের অভ্যন্তরীণ ব্যবহারকারী আইডি মুছে ফেলতে পারে।

অতিরিক্ত বৈশিষ্ট্য

নিম্নলিখিত অতিরিক্ত বৈশিষ্ট্য, ব্যবহারকারীর জীবনচক্র অবস্থার সাথে সম্পর্কহীন। প্রতিটি ব্যবহারকারী HAL সমর্থন ছাড়াই বাস্তবায়ন করা যেতে পারে।

HAL সম্পত্তি বর্ণনা
USER_IDENTIFICATION_ASSOCIATION
(পড়/লিখ)
যে কোন Android ব্যবহারকারীকে একটি শনাক্তকরণ প্রক্রিয়ার সাথে যুক্ত করতে এই সম্পত্তিটি ব্যবহার করুন, যেমন একটি কী fob বা ফোন৷ অ্যাসোসিয়েশন get বা set এই একই সম্পত্তি ব্যবহার করুন।

উদাহরণ: একজন ড্রাইভার বর্তমান সক্রিয় অ্যান্ড্রয়েড ব্যবহারকারী ( USER_11 ) এর সাথে গাড়িটি ( KEY_123 ) খুলতে ব্যবহৃত কী fob সংযুক্ত করতে একটি ইনফোটেইনমেন্ট UI আইকনে ট্যাপ করে৷

হেল্পার লাইব্রেরি

অনুরোধ এবং প্রতিক্রিয়া বার্তাগুলিতে ব্যবহৃত সমস্ত বস্তুর (যেমন UserInfo , InitialUserInfoRequest , InitialUSerInfoResponse , এবং আরও অনেক কিছু) C++ struct ব্যবহার করে একটি উচ্চ স্তরের উপস্থাপনা আছে, তবে অপসারণকে অবশ্যই মানক VehiclePropValue অবজেক্টে সমতল করতে হবে (নীচের উদাহরণগুলি দেখুন)। উন্নয়নের স্বাচ্ছন্দ্যের জন্য, AOSP-এ একটি C++ সাহায্যকারী লাইব্রেরি সরবরাহ করা হয়েছে যাতে ব্যবহারকারী HAL structs স্বয়ংক্রিয়ভাবে একটি VehiclePropValue এ রূপান্তর করা হয় (এবং এর বিপরীতে)।

উদাহরণ

INITIAL_USER_INFO

অনুরোধের উদাহরণ (প্রথম বুটে)

VehiclePropValue { // flattened from InitialUserInfoRequest
prop: 299896583 // INITIAL_USER_INFO
prop.values.int32Values:
 [0] = 1 // Request ID
 [1] = 1 // InitialUserInfoRequestType.FIRST_BOOT
 [2] = 0 // user id of current user
 [3] = 1 // flags of current user (SYSTEM)
 [4] = 1 // number of existing users
 [5] = 0 // existingUser[0].id
 [6] = 1 // existingUser[0].flags
}

প্রতিক্রিয়া উদাহরণ (প্রশাসক ব্যবহারকারী তৈরি করুন)

VehiclePropValue { // flattened from InitialUserInfoResponse
prop: 299896583 // INITIAL_USER_INFO
prop.values.int32Values:
  [0] = 1      // Request ID (must match request)
  [1] = 2      // InitialUserInfoResponseAction.CREATE
  [2] = -10000 // user id (not used on CREATE)
  [3] = 8      // user flags (ADMIN)
prop.values.stringValue: "en-US||Car Owner" // User locale and user name
}

SWITCH_USER

শ্রেণী এবং বৈশিষ্ট্যের প্রকৃত নাম সামান্য ভিন্ন কিন্তু সামগ্রিক কর্মপ্রবাহ একই, যেমন চিত্রে দেখানো হয়েছে:

কর্মপ্রবাহ

চিত্র 1. ব্যবহারকারীর HAL বৈশিষ্ট্য কর্মপ্রবাহ।

আধুনিক কর্মপ্রবাহ অনুরোধের উদাহরণ

VehiclePropValue { // flattened from SwitchUserRequest
prop: 299896585 // SWITCH_USER
prop.values.int32Values:
 [0]     = 42    // Request ID
 [1]     = 2     // SwitchUserMessageType::ANDROID_SWITCH ("modern")
 [2,3]   = 11,0  // target user id (11) and flags (none in this case)
 [4,5]   = 10,8  // current user id (10) and flags (ADMIN)
 [6]     = 3     // number of existing users (0, 10, 11)
 [7,8]   = 0,1   // existingUser[0] (id=0, flags=SYSTEM)
 [9,10]  = 10,8  // existingUser[1] (id=10, flags=ADMIN)
 [11,12] = 11,0  // existingUser[2] (id=11, flags=NONE)
}

আধুনিক কর্মপ্রবাহ প্রতিক্রিয়া উদাহরণ

VehiclePropValue { // flattened from SwitchUserResponse
prop: 299896584 // SWITCH_USER
prop.values.int32Values:
 [0] = 42        // Request ID (must match request)
 [1] = 3         // SwitchUserMessageType::VEHICLE_RESPONSE
 [2] = 1         // SwitchUserStatus::SUCCESS
}

আধুনিক ওয়ার্কফ্লো পোস্ট-সুইচ প্রতিক্রিয়া উদাহরণ

এই প্রতিক্রিয়াটি সাধারণত ঘটে যখন একটি Android সুইচ সফল হয়:

VehiclePropValue { // flattened from SwitchUserRequest
prop: 299896584 // SWITCH_USER
prop.values.int32Values:
 [0]     = 42    // Request ID (must match "pre"-SWITCH_USER request )
 [1]     = 5     // SwitchUserMessageType::ANDROID_POST_SWITCH
 [2,3]   = 11,0  // target user id (11) and flags (none in this case)
 [4,5]   = 11,0  // current user id (11) and flags (none in this case)
 [6]     = 3     // number of existing users (0, 10, 11)
 [7,8]   = 0,1   // existingUser[0] (id=0, flags=SYSTEM)
 [9,10]  = 10,8  // existingUser[1] (id=10, flags=ADMIN)
 [11,12] = 11,0  // existingUser[2] (id=11, flags=NONE)
}

আধুনিক কর্মপ্রবাহ পোস্ট-সুইচ প্রতিক্রিয়া

এই প্রতিক্রিয়াটি সাধারণত ঘটে যখন একটি Android সুইচ ব্যর্থ হয়:

VehiclePropValue { // flattened from SwitchUserRequest
prop: 299896584 // SWITCH_USER
prop.values.int32Values:
 [0]     = 42    // Request ID (must match "pre"-SWITCH_USER request )
 [1]     = 5     // SwitchUserMessageType::ANDROID_POST_SWITCH
 [2,3]   = 11,0  // target user id (11) and flags (none in this case)
 [4,5]   = 10,8  // current user id (10) and flags (ADMIN)
 [6]     = 3     // number of existing users (0, 10, 11)
 [7,8]   = 0,1   // existingUser[0] (id=0, flags=SYSTEM)
 [9,10]  = 10,8  // existingUser[1] (id=10, flags=ADMIN)
 [11,12] = 11,0  // existingUser[2] (id=11, flags=NONE)
}

লিগ্যাসি ওয়ার্কফ্লো অনুরোধের উদাহরণ

VehiclePropValue { // flattened from SwitchUserRequest
prop: 299896584 // SWITCH_USER
prop.values.int32Values:
 [0]     = 2     // Request ID
 [1]     = 1     // SwitchUserMessageType::LEGACY_ANDROID_SWITCH
 [2,3]   = 10,8  // target user id (10) and flags (ADMIN)
 [4,5]   = 0,1   // current user id (0) and flags (SYSTEM)
 [6]     = 3     // number of existing users (0, 10, 11)
 [7,8]   = 0,1   // existingUser[0] (id=0, flags=SYSTEM)
 [9,10]  = 10,8  // existingUser[1] (id=10, flags=ADMIN)
 [11,12] = 11,0  // existingUser[2] (id=11, flags=NONE)
}

যানবাহন কর্মপ্রবাহ অনুরোধের উদাহরণ

VehiclePropValue { // flattened from SwitchUserRequest
prop: 299896584 // SWITCH_USER
prop.values.int32Values:
 [0]     = -108  // Request ID (must be negative)
 [1]     = 4     // SwitchUserMessageType::VEHICLE_REQUEST
 [2]     = 11    // target user id
}

উত্তরাধিকার কর্মপ্রবাহ পোস্ট-সুইচ প্রতিক্রিয়া

এই প্রতিক্রিয়াটি সাধারণত ঘটে যখন একটি Android সুইচ সফল হয়:

VehiclePropValue { // flattened from SwitchUserRequest
prop: 299896584 // SWITCH_USER
prop.values.int32Values:
 [0]     = -108  // Request ID (must match from vehicle request )
 [1]     = 5     // SwitchUserMessageType::ANDROID_POST_SWITCH
 [2,3]   = 11,0  // target user id (11) and flags (none in this case)
 [4,5]   = 11,0  // current user id (11) and flags (none in this case)
 [6]     = 3     // number of existing users (0, 10, 11)
 [7,8]   = 0,1   // existingUser[0] (id=0, flags=SYSTEM)
 [9,10]  = 10,8  // existingUser[1] (id=10, flags=ADMIN)
 [11,12] = 11,0  // existingUser[2] (id=11, flags=NONE)
}

CREATE_USER

অনুরোধ উদাহরণ

VehiclePropValue { // flattened from CreateUserRequest
prop: 299896585 // CREATE_USER
prop.values.int32Values:
 [0]      = 42  // Request ID
 [1,2]    = 11,6     // Android id of the created user and flags (id=11, flags=GUEST, EPHEMERAL)
 [3,4]    = 10,0  // current user id (10) and flags (none in this case)
 [5]      = 3  // number of existing users (0, 10, 11)
 [6,7]    = 0,1   // existingUser[0] (id=0, flags=SYSTEM)
 [8,9]    = 10,8  // existingUser[1] (id=10, flags=ADMIN)
 [10,11] = 11,6 // newUser[2] (id=11, flags=GUEST,EPHEMERAL)
}

প্রতিক্রিয়া উদাহরণ

VehiclePropValue { // flattened from CreateUserResponse
prop: 299896585 // CREATE_USER
prop.values.int32Values:
 [0] = 42        // Request ID (must match request)
 [1] = 3         // CreateUserStatus::SUCCESS
}

REMOVE_USER

অনুরোধ উদাহরণ

VehiclePropValue { // flattened from RemoveUserRequest
prop: 299896586 // REMOVE_USER
prop.values.int32Values:
 [0]      = 42  // Request ID
 [1,2]    = 11,0     // Android id of the removed user and flags (none in this case)
 [3,4]    = 10,0  // current user id (10) and flags (none in this case)
 [5]      = 2  // number of existing users (0, 10)
 [6,7]    = 0,1   // existingUser[0] (id=0, flags=SYSTEM)
 [8,9]    = 10,8  // existingUser[1] (id=10, flags=ADMIN)
}

USER_IDENTIFICATION_ASSOCIATION

উদাহরণ সেট করুন (ব্যবহারকারী 10 এর সাথে যুক্ত কী ফোব)

VehiclePropValue { // flattened from UserIdentificationSetRequest
prop: 299896587 // USER_IDENTIFICATION_ASSOCIATION
prop.values.int32Values:
 [0]      = 43  // Request ID
 [1,2]    = 10,0     // Android id (10) and flags (none in this case)
 [3]    = 1  // number of associations being set
 [4]      = 1  // 1st type: UserIdentificationAssociationType::KEY_FOB
 [5]    = 1   // 1st value: UserIdentificationAssociationSetValue::ASSOCIATE_CURRENT_USER
}