仿真对物联网的价值:用服务虚拟化破解Alexa

如果你和我一样,你会不断想象完全实现的物联网生态系统的未来可能性。在家庭的背景下,我想象我的汽车、GPS和Nest一起工作,以预测我的到来,并对气候控制进行适当的调整。或者是冰箱、Egg Minders和Amazon Fresh在我知道我需要鸡蛋之前,就能毫不费力地相互交流,订购鸡蛋......多么美好的未来。

其他时候,我相信物联网会带来一个荒诞的未来(正如《Wired》所描述的那样,令人扼腕叹息的细节)。

幸运的是,我们距离这种程度的互联还有一些距离。物联网发展还处于相对初级阶段,物联网开发者必须克服一些关键挑战。

似乎大家都认为环境的复杂性是一个主要的挑战,这是一个棘手的挑战,因为复杂性算是物联网世界的重点——作为一个物联网设备的开发者,我可能会集成很多下游的第三方API,而其他开发者可能会消耗我暴露的API。

在物联网需求增加之前,我们可能通过创建物理测试实验室,在API和设备的生态系统中测试我们的设备。现在,这是一个过时且昂贵的命题,而且开发人员通常无法控制来自第三方API或设备的数据(这对于边缘案例测试至关重要)。

这就是为什么服务虚拟化是解决方案的关键部分。我们可以模拟下游API并控制我们的设备正在消耗的数据,以验证集成测试期间的异常情况。

今天的例子

在这篇文章中,我将使用亚马逊Echo来演示这些功能,因为它可以成为家庭物联网生态系统的中心枢纽(也许你甚至像我一样有一个可用)。

我将首先带你完成使用AWS Lambda实现自己的Alexa技能的步骤。这个电话将允许你向Alexa询问一个邮政编码的天气状况。

然后,我们将在 Azure 中部署 Parasoft 虚拟服务,以模拟来自天气 API 的响应,进行边缘案例测试。(例如,当有雷雨或外面是101华氏度时,Alexa会说什么?)

先决条件,自己也要跟上:

  • 一个互联网连接(很明显)
  • 你自己的Amazon Echo或Echo Dot会改善体验,但你也可以使用模拟器。
  • 一个亚马逊开发者账户(https://developer.amazon.com/)和亚马逊网络服务账户(https://aws.amazon.com/)。
  • 在 https://openweathermap.org/api 注册成为开发者,即可获得 Open Weather API 的 API 密钥。
  • 一个微软账户(https://signup.live.com)以访问Microsoft Azure。
  • 对 REST API 和 JSON 有基本了解。

这将如何工作?

在第一部分中,我们将设置我们的Alexa技能和Lambda函数。

  1. 用户将对Alexa说一些话(用户的输入称为“Utterance”)。
  2. 我们的Alexa技能将把这个“Utterance”映射到一个“Intent”
  3. 我们的Alexa技能会在AWS Lambda中向我们的函数发送一个JSON请求。Lambda是亚马逊的一项强大的服务,它允许你上传一些代码,并在云端按需执行;你只需在执行的时候收取费用。在这个例子中,Lambda函数将决定如何处理我们的Intent请求,并将具有代表Alexa为用户创建响应消息的逻辑。
  4. 为了创建响应,我们的Lambda函数必须调用开放的天气API来获取当前的天气信息。

在第二部分中,我们将在Azure中部署一个Parasoft虚拟服务器。然后,我们将在 Lambda 函数和 OpenWeatherMap API 之间放置一个 Parasoft 代理。该代理将允许我们控制来自 AWS Lambda 的天气请求,流向真正的 OpenWeatherMap API 或带有罐装响应的虚拟表示。

第1部分:设置我们的Alexa技能和Lambda函数

1. 首先,我们需要确保我们在亚马逊网络服务控制台(https://console.aws.amazon.com)中处于“美国东部(弗吉尼亚州北部)”区域。目前,这是唯一可以使用Lambda的区域。

2. 让我们从创建Lambda函数开始。登录(https://console.aws.amazon.com/lambda/)并选择蓝色的“创建Lambda函数”按钮。

3. 在“选择蓝图”下选择“空白功能”,然后选择Alexa技能包作为Lambda功能的触发器。如果你在列表中没有看到“Alexa Skills Kit”,那么你可能不在“美东(北弗吉尼亚)”地区。

 

这里发生了什么?我们必须指定我们的Lambda函数的调用方式,Alexa技能套件将允许Alexa启动它(一旦它收到正确的Utterance,我们将在后面配置)。

4. 给函数取个名字,比如“virtualWeather”,并选择“Node.js 4.3”作为运行时。在本文中,我们将使用我已经在这里构建的Skill,所以现在就去下载吧。如果你想看看底层的源代码,你可以在这里找到它。

5. 在代码输入类型下拉菜单中,选择“上传一个.ZIP文件”,然后选择步骤4中下载的virtual-weather.zip。

6. 并添加两个环境变量——host和api_key。

“host”暂时应该等于http://api.openweathermap.org。“api_key”是指http://api.openweathermap.org。“api_key”是当你注册成为开发者时,你将从OpenWeatherMap收到的32位字母数字密钥(参见上面的先决条件列表中的操作位置)。

7. 在“Lambda 函数处理程序和角色”下,在“角色”下拉菜单中选择“创建一个自定义角色”。在出现的新窗口中,保留一切默认值,选择“允许”。

8. 回到“配置函数”页面,您可以保留其他一切的默认选择,然后点击“下一步”。在“审查”页面,如果一切看起来不错,选择“创建功能”。

9. 一旦你创建了函数,请确保复制页面右上方的ARN id。我们以后会需要它。

10. 现在我们的Lambda函数已经到位了,我们必须定义一个Alexa技能。登录Amazon开发者门户(http://developer.amazon.com),选择Alexa标签。选择“Get Started with Alexa Skills Kit”。

11. 点击“添加新技能”。给它命名,调用名称为“天气”

12. 在“交互模型”下,在“意图模式”下张贴以下内容。

{



"intents": [



{



"slots": [



{



"name": "Zip",



"type": "AMAZON.Number"



}



],



"intent": "GetWeatherForZipIntent"



}



]



}

13. 在Sample Utterances下发布以下内容:

GetWeatherForZipIntent what’s the weather for zip code {Zip}

GetWeatherForZipIntent what’s the weather for {Zip}

GetWeatherForZipIntent what’s the weather in {Zip}

最后两步具体规定了我们的用户将如何与我们的技能进行交互。我们的示例语句将用户发声输入映射到Intent.Intent类型(本例中为GetWeatherForZipIntent)和用户指定的邮政编码将以请求的形式发送到我们的Lambda函数。

14. 在配置下,选择AWS Lambda ARN(Amazon Resource Name),然后输入你之前复制的函数ARN。

我们已经准备好测试了 在“文本”选项卡下,输入一个样本Utterance,比如“91016年的天气如何”,然后点击“询问天气”。你应该看到发送到你的Lambda函数的JSON请求及其响应:

如果你的Echo连接到了这个账户,并且你已经在你的账户上启用了这个技能进行测试(你可以在测试页面上这样做),你也可以和Alexa说话来测试这个。说一些类似“Alexa,问天气,91016年的天气怎么样”。

就这样,Alexa的设置就完成了!这还不算太差,对吧?

但是本文开头提出的复杂性和外部依赖性的核心挑战呢?

我们的Lambda函数依赖于一个外部API,它提供了实时的、真实世界的数据。作为物联网设备的开发者或测试人员,我们如何确保我们接收到测试不同条件所需的下游数据呢?

例如,我们来看看我们Alexa技能的一部分,即weather.js:

我们在这里有一些简单的逻辑 可以根据我们的天气描述添加适合天气的短语。例如,每当我们的JSON响应的描述字段中提到下雨的时候,我们Alexa的响应中就会出现“Grab an umbrella!”。

那么我们到底要怎么测试呢?除非你准备好了可靠的雨舞,或者你恰好住在西雅图,否则这并不容易。将测试自动化(为此我们需要来自OpenWeather API的一致的、可重复的数据,这不太可能)加入到这个组合中,我们就有了一个非常棘手的问题。

显然,简单的答案是服务虚拟化。这将使我们能够模拟天气API并测试不同的情况。Parasoft有一个免费的服务虚拟化平台(持续测试平台),可以在Azure中免费试用30天。

第2部分:使用服务虚拟化对我们的Alexa技能进行边缘案例测试

1. 登录到您的 Azure 门户,并选择“新建”以访问市场。

2. 在市场中,搜索“Parasoft”并选择“Service Virtualization On-Demand”。如果您之前已经从 Parasoft 获得了特殊许可证,您可以选择“BYOL”选项。单击“创建”。

3. 为虚拟机提供一个名称,然后输入用户名和密码。您可以选择为虚拟机创建一个新的资源组,或将其添加到现有的虚拟机中。所有其他选项均可保留为默认值。单击“确定”。

4. 选择虚拟机大小(建议使用 DS2_V2 或更高版本)。单击“确定”。

5. 在“设置”下,如果需要,您可以更改其他配置。建议您不要更改默认配置,除非您有特殊原因。单击“确定”。

6. 在“摘要”视图中单击“确定”。

7. 在“购买”视图中单击“购买”。在您的免费试用期结束后(前 30 天),您将被收费。虚拟机的创建过程需要几分钟才能完成。

8. 一旦虚拟机的状态为“运行”,请选择虚拟机并复制其公共 IP 地址。

9. 在浏览器中转到 http://<VM_IP_Address>。将出现“持续测试平台”主菜单。 一旦“在线百分比”小组件显示“100%”,虚拟机已完全配置和初始化。

10. 靠近顶部,点击“Add System”:

11. 选择“从文件导入系统”,然后浏览到AlexaWeatherSystem.zip(在此下载)。选择“AzureVirtServer”作为目标服务器,然后点击“导入”:我们现在已经导入了AlexaWeatherSkill系统、虚拟服务和相关数据。

12. 最后,让我们在Lambda函数和OpenWeatherMap API之间放置我们的代理端点。代理部署在http://<VM_IP_Address>:9080/proxy。

进入AWS Lambda(https://console.aws.amazon.com/lambda/)中的virtualWeather函数,将我们创建的环境变量改为代理端点。

13. 在我们的环境(http://<VM_IP_Address>/em/ui/environments/1)中,我们现在可以控制返回给我们Lambda函数的数据,以测试不同的条件。这将按需改变我们Alexa的行为!从OpenWeatherMap API组件下的下拉菜单中选择T-Storm,然后选择“供应”按钮。

现在,交通被引导到我们的虚拟“T-Storm”服务,并返回一个响应(指示下雨和雷暴)。说一些类似于“Alexa,问问virtualWeather在91016的天气如何”,你会听到这样的回应:“拿把伞!蒙罗维亚有雷雨和大雨。”我们现在有能力控制天气了!

接下来的步骤:

那么,下一步该怎么走?这里有几个潜在的下一步:

  • 如果你对修改现有的虚拟响应(或创建你自己的)感到好奇,请看:http://<VM_IP_Address>/em/virtualassets/manage。
  • 目前,虚拟响应将报告“测试城市”的天气,而不是与您指定的邮政编码相关的城市名称。您可以增强虚拟服务,按邮编进行查询,在虚拟响应中提供正确的城市名称。
  • 你可以修改我的Lambda函数代码,并将其构建/部署到AWS Lambda上。也许你可以修改Alexa的响应,以包含更多的API返回的天气数据。你可以在这里找到repo:https://github.com/sdebrosse/virtualize-weather
  • 一旦你把它克隆到你的Linux机器上(你只能在Linux环境上构建它),你需要配置AWS CLI并安装npm/nodejs。在repo文件夹中,你可以执行“npm run deploy”来部署对Lambda的修改。

我还强烈推荐Brian Donohue在https://medium.com/@bthdonohue/build-your-first-alexa-skill-8a37dc3103d6发表的关于创建你的第一个Alexa技能的文章。我还推荐Ryan Ray在http://www.ryanray.me/serverless-slack-integrations的文章。我已经从他们的两个教程中改编了代码,用于我们在本文中使用的Lambda函数。

猜你喜欢

转载自blog.csdn.net/Pokemogo/article/details/115121910
今日推荐