انجام محلی را برای ادغام های Cloud-to-Cloud فعال کنید

۱. قبل از شروع

یکپارچه‌سازی خانه‌های هوشمند به دستیار گوگل اجازه می‌دهد تا دستگاه‌های متصل در خانه‌های کاربران را کنترل کند. برای ایجاد یکپارچه‌سازی ابر به ابر، باید یک نقطه پایانی وب‌هوک ابری فراهم کنید که بتواند اهداف خانه هوشمند را مدیریت کند. به عنوان مثال، وقتی کاربری می‌گوید: «هی گوگل، چراغ‌ها را روشن کن»، دستیار گوگل این دستور را به بخش ابری شما ارسال می‌کند تا وضعیت دستگاه را به‌روزرسانی کند.

کیت توسعه نرم‌افزار Local Home با افزودن یک مسیر محلی برای هدایت مستقیم اهداف خانه هوشمند به دستگاه Google Home، یکپارچه‌سازی خانه هوشمند شما را بهبود می‌بخشد، که این امر قابلیت اطمینان را افزایش داده و تأخیر در پردازش دستورات کاربران را کاهش می‌دهد. این کیت به شما امکان می‌دهد یک برنامه تحویل سفارش محلی را با TypeScript یا JavaScript بنویسید و مستقر کنید که دستگاه‌ها را شناسایی کرده و دستورات را روی هر بلندگوی هوشمند Google Home یا نمایشگر هوشمند Google Nest اجرا می‌کند. سپس برنامه شما با استفاده از پروتکل‌های استاندارد موجود برای انجام دستورات، مستقیماً با دستگاه‌های هوشمند موجود کاربران از طریق شبکه محلی ارتباط برقرار می‌کند.

72ffb320986092c.png

پیش‌نیازها

آنچه خواهید ساخت

در این آزمایشگاه کد، شما یک سیستم یکپارچه‌سازی خانه هوشمند که قبلاً با Firebase ساخته شده است را پیاده‌سازی خواهید کرد، سپس پیکربندی اسکن را در کنسول توسعه‌دهندگان اعمال خواهید کرد و یک برنامه محلی با استفاده از TypeScript می‌سازید تا دستورات نوشته شده در Node.js را به یک دستگاه ماشین لباسشویی مجازی ارسال کند.

آنچه یاد خواهید گرفت

  • نحوه فعال‌سازی و پیکربندی تکمیل سفارش محلی در کنسول توسعه‌دهندگان.
  • نحوه استفاده از SDK محلی Home برای نوشتن یک اپلیکیشن تحویل سفارشات محلی.
  • نحوه اشکال‌زدایی برنامه محلی تکمیل سفارش بارگذاری شده روی بلندگوی گوگل هوم یا نمایشگر هوشمند گوگل نست.

آنچه نیاز دارید

  • آخرین نسخه گوگل کروم
  • یک دستگاه iOS یا اندروید با برنامه Google Home
  • بلندگوی هوشمند گوگل هوم یا نمایشگر هوشمند گوگل نست
  • نسخه Node.js 10.16 یا بالاتر
  • یک حساب گوگل
  • یک حساب پرداخت گوگل کلود

۲. شروع کار

کنترل‌های فعالیت را فعال کنید

برای استفاده از دستیار گوگل، باید داده‌های فعالیت خاصی را با گوگل به اشتراک بگذارید. دستیار گوگل برای عملکرد صحیح به این داده‌ها نیاز دارد؛ با این حال، الزام به اشتراک‌گذاری داده‌ها مختص SDK نیست. برای به اشتراک گذاشتن این داده‌ها، اگر از قبل حساب گوگل ندارید، یک حساب کاربری گوگل ایجاد کنید. می‌توانید از هر حساب کاربری گوگلی استفاده کنید - نیازی نیست که حساب کاربری توسعه‌دهنده شما باشد.

صفحه کنترل‌های فعالیت را برای حساب گوگلی که می‌خواهید با دستیار استفاده کنید، باز کنید.

مطمئن شوید که کلیدهای تغییر وضعیت زیر فعال هستند:

  • فعالیت وب و برنامه - علاوه بر این، حتماً کادر انتخاب « افزودن سابقه و فعالیت Chrome از سایت‌ها، برنامه‌ها و دستگاه‌هایی که از سرویس‌های Google استفاده می‌کنند» را علامت بزنید.
  • اطلاعات دستگاه
  • فعالیت صوتی و تصویری

ایجاد یک پروژه ادغام ابر به ابر

  1. به کنسول توسعه‌دهندگان بروید.
  2. روی «ایجاد پروژه» کلیک کنید، یک نام برای پروژه وارد کنید و روی «ایجاد پروژه» کلیک کنید.

نام پروژه

ادغام ابر به ابر را انتخاب کنید

در صفحه اصلی پروژه در کنسول توسعه‌دهندگان، گزینه «افزودن ادغام ابر به ابر» را در زیر «ابر به ابر» انتخاب کنید.

ادغام ابر به ابر را اضافه کنید

نصب رابط خط فرمان فایربیس

رابط خط فرمان فایربیس (CLI) به شما این امکان را می‌دهد که برنامه‌های وب خود را به صورت محلی ارائه دهید و برنامه وب خود را در هاستینگ فایربیس مستقر کنید.

برای نصب CLI، دستور npm زیر را از ترمینال اجرا کنید:

npm install -g firebase-tools

برای تأیید اینکه CLI به درستی نصب شده است، دستور زیر را اجرا کنید:

firebase --version

با اجرای دستور زیر، Firebase CLI را با حساب گوگل خود مجاز کنید:

firebase login

فعال کردن HomeGraph API

رابط برنامه‌نویسی کاربردی HomeGraph امکان ذخیره‌سازی و پرس‌وجو از دستگاه‌ها و وضعیت آن‌ها را در Home Graph کاربر فراهم می‌کند. برای استفاده از این API، ابتدا باید کنسول Google Cloud را باز کرده و HomeGraph API را فعال کنید .

در کنسول Google Cloud، مطمئن شوید که پروژه‌ای را انتخاب می‌کنید که با <project-id>. سپس، در صفحه کتابخانه API برای API HomeGraph، روی فعال کردن کلیک کنید.

5SVCzM8IZLi_9DV8M0nEklv16NXkpvM0bIzQK2hSyKyvnFHBxPOz90rbr72ayxzmxd5aN ROOqC_Cp4outbdlwJdObDs0DIE_8vYzw6dovoVrP9IZWlWsZxDS7UHOi1jiRbDMG8MqUA

۳. برنامه‌ی آغازین را اجرا کنید

اکنون که محیط توسعه خود را راه‌اندازی کرده‌اید، می‌توانید پروژه اولیه را مستقر کنید تا تأیید کنید که همه چیز به درستی پیکربندی شده است.

دریافت کد منبع

برای دانلود نمونه این codelab روی دستگاه توسعه‌دهنده خود، روی لینک زیر کلیک کنید:

... یا می‌توانید مخزن GitHub را از خط فرمان کلون کنید:

git clone https://github.com/google-home/smarthome-local.git

درباره پروژه

پروژه اولیه شامل زیرشاخه‌های زیر است:

  • public — رابط کاربری وب Frontend برای کنترل و نظارت بر ماشین لباسشویی هوشمند
  • functions — توابع ابری که عملیات ابری را برای ادغام ابر به ابر پیاده‌سازی می‌کنند
  • local - اسکلت پروژه برنامه تکمیل سفارش محلی با کنترل‌کننده‌های اینتنت که در index.ts قرار گرفته‌اند

تکمیل ابری ارائه شده شامل توابع زیر در index.js است:

  • fakeauth - نقطه پایانی مجوز برای پیوند حساب
  • faketoken — نقطه پایانی توکن برای پیوند حساب
  • smarthome - نقطه پایانی تحقق هدف خانه هوشمند
  • reportstate — رابط برنامه‌نویسی کاربردی HomeGraph را در صورت تغییر وضعیت دستگاه فراخوانی می‌کند.
  • updateDevice —نقطه پایانی مورد استفاده توسط دستگاه مجازی برای فعال کردن Report State

اتصال به فایربیس

به دایرکتوری app-start بروید، سپس Firebase CLI را با پروژه ادغام Cloud-to-cloud خود تنظیم کنید:

cd app-start
firebase use <project-id>

پیکربندی پروژه فایربیس

یک پروژه Firebase را راه‌اندازی کنید.

firebase init

ویژگی‌های CLI، پایگاه داده بلادرنگ و ویژگی توابع را انتخاب کنید.

? Which Firebase features do you want to set up for this directory? Press Space to select features, then Enter
 to confirm your choices. (Press <space> to select, <a> to toggle all, <i> to invert selection, and <enter> to
 proceed)
>( ) Data Connect: Set up a Firebase Data Connect service
 ( ) Firestore: Configure security rules and indexes files for Firestore
 ( ) Genkit: Setup a new Genkit project with Firebase
 (*) Functions: Configure a Cloud Functions directory and its files
 ( ) App Hosting: Configure an apphosting.yaml file for App Hosting
 ( ) Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys
 ( ) Storage: Configure a security rules file for Cloud Storage
 ( ) Emulators: Set up local emulators for Firebase products
 ( ) Remote Config: Configure a template file for Remote Config
 ( ) Extensions: Set up an empty Extensions manifest
 (*) Realtime Database: Configure a security rules file for Realtime Database and (optionally) provision
default instance
 ( ) Data Connect: Set up a Firebase Data Connect service
 ( ) Firestore: Configure security rules and indexes files for Firestore

این کار APIها و ویژگی‌های لازم برای پروژه شما را مقداردهی اولیه می‌کند.

وقتی از شما خواسته شد، پایگاه داده Realtime را مقداردهی اولیه کنید. می‌توانید از مکان پیش‌فرض برای نمونه پایگاه داده استفاده کنید.

? It seems like you haven't initialized Realtime Database in your project yet. Do you want to set it up?
Yes

? Please choose the location for your default Realtime Database instance:
us-central1

از آنجایی که از کد پروژه اولیه استفاده می‌کنید، فایل پیش‌فرض را برای قوانین امنیتی انتخاب کنید و مطمئن شوید که فایل قوانین پایگاه داده موجود را بازنویسی نمی‌کنید.

? File database.rules.json already exists. Do you want to overwrite it with the Realtime Database Security Rules for <project-ID>-default-rtdb from the Firebase Console?
No

اگر در حال مقداردهی اولیه مجدد پروژه خود هستید، وقتی از شما پرسیده شد که آیا می‌خواهید یک کدبیس را مقداردهی اولیه یا بازنویسی کنید، گزینه Overwrite را انتخاب کنید.

? Would you like to initialize a new codebase, or overwrite an existing one?
Overwrite

هنگام پیکربندی توابع خود، باید از فایل‌های پیش‌فرض استفاده کنید و مطمئن شوید که فایل‌های index.js و package.json موجود در نمونه پروژه را بازنویسی نمی‌کنید.

? What language would you like to use to write Cloud Functions?
JavaScript

? Do you want to use ESLint to catch probable bugs and enforce style?
No

? File functions/package.json already exists. Overwrite?
No

? File functions/index.js already exists. Overwrite?
No

اگر در حال مقداردهی مجدد پروژه خود هستید، وقتی از شما پرسیده شد که آیا می‌خواهید functions/.gitignore را مقداردهی اولیه کنید یا بازنویسی کنید، گزینه خیر (No) را انتخاب کنید.

? File functions/.gitignore already exists. Overwrite?
No
? Do you want to install dependencies with npm now?
Yes

اگر ESLint به طور تصادفی فعال شده باشد، دو روش برای غیرفعال کردن آن وجود دارد:

  1. با استفاده از رابط کاربری گرافیکی، به پوشه ../functions در زیر پروژه بروید، فایل مخفی .eslintrc.js را انتخاب کرده و آن را حذف کنید. آن را با فایل مشابه .eslintrc.json اشتباه نگیرید.
  2. با استفاده از خط فرمان:
    cd functions
    rm .eslintrc.js
    

برای اطمینان از پیکربندی صحیح و کامل Firebase، فایل firebase.json را از دایرکتوری washer-done به دایرکتوری washer-start کپی کنید و فایل موجود در washer-start را جایگزین کنید.

در دایرکتوری washer-start :

cp -vp ../washer-done/firebase.json .

استقرار در فایربیس

اکنون که وابستگی‌ها را نصب و پروژه خود را پیکربندی کرده‌اید، آماده‌اید تا برنامه را برای اولین بار اجرا کنید.

firebase deploy

این خروجی کنسولی است که باید ببینید:

...

✔ Deploy complete!

Project Console: https://console.firebase.google.com/project/<project-id>/overview
Hosting URL: https://<project-id>.web.app

این دستور یک برنامه وب را به همراه چندین تابع ابری برای Firebase مستقر می‌کند.

برای مشاهده برنامه وب، آدرس میزبانی (Hosting URL) را در مرورگر خود باز کنید ( https://<project-id>.web.app ). رابط کاربری زیر را مشاهده خواهید کرد:

L60eA7MONPmbBMl2XMipT9MdnP-RaVjyjf0Y93Y1b7mEyIsqZrrwczE7D3RQISRs-iusL 1g4XbNmGhuA6-5sLcWefnczwNJEPfNLtwBsO4Tb9YvcAZBI6_rX19z8rxbik9Vq8F2fwg

این رابط کاربری وب، یک پلتفرم شخص ثالث برای مشاهده یا تغییر وضعیت دستگاه‌ها را نشان می‌دهد. برای شروع پر کردن پایگاه داده خود با اطلاعات دستگاه، روی به‌روزرسانی کلیک کنید. هیچ تغییری در صفحه مشاهده نخواهید کرد، اما وضعیت فعلی ماشین لباسشویی شما در پایگاه داده ذخیره می‌شود.

اکنون زمان آن رسیده است که سرویس ابری که مستقر کرده‌اید را با استفاده از کنسول توسعه‌دهندگان به دستیار گوگل متصل کنید.

پروژه کنسول توسعه‌دهنده خود را پیکربندی کنید

در برگه «توسعه» ، یک نام نمایشی برای تعامل خود اضافه کنید. این نام در برنامه Google Home نمایش داده خواهد شد.

افزودن نام نمایشی

در قسمت App branding ، یک فایل png برای آیکون برنامه، با اندازه ۱۴۴ در ۱۴۴ پیکسل و نام دلخواه آپلود کنید. .png .

افزودن آیکون برنامه

برای فعال کردن پیوند حساب، از این تنظیمات پیوند حساب استفاده کنید:

شناسه مشتری

ABC123

راز مشتری

DEF456

آدرس اینترنتی مجوز

https://us-central1-<project-id>.cloudfunctions.net/fakeauth

آدرس اینترنتی توکن

https://us-central1-<project-id>.cloudfunctions.net/faketoken

به‌روزرسانی آدرس‌های اینترنتی (URL) لینک‌دهنده حساب کاربری

در زیر آدرس اینترنتی تکمیل سفارش ابری ، آدرس اینترنتی مربوط به عملکرد ابری خود را که برای اهداف خانه هوشمند انجام سفارش را فراهم می‌کند، وارد کنید.

https://us-central1-<project-id>.cloudfunctions.net/smarthome

افزودن آدرس اینترنتی تابع ابری

برای ذخیره پیکربندی پروژه خود، روی ذخیره کلیک کنید، سپس برای فعال کردن آزمایش روی پروژه خود، روی بعدی: آزمایش کلیک کنید.

ادغام ابر به ابر خود را آزمایش کنید

اکنون می‌توانید پیاده‌سازی وب‌هوک‌های لازم برای اتصال وضعیت دستگاه به دستیار را آغاز کنید.

برای آزمایش ادغام ابر به ابر، باید پروژه خود را به یک حساب گوگل متصل کنید. این کار امکان آزمایش از طریق سطوح دستیار گوگل و برنامه گوگل هوم را که به یک حساب کاربری یکسان وارد شده‌اند، فراهم می‌کند.

  1. در گوشی خود، تنظیمات دستیار گوگل (Google Assistant) را باز کنید. توجه داشته باشید که باید با همان حسابی که در کنسول وارد شده‌اید، وارد سیستم شوید.
  2. به دستیار گوگل > تنظیمات > کنترل خانه (زیر دستیار) بروید.
  3. روی نماد جستجو در بالا سمت راست کلیک کنید.
  4. برای یافتن برنامه آزمایشی خاص خود، با استفاده از پیشوند [test]، برنامه آزمایشی خود را جستجو کنید.
  5. آن مورد را انتخاب کنید. سپس دستیار گوگل با سرویس شما احراز هویت می‌کند و یک درخواست SYNC ارسال می‌کند و از سرویس شما می‌خواهد لیستی از دستگاه‌ها را برای کاربر ارائه دهد.

برنامه Google Home را باز کنید و مطمئن شوید که می‌توانید دستگاه ماشین لباسشویی خود را ببینید.

XcWmBVamBZtPfOFqtsr5I38stPWTqDcMfQwbBjetBgxt0FCjEs285pa9K3QXSASptw0KYN2G8yfkT0-xg664V4PjqMreDDs-HPegHjOc4EVtReYPu-WKZyygq9Xmkf8X8z9177nBjQ

تأیید کنید که می‌توانید ماشین لباسشویی را با استفاده از دستورات صوتی در برنامه Google Home کنترل کنید. همچنین باید تغییر وضعیت دستگاه را در رابط کاربری وب frontend سرویس ابری خود مشاهده کنید.

اکنون می‌توانید تکمیل سفارشات محلی را به فرآیند یکپارچه‌سازی خود اضافه کنید.

۴. به‌روزرسانی پردازش ابری

برای پشتیبانی از انجام محلی، باید یک فیلد جدید به نام otherDeviceIds برای هر دستگاه به پاسخ cloud SYNC اضافه کنید که حاوی یک شناسه محلی منحصر به فرد برای دستگاه باشد. این فیلد همچنین نشان‌دهنده توانایی کنترل محلی آن دستگاه است.

فیلد otherDeviceIds را همانطور که در قطعه کد زیر نشان داده شده است به پاسخ SYNC اضافه کنید:

توابع/index.js

app.onSync((body) => {
  return {
    requestId: body.requestId,
    payload: {
      agentUserId: '123',
      devices: [{
        id: 'washer',
        type: 'action.devices.types.WASHER',
        traits: [ ... ],
        name: { ... },
        deviceInfo: { ... },
        willReportState: true,
        attributes: {
          pausable: true,
        },
        otherDeviceIds: [{
          deviceId: 'deviceid123',
        }],
      }],
    },
  };
});

پروژه به‌روزرسانی‌شده را در Firebase مستقر کنید:

firebase deploy --only functions

پس از اتمام نصب، به رابط کاربری وب بروید و روی دکمه‌ی «Refresh» کلیک کنید. ae8d3b25777a5e30.png دکمه در نوار ابزار. این باعث می‌شود عملیات درخواست همگام‌سازی آغاز شود تا دستیار، داده‌های پاسخ SYNC به‌روزرسانی‌شده را دریافت کند.

bf4f6a866160a982.png

۵. پیکربندی تحویل محلی

در این بخش، گزینه‌های پیکربندی لازم برای انجام سفارش محلی را به ادغام Cloud-to-cloud خود اضافه خواهید کرد. در طول توسعه، برنامه‌ی انجام سفارش محلی را در Firebase Hosting منتشر خواهید کرد، جایی که دستگاه Google Home می‌تواند به آن دسترسی داشته باشد و آن را دانلود کند.

در کنسول توسعه‌دهندگان گوگل هوم ، به مسیر Project > Cloud-to-cloud در سمت چپ صفحه بروید، سپس برای ادغام، گزینه Edit را انتخاب کنید. در صفحه Setup and configuration ، به Local completion بروید و گزینه تنظیمات را فعال کنید. آدرس اینترنتی زیر را در هر فیلد Test URL وارد کنید، شناسه پروژه خود را وارد کنید و روی Save کلیک کنید:

https://<project-id>.web.app/local-home/index.html

تکمیل-محلی.png

در مرحله بعد، باید تعریف کنیم که دستگاه گوگل هوم چگونه باید دستگاه‌های هوشمند محلی را کشف کند . پلتفرم Local Home از چندین پروتکل برای کشف دستگاه، از جمله mDNS، UPnP و پخش UDP پشتیبانی می‌کند. شما از پخش UDP برای کشف ماشین لباسشویی هوشمند استفاده خواهید کرد.

برای افزودن پیکربندی اسکن جدید، در زیر بخش Device discovery روی +Add scan configuration کلیک کنید. پروتکل UDP را انتخاب کنید و ویژگی‌های زیر را وارد کنید:

میدان

توضیحات

مقدار پیشنهادی

آدرس دیسکاوری

آدرس کشف UDP

255.255.255.255

پورت پخش

پورتی که گوگل هوم پخش UDP را از آنجا ارسال می‌کند

3311

پورت شنود

پورتی که گوگل هوم در آن منتظر پاسخ می‌ماند

3312

بسته اکتشافی

بار داده پخش UDP

48656c6c6f4c6f63616c486f6d6553444b

کشف-دستگاه.png

در نهایت، برای ذخیره تغییرات، روی گزینه ذخیره در پایین پنجره کلیک کنید.

۶. اجرای عملیات تکمیل سفارشات محلی

شما برنامه‌ی تحویل سفارش محلی خود را در TypeScript با استفاده از پکیج تایپینگ Local Home SDK توسعه خواهید داد. به اسکلت ارائه شده در پروژه‌ی آغازین نگاه کنید:

فایل محلی/index.ts

/// <reference types="@google/local-home-sdk" />

import App = smarthome.App;
import Constants = smarthome.Constants;
import DataFlow = smarthome.DataFlow;
import Execute = smarthome.Execute;
import Intents = smarthome.Intents;
import IntentFlow = smarthome.IntentFlow;

...

class LocalExecutionApp {

  constructor(private readonly app: App) { }

  identifyHandler(request: IntentFlow.IdentifyRequest):
      Promise<IntentFlow.IdentifyResponse> {
    // TODO: Implement device identification
  }

  executeHandler(request: IntentFlow.ExecuteRequest):
      Promise<IntentFlow.ExecuteResponse> {
    // TODO: Implement local fulfillment
  }

  ...
}

const localHomeSdk = new App('1.0.0');
const localApp = new LocalExecutionApp(localHomeSdk);
localHomeSdk
  .onIdentify(localApp.identifyHandler.bind(localApp))
  .onExecute(localApp.executeHandler.bind(localApp))
  .listen()
  .then(() => console.log('Ready'))
  .catch((e: Error) => console.error(e));

جزء اصلی تحقق محلی، کلاس smarthome.App است. پروژه اولیه، هندلرهایی را برای اهداف IDENTIFY و EXECUTE ضمیمه می‌کند، سپس متد listen() را فراخوانی می‌کند تا به SDK محلی Home اطلاع دهد که برنامه آماده است.

اضافه کردن هندلر IDENTIFY

کیت توسعه نرم‌افزاری محلی هوم (Local Home SDK) زمانی که دستگاه گوگل هوم (Google Home) بر اساس پیکربندی اسکن ارائه شده در کنسول توسعه‌دهندگان، دستگاه‌های تأیید نشده‌ای را در شبکه محلی پیدا می‌کند، هندلر IDENTIFY شما را فعال می‌کند.

در همین حال، پلتفرم هنگامی که گوگل دستگاه منطبقی را پیدا می‌کند، identifyHandler را با داده‌های اسکن حاصل فراخوانی می‌کند. در برنامه شما، اسکن با استفاده از یک پخش UDP انجام می‌شود و داده‌های اسکن ارائه شده به IDENTIFY شامل بار داده پاسخ ارسال شده توسط دستگاه محلی است.

این هندلر یک نمونه IdentifyResponse را برمی‌گرداند که حاوی یک شناسه منحصر به فرد برای دستگاه محلی است. کد زیر را به متد identifyHandler خود اضافه کنید تا پاسخ UDP دریافتی از دستگاه محلی را پردازش کرده و شناسه دستگاه محلی مناسب را تعیین کند:

فایل .ts محلی/ایندکس

identifyHandler(request: IntentFlow.IdentifyRequest):
    Promise<IntentFlow.IdentifyResponse> {
  console.log("IDENTIFY intent: " + JSON.stringify(request, null, 2));

  const scanData = request.inputs[0].payload.device.udpScanData;
  if (!scanData) {
    const err = new IntentFlow.HandlerError(request.requestId,
        'invalid_request', 'Invalid scan data');
    return Promise.reject(err);
  }

  // In this codelab, the scan data contains only local device ID.
  const localDeviceId = Buffer.from(scanData.data, 'hex');

  const response: IntentFlow.IdentifyResponse = {
    intent: Intents.IDENTIFY,
    requestId: request.requestId,
    payload: {
      device: {
        id: 'washer',
        verificationId: localDeviceId.toString(),
      }
    }
  };
  console.log("IDENTIFY response: " + JSON.stringify(response, null, 2));

  return Promise.resolve(response);
}

توجه داشته باشید که فیلد verificationId باید با یکی از مقادیر otherDeviceIds در پاسخ SYNC شما مطابقت داشته باشد، که دستگاه را به عنوان موجود برای انجام محلی در نمودار صفحه اصلی کاربر علامت گذاری می‌کند. پس از اینکه گوگل یک تطابق پیدا کرد، آن دستگاه تأیید شده و آماده برای انجام محلی در نظر گرفته می‌شود.

اضافه کردن کنترل کننده EXECUTE

SDK محلی Home، زمانی که دستگاهی که از اجرای محلی پشتیبانی می‌کند، دستوری را دریافت می‌کند، کنترل‌کننده‌ی EXECUTE شما را فعال می‌کند. محتوای هدف محلی معادل هدف EXECUTE ارسال شده به اجرای ابری شما است، بنابراین منطق پردازش محلی هدف شبیه نحوه‌ی مدیریت آن در ابر است. اقدامات

این برنامه می‌تواند از سوکت‌های TCP/UDP یا درخواست‌های HTTP(S) برای ارتباط با دستگاه‌های محلی استفاده کند. در این آزمایشگاه کد، HTTP به عنوان پروتکل مورد استفاده برای کنترل دستگاه مجازی عمل می‌کند. شماره پورت در index.ts به عنوان متغیر SERVER_PORT تعریف شده است.

کد زیر را به متد executeHandler خود اضافه کنید تا دستورات ورودی را پردازش کرده و آنها را از طریق HTTP به دستگاه محلی ارسال کند:

فایل محلی/index.ts

executeHandler(request: IntentFlow.ExecuteRequest):
    Promise<IntentFlow.ExecuteResponse> {
  console.log("EXECUTE intent: " + JSON.stringify(request, null, 2));

  const command = request.inputs[0].payload.commands[0];
  const execution = command.execution[0];
  const response = new Execute.Response.Builder()
    .setRequestId(request.requestId);

  const promises: Array<Promise<void>> = command.devices.map((device) => {
    console.log("Handling EXECUTE intent for device: " + JSON.stringify(device));

    // Convert execution params to a string for the local device
    const params = execution.params as IWasherParams;
    const payload = this.getDataForCommand(execution.command, params);

    // Create a command to send over the local network
    const radioCommand = new DataFlow.HttpRequestData();
    radioCommand.requestId = request.requestId;
    radioCommand.deviceId = device.id;
    radioCommand.data = JSON.stringify(payload);
    radioCommand.dataType = 'application/json';
    radioCommand.port = SERVER_PORT;
    radioCommand.method = Constants.HttpOperation.POST;
    radioCommand.isSecure = false;

    console.log("Sending request to the smart home device:", payload);

    return this.app.getDeviceManager()
      .send(radioCommand)
      .then(() => {
        const state = {online: true};
        response.setSuccessState(device.id, Object.assign(state, params));
        console.log(`Command successfully sent to ${device.id}`);
      })
      .catch((e: IntentFlow.HandlerError) => {
        e.errorCode = e.errorCode || 'invalid_request';
        response.setErrorState(device.id, e.errorCode);
        console.error('An error occurred sending the command', e.errorCode);
      });
  });

  return Promise.all(promises)
    .then(() => {
      return response.build();
    })
    .catch((e) => {
      const err = new IntentFlow.HandlerError(request.requestId,
          'invalid_request', e.message);
      return Promise.reject(err);
    });
}

کامپایل کردن برنامه TypeScript

به دایرکتوری local/ بروید و دستورات زیر را برای دانلود کامپایلر TypeScript و کامپایل برنامه اجرا کنید:

cd local
npm install
npm run build

این کد منبع index.ts (TypeScript) را کامپایل می‌کند و محتوای زیر را در دایرکتوری public/local-home/ قرار می‌دهد:

  • bundle.js — خروجی جاوا اسکریپت کامپایل شده حاوی برنامه محلی و وابستگی‌ها.
  • index.html — صفحه میزبانی محلی که برای ارائه برنامه جهت آزمایش روی دستگاه استفاده می‌شود.

پروژه آزمایشی را مستقر کنید

فایل‌های پروژه به‌روزرسانی‌شده را در Firebase Hosting مستقر کنید تا بتوانید از طریق دستگاه Google Home به آنها دسترسی داشته باشید.

firebase deploy --only hosting

۷. ماشین لباسشویی هوشمند را روشن کنید

حالا وقت آن رسیده که ارتباط بین برنامه‌ی محلی ارسال سفارش و ماشین لباسشویی هوشمند را آزمایش کنید! پروژه‌ی اولیه‌ی codelab شامل یک ماشین لباسشویی هوشمند مجازی - نوشته شده با Node.js - است که یک ماشین لباسشویی هوشمند را شبیه‌سازی می‌کند و کاربران می‌توانند آن را به صورت محلی کنترل کنند.

دستگاه را پیکربندی کنید

شما باید دستگاه مجازی را طوری پیکربندی کنید که از همان پارامترهای UDP که برای پیکربندی اسکن برای کشف دستگاه در کنسول توسعه‌دهندگان اعمال کرده‌اید، استفاده کند. علاوه بر این، باید به دستگاه مجازی بگویید که کدام شناسه دستگاه محلی را گزارش دهد و شناسه پروژه ادغام ابر به ابر را برای گزارش رویدادهای وضعیت هنگام تغییر وضعیت دستگاه استفاده کند.

پارامتر

مقدار پیشنهادی

شناسه دستگاه

deviceid123

کشفپورت‌اوت

3311

کشف بسته

HelloLocalHomeSDK

شناسه پروژه

شناسه پروژه ادغام ابر به ابر شما

دستگاه را روشن کنید

به دایرکتوری virtual-device/ بروید و اسکریپت دستگاه را اجرا کنید و پارامترهای پیکربندی را به عنوان آرگومان ارسال کنید:

cd virtual-device
npm install
npm start -- \
  --deviceId=deviceid123 --projectId=<project-id> \
  --discoveryPortOut=3311 --discoveryPacket=HelloLocalHomeSDK

تأیید کنید که اسکریپت دستگاه با پارامترهای مورد انتظار اجرا می‌شود:

(...): UDP Server listening on 3311
(...): Device listening on port 3388
(...): Report State successful

۸. اشکال‌زدایی برنامه TypeScript

در بخش بعدی، تأیید خواهید کرد که دستگاه Google Home می‌تواند به درستی ماشین لباسشویی هوشمند مجازی را از طریق شبکه محلی اسکن، شناسایی و ارسال کند. می‌توانید از ابزارهای توسعه‌دهنده Google Chrome برای اتصال به دستگاه Google Home، مشاهده گزارش‌های کنسول و اشکال‌زدایی برنامه TypeScript استفاده کنید.

ابزارهای توسعه‌دهنده کروم را متصل کنید

برای اتصال دیباگر به برنامه‌ی محلی خود، این مراحل را دنبال کنید:

  1. مطمئن شوید که دستگاه گوگل هوم خود را به کاربری که اجازه دسترسی به پروژه کنسول توسعه‌دهندگان را دارد، متصل کرده‌اید.
  2. دستگاه گوگل هوم خود را مجدداً راه‌اندازی کنید، که به آن امکان می‌دهد URL مربوط به HTML شما و همچنین پیکربندی اسکنی را که در کنسول توسعه‌دهندگان قرار داده‌اید، دریافت کند.
  3. کروم را روی دستگاه توسعه‌دهنده خود اجرا کنید.
  4. یک تب جدید کروم باز کنید و در قسمت آدرس عبارت chrome://inspect وارد کنید تا ابزار Inspector اجرا شود.

شما باید لیستی از دستگاه‌ها را در صفحه مشاهده کنید و آدرس اینترنتی برنامه شما باید زیر نام دستگاه Google Home شما ظاهر شود.

567f97789a7d8846.png

بازرس را راه اندازی کنید

برای اجرای ابزارهای توسعه‌دهنده کروم، روی Inspect در زیر URL برنامه خود کلیک کنید. تب Console را انتخاب کنید و تأیید کنید که می‌توانید محتوای IDENTIFY intent چاپ شده توسط برنامه TypeScript خود را ببینید.

6b67ded470a4c8be.png

این خروجی به این معنی است که برنامه‌ی محلی شما با موفقیت دستگاه مجازی را کشف و شناسایی کرده است.

تست تکمیل سفارشات محلی

با استفاده از کنترل‌های لمسی در برنامه Google Home یا از طریق دستورات صوتی به دستگاه Google Home، دستوراتی را به دستگاه خود ارسال کنید، مانند:

«هی گوگل، ماشین لباسشویی من را روشن کن.»

«هی گوگل، ماشین لباسشویی من را روشن کن.»

«هی گوگل، ماشین لباسشویی من را خاموش کن.»

این باید باعث شود که پلتفرم یک هدف EXECUTE را به برنامه TypeScript شما ارسال کند.

bc030517dacc3ac9.png

تأیید کنید که می‌توانید تغییر وضعیت ماشین لباسشویی هوشمند محلی را با هر دستور مشاهده کنید.

...
***** The washer is RUNNING *****
...
***** The washer is STOPPED *****

۹. تبریک

764dbc83b95782a.png

تبریک می‌گویم! شما از کیت توسعه نرم‌افزار محلی (Local Home SDK) برای ادغام عملیات تحویل محلی در یکپارچه‌سازی ابر به ابر استفاده کردید.

بیشتر بدانید

در اینجا چند مورد اضافی وجود دارد که می‌توانید امتحان کنید:

  • پیکربندی اسکن را تغییر دهید و آن را فعال کنید. برای مثال، سعی کنید از یک پورت UDP یا بسته اکتشافی متفاوت استفاده کنید.
  • کدبیس دستگاه هوشمند مجازی را برای اجرا روی یک دستگاه تعبیه‌شده - مانند رزبری پای - تغییر دهید و از LEDها یا یک نمایشگر برای نمایش وضعیت فعلی استفاده کنید.