You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Amazon Alexa技能开发:如何获取设备名称/类型用于数据分析

获取Alexa设备类型及相关信息的实用方案

我刚好做过类似的需求,分享一下实际可行的实现方法,完全能满足你获取设备名称、型号、制造商这类信息用于数据分析的需求~

核心思路:结合Skill请求Payload和Alexa Device Address API

其实不用额外绕弯,Alexa本身就提供了两种途径来获取设备信息:一是每次技能触发时的请求自带基础标识,二是通过官方API获取更详细的设备属性。

1. 从Skill请求Payload里先挖基础信息

每次用户触发你的技能,Alexa都会给你的Webhook发一个JSON请求,里面的context.System.device字段藏着不少有用信息:

  • deviceId:设备的唯一标识
  • supportedInterfaces:设备支持的接口,能帮你快速推测设备类型

举个实际的请求片段例子:

{
  "context": {
    "System": {
      "device": {
        "deviceId": "amzn1.ask.device.[你的设备唯一ID]",
        "supportedInterfaces": {
          "Alexa.Presentation.APL": {},
          "Alexa.Video": {}
        }
      }
    }
  }
}

简单解读一下:

  • 带有Alexa.Presentation.APL接口的,肯定是带屏幕的设备(比如Echo Show、Spot)
  • 带有Alexa.Video接口的,大概率是Fire TV这类视频设备
  • 如果只有Alexa.Speaker这类基础接口,那就是普通的Echo、Dot这类无屏音箱

2. 调用Device Address API拿精准的设备详情

要拿到具体型号(比如Echo Dot 3代)、制造商、用户自定义设备名称这类精准信息,就得用Alexa的Device Address API里的getDeviceInfo接口。不过这里有两个前提:

  • 先在Alexa开发者控制台的「技能权限」里开启「Device Address」权限
  • 必须获得用户的授权(技能启动时可以引导用户授权,比如用话术:"为了给你提供更贴合的服务,麻烦允许我获取你的设备信息哦")

给你一个Node.js的调用示例,其他语言逻辑类似:

const axios = require('axios');

// 封装获取设备信息的函数
async function fetchAlexaDeviceDetails(apiAccessToken, deviceId) {
  const apiUrl = `https://api.amazonalexa.com/v1/devices/${deviceId}/info`;
  try {
    const response = await axios.get(apiUrl, {
      headers: {
        'Authorization': `Bearer ${apiAccessToken}`
      }
    });
    return response.data;
  } catch (err) {
    console.log('获取设备信息失败:', err);
    return null;
  }
}

调用后返回的响应里,你会看到这些关键字段:

  • deviceName:用户给设备起的自定义名称(比如"卧室音箱")
  • manufacturerName:设备制造商(比如Amazon、Eufy)
  • deviceType:设备的具体型号(比如"Echo Dot (3rd Generation)"、"Eufy Genie"、"Fire TV Stick 4K")

3. 自定义映射表适配你的分类需求

如果API返回的deviceType太冗长(比如带了代次),你可以自己做个映射表,把它转换成你需要的分类(比如Dot、Show、Fire TV这类):

const deviceCategoryMap = {
  'Echo Dot': 'Dot',
  'Echo Dot (3rd Generation)': 'Dot',
  'Echo Show 5': 'Show',
  'Echo Spot': 'Spot',
  'Echo Plus': 'Echo Plus',
  'Fire TV Stick 4K': 'Fire TV',
  'Eufy Genie': 'Eufy Genie',
  'Alexa App': 'Alexa App'
};

// 使用示例
const deviceDetails = await fetchAlexaDeviceDetails(apiToken, deviceId);
const targetCategory = deviceCategoryMap[deviceDetails.deviceType] || '其他设备';

一些注意点

  • 如果用户拒绝授权,你就只能靠supportedInterfaces来推测设备类型了,虽然不如API精准,但也能满足基础分类需求
  • 第三方设备(比如Eufy Genie)的deviceType会直接返回其型号,不用额外处理
  • 一定要记得在技能里处理授权失败的情况,别让流程卡壳

内容的提问来源于stack exchange,提问作者Patrick Jackson

火山引擎 最新活动