ساخت یک برنامه کاربردی وب دسترسی به دستگاه

1. مقدمه

برنامه Device Access، Smart Device Management API، یک API REST را برای توسعه دهندگان فراهم می کند تا دستگاه های Google Nest را از برنامه های خود کنترل کنند. کاربران باید برای دسترسی شخص ثالث به دستگاه‌های Nest خود رضایت دهند.

52f77aa38cda13a6.png

سه مرحله کلیدی برای ادغام موفقیت آمیز دسترسی به دستگاه وجود دارد:

  1. ایجاد پروژه - یک پروژه در Google Cloud Platform ایجاد کنید و به عنوان یک توسعه دهنده در Device Access Console ثبت نام کنید.
  2. پیوند حساب - کاربران را از طریق جریان پیوند حساب دریافت کنید و یک کد دسترسی را بازیابی کنید. کد را با یک نشانه دسترسی مبادله کنید.
  3. کنترل دستگاه - درخواست های API مدیریت دستگاه هوشمند را برای کنترل دستگاه ها با ارسال دستورات با نشانه دسترسی ایجاد کنید.

در این Codelab ما با ساختن یک برنامه کاربردی وب که احراز هویت را انجام می دهد و تماس های API مدیریت دستگاه هوشمند را انجام می دهد، نحوه عملکرد Device Access را بررسی خواهیم کرد. همچنین به بررسی استقرار یک سرور پراکسی ساده با استفاده از Node.js و Express برای مسیریابی درخواست‌های Device Access خواهیم پرداخت.

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

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

  • Node.js 8 یا بالاتر
  • حساب Google با Nest Thermostat مرتبط

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

  • راه اندازی یک پروژه Firebase میزبان صفحات وب استاتیک و عملکردهای ابری
  • صدور درخواست دسترسی دستگاه از طریق یک برنامه وب مبتنی بر مرورگر
  • ساخت یک سرور پروکسی با Node.js و Express برای مسیریابی درخواست های شما

2. ایجاد پروژه

توسعه‌دهندگان باید یک پروژه Google Cloud Platform (GCP) برای راه‌اندازی یکپارچه‌سازی دسترسی به دستگاه ایجاد کنند. یک Client ID و Client Secret ایجاد شده در پروژه GCP به عنوان بخشی از جریان OAuth بین برنامه برنامه‌نویس و Google Cloud استفاده می‌شود. توسعه دهندگان همچنین برای ایجاد پروژه ای برای دسترسی به Smart Device Management API باید از Device Access Console بازدید کنند.

Google Cloud Platform

به Google Cloud Platform بروید. روی ایجاد پروژه جدید کلیک کنید و نام پروژه را وارد کنید. شناسه پروژه [GCP-Project-Id] برای Google Cloud نیز نمایش داده می‌شود، لطفاً آن را ضبط کنید، زیرا در طول راه‌اندازی Firebase از آن استفاده خواهیم کرد. (ما در سراسر این Codelab به این شناسه به عنوان [GCP-Project-Id] اشاره خواهیم کرد.)

585e926b21994ac9.png

اولین قدم این است که کتابخانه API لازم را در پروژه خود فعال کنیم. به APIs & Services > Library بروید و Smart Device Management API را جستجو کنید. شما باید این API را فعال کنید تا به پروژه شما اجازه دهد تا برای تماس های API دسترسی به دستگاه درخواست کند.

14e7eabc422c7fda.png

قبل از اینکه به سمت ایجاد اعتبارنامه OAuth برویم، باید صفحه رضایت OAuth را برای پروژه خود پیکربندی کنیم. به APIs & Services > صفحه رضایت OAuth بروید. برای نوع کاربر ، خارجی را انتخاب کنید. یک نام و یک ایمیل پشتیبانی برای برنامه خود و همچنین اطلاعات تماس برنامه‌نویس برای تکمیل صفحه اول ارائه دهید. وقتی از کاربران آزمایشی درخواست می‌شود، مطمئن شوید که آدرس ایمیل دستگاه‌های مرتبط را در این مرحله ارائه کرده‌اید.

هنگامی که صفحه رضایت OAuth خود را پیکربندی کردید، به APIs & Services > Credentials بروید. روی +Create Credentials کلیک کنید و OAuth Client ID را انتخاب کنید. برای نوع برنامه، Web application را انتخاب کنید.

5de534212d44fce7.png

یک نام برای مشتری خود وارد کنید و روی CREATE کلیک کنید. بعداً یک مبدا جاوا اسکریپت مجاز و URI تغییر مسیر مجاز را اضافه خواهیم کرد. با تکمیل این فرآیند ، [Client-Id] و [Client-Secret] مرتبط با این OAuth 2.0 Client ظاهر می شود.

e6a670da18952f08.png

کنسول دسترسی به دستگاه

به کنسول دسترسی دستگاه بروید. اگر قبلاً از Device Access Console استفاده نکرده‌اید، با توافقنامه شرایط خدمات و هزینه ثبت نام 5 دلار از شما استقبال می‌شود.

یک پروژه جدید ایجاد کنید و به آن نام پروژه بدهید. در پنجره بعدی، [Client-Id] را که در مرحله قبل از GCP دریافت کردید، ارائه کنید.

f8a3f27354bc2625.png

فعال کردن رویدادها و تکمیل مراحل ایجاد پروژه شما را به صفحه اصلی پروژه خود می برد. [Project-Id] شما تحت نامی که به پروژه خود داده اید فهرست می شود.

db7ba33d8b707148.png

لطفاً به [Project-Id] خود توجه کنید زیرا ما از آن هنگام ارسال درخواست به API مدیریت دستگاه هوشمند استفاده خواهیم کرد.

3. راه اندازی Firebase

Firebase به توسعه دهندگان یک راه سریع و آسان برای استقرار برنامه های کاربردی وب ارائه می دهد. ما در حال توسعه یک برنامه وب سمت کلاینت برای ادغام دسترسی به دستگاه خود با استفاده از Firebase خواهیم بود.

یک پروژه Firebase ایجاد کنید

به کنسول Firebase بروید. روی افزودن پروژه کلیک کنید، سپس پروژه ای را که در مرحله ایجاد پروژه ایجاد کرده اید انتخاب کنید. با این کار یک پروژه Firebase ایجاد می شود که به پروژه GCP شما [GCP-Project-Id] مرتبط می شود.

هنگامی که پروژه Firebase با موفقیت ایجاد شد، باید صفحه زیر را مشاهده کنید:

dbb02bbacac093f5.png

Firebase Tools را نصب کنید

Firebase مجموعه ای از ابزارهای CLI را برای ساخت و استقرار برنامه شما فراهم می کند. برای نصب این ابزارها، یک پنجره ترمینال جدید باز کنید و دستور زیر را اجرا کنید. این ابزار Firebase را به صورت جهانی نصب می کند.

$ npm i -g firebase-tools

برای تأیید اینکه ابزارهای firebase به درستی نصب شده اند، اطلاعات نسخه را بررسی کنید.

$ firebase --version

می توانید با استفاده از فرمان ورود به سیستم با حساب Google خود وارد ابزار Firebase CLI شوید.

$ firebase login

پروژه میزبانی را راه اندازی کنید

هنگامی که بتوانید وارد سیستم شوید، گام بعدی این است که یک پروژه میزبانی را برای برنامه وب خود راه اندازی کنید. از ترمینال، به پوشه ای که می خواهید پروژه خود را ایجاد کنید بروید و دستور زیر را اجرا کنید:

$ firebase init hosting

Firebase مجموعه ای از سوالات را برای شروع پروژه میزبانی از شما می پرسد:

  1. لطفاً یک گزینه را انتخاب کنید — از یک پروژه موجود استفاده کنید
  2. یک پروژه Firebase پیش فرض را برای این فهرست انتخاب کنید — ***[GCP-Project-Id]*** را انتخاب کنید
  3. چه چیزی را می خواهید به عنوان فهرست عمومی خود استفاده کنید؟ - عمومی
  4. به عنوان یک برنامه تک صفحه پیکربندی شود؟ - بله
  5. ساخت و استقرار خودکار با GitHub تنظیم شود؟ - نه

هنگامی که پروژه شما مقداردهی اولیه شد، می توانید با دستور زیر آن را در firebase مستقر کنید:

$ firebase deploy

Firebase پروژه شما را اسکن می کند و فایل های لازم را در هاست ابری مستقر می کند.

fe15cf75e985e9a1.png

وقتی URL میزبانی را در یک مرورگر باز می کنید، باید صفحه ای را که به تازگی مستقر کرده اید ببینید:

e40871238c22ebe2.png

اکنون که اصول اولیه نحوه استقرار یک صفحه وب با Firebase را می دانید، بیایید به استقرار نمونه Codelab خود بپردازیم!

4. نمونه Codelab

با استفاده از دستور زیر می توانید مخزن codelab میزبانی شده در GitHub را کلون کنید:

$ git clone https://github.com/google/device-access-codelab-web-app.git

در این مخزن نمونه ها را در دو پوشه جداگانه ارائه می کنیم. پوشه codelab-start دارای فایل های لازم برای شروع شما از نقطه فعلی در این Codelab است. پوشه codelab-done شامل نسخه کامل این Codelab با سرویس گیرنده و node.js کاملاً کاربردی است.

ما از فایل‌های پوشه codelab-start در سراسر این کد لبه استفاده خواهیم کرد، هرچند اگر در هر زمان احساس کردید که گیر کرده‌اید، به نسخه انجام شده Codelab نیز مراجعه کنید.

فایل های نمونه Codelab

ساختار فایل پوشه codelab-start به شرح زیر است:

public
├───index.html
├───scripts.js
├───style.css
firebase.json

پوشه عمومی حاوی صفحات ثابت برنامه ما است. firebase.json مسئول مسیریابی درخواست های وب به برنامه ما است. در نسخه codelab-done ، یک دایرکتوری functions نیز مشاهده خواهید کرد که حاوی منطق برای سرور پراکسی ما (express) است که در توابع Google Cloud مستقر می شود.

نمونه Codelab را مستقر کنید

فایل ها را از codelab-start در دایرکتوری پروژه خود کپی کنید.

$ firebase deploy

پس از اتمام استقرار Firebase، باید بتوانید برنامه Codelab را ببینید:

e84c1049eb4cca92.png

راه‌اندازی جریان احراز هویت به اعتبار شریک نیاز دارد که در بخش بعدی به آن خواهیم پرداخت.

5. مدیریت OAuth

OAuth استاندارد وب برای تفویض اختیار است که معمولاً برای کاربران استفاده می شود تا به برنامه های شخص ثالث اجازه دسترسی به اطلاعات حساب خود را بدون اشتراک گذاری رمز عبور بدهند. ما از OAuth 2.0 استفاده می کنیم تا توسعه دهندگان بتوانند از طریق Device Access به دستگاه های کاربر دسترسی داشته باشند.

7ee31f5d9c37f699.png

Redirect URI را مشخص کنید

اولین مرحله از جریان OAuth شامل ارسال مجموعه ای از پارامترها به نقطه پایانی Google OAuth 2.0 است. پس از دریافت رضایت کاربر، سرورهای Google OAuth درخواستی با کد مجوز به URI تغییر مسیر شما صادر می کنند.

ثابت SERVER_URI (خط 19) را با URL میزبانی خود در scripts.js به روز کنید:

const SERVER_URI = "https://[GCP-Project-Id].web.app";

استقرار مجدد برنامه با این تغییر URI تغییر مسیر مورد استفاده برای پروژه شما را به روز می کند.

$ firebase deploy

Redirect URI را فعال کنید

هنگامی که Redirect URI را در فایل اسکریپت به روز کردید، باید آن را نیز به لیست URI های مجاز تغییر مسیر برای Client ID که برای پروژه خود ایجاد کرده اید اضافه کنید. به صفحه اعتبارنامه ها در Google Cloud Platform بروید، که تمام اعتبارنامه های ایجاد شده برای پروژه شما را فهرست می کند:

1a07b624b5e548da.png

در لیست OAuth 2.0 Client IDs ، شناسه مشتری را که در مرحله ایجاد پروژه ایجاد کرده اید، انتخاب کنید. URI تغییر مسیر برنامه خود را به لیست URIهای مجاز تغییر مسیر پروژه خود اضافه کنید.

6d65b298e1f005e2.png

ورود به سیستم را امتحان کنید!

به URL میزبانی که با Firebase تنظیم کرده اید بروید، اعتبار شریک خود را وارد کنید و روی دکمه SIGN IN کلیک کنید. شناسه مشتری و Client Secret اعتبارنامه هایی هستند که از Google Cloud Platform به دست آورده اید، شناسه پروژه از کنسول دسترسی دستگاه است.

78b48906a2dd7c05.png

دکمه SIGN IN کاربران شما را از طریق جریان OAuth برای شرکت شما هدایت می کند و از صفحه ورود به حساب Google آنها شروع می شود. پس از ورود به سیستم، از کاربران خواسته می‌شود مجوزهایی را برای پروژه شما برای دسترسی به دستگاه‌های Nest خود ارائه دهند.

e9b7887c4ca420.png

از آنجایی که این یک برنامه ساختگی است، گوگل قبل از صدور یک تغییر مسیر، هشداری را صادر می کند!

b227d510cb1df073.png

روی «پیشرفته» کلیک کنید، سپس «برو به web.app (ناامن)» را انتخاب کنید تا تغییر مسیر به برنامه خود کامل شود.

673a4fd217e24dad.png

این یک کد OAuth را به عنوان بخشی از درخواست دریافتی GET ارائه می دهد، که سپس برنامه آن را با یک رمز دسترسی و یک توکن تازه سازی مبادله می کند.

6. کنترل دستگاه

برنامه نمونه دسترسی به دستگاه از تماس‌های API REST مدیریت دستگاه هوشمند برای کنترل دستگاه‌های Google Nest استفاده می‌کند. این تماس‌ها شامل ارسال توکن دسترسی در هدر درخواست GET یا POST، همراه با بار مورد نیاز برای دستورات خاص است.

ما یک تابع درخواست دسترسی عمومی برای رسیدگی به این تماس ها نوشتیم. با این حال، شما باید نقطه پایانی صحیح و همچنین شی payload را در صورت نیاز برای این تابع ارائه دهید!

function deviceAccessRequest(method, call, localpath, payload = null) {...}
  • روش - نوع درخواست HTTP ( GET یا POST)
  • تماس - رشته ای که نشان دهنده تماس API ما است که برای مسیریابی پاسخ ها استفاده می شود ( listDevices ، thermostatMode ، temperatureSetpoint )
  • localpath - نقطه پایانی که درخواست به آن ارسال می‌شود، حاوی شناسه پروژه و شناسه دستگاه (ضمیمه شده پس از https://smartdevicemanagement.googleapis.com/v1 )
  • محموله (*) - داده های اضافی مورد نیاز برای فراخوانی API (به عنوان مثال، یک مقدار عددی نشان دهنده دما برای یک نقطه تنظیم)

نمونه‌ای از کنترل‌های رابط کاربری (فهرست دستگاه‌ها، حالت تنظیم، تنظیم دما) را برای کنترل یک ترموستات Nest می‌سازیم:

86f8a193aa397421.png

این کنترل‌های رابط کاربری، توابع مربوطه ( listDevices() ، postThermostatMode() ، postTemperatureSetpoint() ) را از scripts.js فراخوانی می‌کنند. آنها برای شما خالی مانده اند تا آنها را اجرا کنید! هدف انتخاب روش/مسیر صحیح و ارسال بار به تابع deviceAccessRequest(...) است.

لیست دستگاه ها

ساده ترین تماس دسترسی به دستگاه، listDevices است. از یک درخواست GET استفاده می کند و نیازی به بارگذاری ندارد. نقطه پایانی باید با استفاده از projectId ساختار یابد. تابع listDevices() خود را به صورت زیر تکمیل کنید:

function listDevices() {
  var endpoint = "/enterprises/" + projectId + "/devices";
  deviceAccessRequest('GET', 'listDevices', endpoint);
}

تغییرات خود را ذخیره کنید و پروژه Firebase خود را دوباره با دستور زیر مستقر کنید:

$ firebase deploy

وقتی نسخه جدید برنامه اجرا شد، صفحه را دوباره بارگیری کنید و روی فهرست دستگاه‌ها کلیک کنید. این باید لیستی را در قسمت کنترل دستگاه پر کند، که باید شناسه ترموستات خود را ببینید:

b64a198673ed289f.png

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

کنترل ترموستات

دو ویژگی برای کنترل اساسی Nest Thermostat در Smart Device Management API وجود دارد. ThermostatMode و TemperatureSetpoint . ThermostatMode حالت را برای Nest Thermostat شما روی یکی از چهار حالت مختلف ممکن تنظیم می‌کند: {خاموش، گرما، خنک، گرما خنک}. سپس باید حالت انتخاب شده را به عنوان بخشی از محموله ارائه کنیم.

تابع postThermostatMode() خود را در scripts.js با موارد زیر جایگزین کنید:

function postThermostatMode() {
  var endpoint = "/enterprises/" + projectId + "/devices/" + deviceId + ":executeCommand";
  var tempMode = id("tempMode").value;
  var payload = {
    "command": "sdm.devices.commands.ThermostatMode.SetMode",
    "params": {
      "mode": tempMode
    }
  };
  deviceAccessRequest('POST', 'thermostatMode', endpoint, payload);
}

تابع بعدی، postTemperatureSetpoint() ، تنظیم دما (بر حسب سانتیگراد) را برای Nest Thermostat شما انجام می دهد. بسته به حالت انتخابی ترموستات، دو پارامتر وجود دارد که می‌توان در محموله تنظیم کرد، heatCelsius و coolCelsius .

function postTemperatureSetpoint() {
  var endpoint = "/enterprises/" + projectId + "/devices/" + deviceId + ":executeCommand";
  var heatCelsius = parseFloat(id("heatCelsius").value);
  var coolCelsius = parseFloat(id("coolCelsius").value);

  var payload = {
    "command": "",
    "params": {}
  };
  
  if ("HEAT" === id("tempMode").value) {
    payload.command = "sdm.devices.commands.ThermostatTemperatureSetpoint.SetHeat";
    payload.params["heatCelsius"] = heatCelsius;
  }
  else if ("COOL" === id("tempMode").value) {
    payload.command = "sdm.devices.commands.ThermostatTemperatureSetpoint.SetCool";
    payload.params["coolCelsius"] = coolCelsius;
  }
  else if ("HEATCOOL" === id("tempMode").value) {
    payload.command = "sdm.devices.commands.ThermostatTemperatureSetpoint.SetRange";
    payload.params["heatCelsius"] = heatCelsius;
    payload.params["coolCelsius"] = coolCelsius;
  } else {
    console.log("Off and Eco mode don't allow this function");
    return;
  }
  deviceAccessRequest('POST', 'temperatureSetpoint', endpoint, payload);
}

7. سرور Node.js (اختیاری)

تبریک می گویم! شما یک برنامه وب سمت کلاینت ساخته‌اید که می‌تواند درخواست‌های API مدیریت دستگاه هوشمند را از یک مرورگر انجام دهد. برای کسانی از شما که می‌خواهید در سمت سرور ایجاد کنید، می‌خواهیم تلاش خود را با یک سرور پراکسی که می‌تواند درخواست‌های شما را از مرورگر تغییر مسیر دهد، شروع کنیم.

برای این سرور پراکسی، از توابع ابری Firebase، Node.js و Express استفاده خواهیم کرد.

توابع Cloud را راه اندازی کنید

یک پنجره ترمینال جدید باز کنید، به دایرکتوری پروژه خود بروید و موارد زیر را اجرا کنید:

$ firebase init functions

Firebase از شما مجموعه ای از سوالات را برای مقداردهی اولیه توابع ابری می پرسد:

  1. دوست دارید از چه زبانی برای نوشتن توابع ابری استفاده کنید؟ - جاوا اسکریپت
  2. آیا می خواهید از ESLint برای کشف اشکالات احتمالی و اعمال سبک استفاده کنید؟ - نه
  3. آیا اکنون می خواهید وابستگی ها را با npm نصب کنید؟ - بله

با این کار یک پوشه functions در پروژه شما راه اندازی می شود و همچنین وابستگی های لازم را نصب می کند. خواهید دید که پوشه پروژه شما شامل یک پوشه توابع است، با یک فایل index.js برای تعریف توابع ابری ما، package.json برای تعریف تنظیمات و یک فهرست node_modules برای حاوی وابستگی ها.

ما از دو کتابخانه npm برای ساخت عملکرد سمت سرور استفاده خواهیم کرد: express و xmlhttprequest. شما باید ورودی های زیر را به لیست وابستگی ها در فایل package.json اضافه کنید:

"xmlhttprequest": "^1.8.0",
"express": "^4.17.0"

سپس اجرای npm install از دایرکتوری توابع باید وابستگی هایی را برای پروژه شما نصب کند:

$ npm install

در صورتی که npm با دانلود بسته‌ها مشکل داشت، می‌توانید xmlhttp request را ذخیره کرده و با دستور زیر به صراحت بیان کنید:

$ npm install express xmlhttprequest --save

به Blaze Plan ارتقا دهید

استفاده از فرمان firebase deploy شما را ملزم به ارتقاء به Blaze Plan می کند، که باید یک روش پرداخت را به حساب خود اضافه کنید. به Project Overview > Usage and billing بروید و مطمئن شوید که طرح Blaze را برای پروژه خود انتخاب کرده اید.

c6a5e5a21397bef6.png

ساخت سرور اکسپرس

یک سرور Express از یک چارچوب ساده برای پاسخگویی به درخواست‌های دریافتی GET و POST پیروی می‌کند. ما سرورلتی ساخته‌ایم که به درخواست‌های POST گوش می‌دهد، آنها را به URL مقصد مشخص‌شده در بار ارسال می‌کند و با پاسخ دریافتی از انتقال پاسخ می‌دهد.

فایل index.js خود را در پوشه توابع به شکل زیر تغییر دهید:

const XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
const functions = require('firebase-functions');
const express = require('express');
const http = require('http');

const app = express();
app.use(express.json());


//***** Device Access - Proxy Server *****//

// Serving Get Requests (Not used) 
app.get('*', (request, response) => {
  response.status(200).send("Hello World!");
});
// Serving Post Requests
app.post('*', (request, response) => {
  
  setTimeout(() => {
    // Read the destination address from payload:
    var destination = request.body.address;
    
    // Create a new proxy post request:
    var xhr = new XMLHttpRequest();
    xhr.open('POST', destination);
    
    // Add original headers to proxy request:
    for (var key in request.headers) {
            var value = request.headers[key];
      xhr.setRequestHeader(key, value);
    }
    
    // Add command/parameters to proxy request:
    var newBody = {};
    newBody.command = request.body.command;
    newBody.params = request.body.params;
    
    // Respond to original request with the response coming
    // back from proxy request (to Device Access Endpoint)
    xhr.onload = function () {
      response.status(200).send(xhr.responseText);
    };
    
    // Send the proxy request!
    xhr.send(JSON.stringify(newBody));
  }, 1000);
});

// Export our app to firebase functions:
exports.app = functions.https.onRequest(app);

برای اینکه درخواست ها را به سرور خود هدایت کنیم، باید بازنویسی ها را از firebase.json به صورت زیر تنظیم کنیم:

{
  "hosting": {
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [{
        "source": "/proxy**",
        "function": "app"
      },{
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}

با این کار URL هایی که با /proxy شروع می شوند به سرور Express ما هدایت می شوند و بقیه به index.html ما ادامه می دهند.

تماس های API پروکسی

اکنون که سرور خود را آماده کرده ایم، بیایید یک URI پروکسی در scripts.js برای مرورگر خود تعریف کنیم تا درخواست ها را به این آدرس ارسال کند:

const PROXY_URI = SERVER_URI + "/proxy";

سپس یک تابع proxyRequest scripts.js را اضافه کنید که دارای امضای مشابه تابع deviceAccessRequest(...) برای تماس های غیرمستقیم Device Access است.

function proxyRequest(method, call, localpath, payload = null) {
    var xhr = new XMLHttpRequest();
    
    // We are doing our post request to our proxy server:
    xhr.open(method, PROXY_URI);
    xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken);
    xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
    xhr.onload = function () {
      // Response is passed to deviceAccessResponse function:
      deviceAccessResponse(call, xhr.response);
    };
    
    // We are passing the device access endpoint in address field of the payload:
    payload.address = "https://smartdevicemanagement.googleapis.com/v1" + localpath;
    if ('POST' === method && payload)
        xhr.send(JSON.stringify(payload));
    else
        xhr.send();
}

آخرین مرحله جایگزینی فراخوانی های deviceAccessRequest(...) با تابع proxyRequest(...) در توابع postThermostatMode() و postTemperatureSetpoint() در scripts.js است.

برای به‌روزرسانی برنامه firebase deploy اجرا کنید.

$ firebase deploy

با این کار، اکنون یک سرور پراکسی Node.js با استفاده از Express on Cloud Functions دارید.

مجوزهای عملکرد ابر را ارائه دهید

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

از Google Cloud Platform، از منو به تب Cloud Functions بروید، سپس عملکرد ابری خود را انتخاب کنید:

461e9bae74227fc1.png

روی Permissions و سپس Add Member کلیک کنید. allUsers را در قسمت عضو جدید بنویسید و Cloud Functions > Cloud Functions Invoker را به عنوان نقش انتخاب کنید. با کلیک بر روی ذخیره یک پیام هشدار نمایش داده می شود:

3adb01644217578c.png

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

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

مراحل بعدی

به دنبال راه هایی برای گسترش تخصص خود در دسترسی به دستگاه هستید؟ برای اطلاعات بیشتر درباره کنترل سایر دستگاه‌های Nest و فرآیند صدور گواهینامه برای یادگیری مراحل عرضه محصول خود به جهان، اسناد ویژگی‌ها را بررسی کنید!

مهارت‌های خود را با برنامه نمونه برنامه کاربردی وب «دسترسی دستگاه» بیشتر کنید، جایی که تجربه Codelab خود را تقویت می‌کنید و یک برنامه کاربردی وب را برای کنترل دوربین‌های Nest، زنگ‌های در و ترموستات‌ها به کار می‌گیرید.