Serverless与IoT实践:为智能音箱赋能

简介: 本文通过与IoT能力进行结合,让Serverless架构在智能音箱中,发挥有趣的作用。


1. 前言

众所周知,随着网络技术的不断发展,IoT技术也逐渐走进了千家万户,无论是扫地机器人、智能窗帘等智能家居,还是说智能音箱等娱乐设施,IoT技术都变得可见可及,而众多物联网产品中,智能音箱可以说是近几年最火热的设备之一了,无论是小米的小爱同学、百度的小度还是腾讯的9420、阿里的天猫精灵,它们都在努力走进寻常百姓家。

本文将会以阿里云函数计算,通过为天猫精灵和小爱同学赋能,制作属于我们自己的应用程序。

无论是天猫精灵还是小爱同学,与函数计算的结合都是相对比较容易的:

image.png

通过API网关/HTTP函数来触发函数。实际上和前文中所讲述的Github Issue机器人是类似的原理。

首先明确我们要通过智能音箱要实现的功能,在日常生活中,我们经常会“纠结”,这个时候就会有人想要掷骰子来做一些决定,所以,我们可以通过智能音箱实现一个掷骰子的功能,当我们对音响说“掷骰子”,音响给我们返回扔骰子后的点数。

2. 天猫精灵

以天猫精灵为例,我们需要先在天猫精灵开发者平台注册开发者账号,并且登录、认证。然后我们新建技能:

image.png

这里面我们剋设置好我们的应用调用词为“扔骰子”,即通过扔骰子来触发我们的功能,然后我们保存项目。保存之后,我们可以新建意图,所谓的意图,官方给的描述是:意图(Intent)是自定义技能中提供功能的载体,所以在创建意图时需要明确此意图提供什么样的功能,我们可以将意图设定为掷骰子,并将其设为默认意图:

image.png

完成之后,我们需要进行接口权限绑定,首先,我们需要找到回复逻辑的WebHook详情:

image.png

在这里,我们需要下载认证文件,并将其配置到服务器中,根据官网文档的描述:获取您配置的 Webhook URL,取出URL中域名和端口号(如果有),然后拼接上“ligenie/认证文件名.txt”访问这个路径,以返回的结果(认证文件的内容)作为依据,判断认证是否成功。

例如:

  1. 下载到的认证文件是 13f776873db7e9dfae87121bcec0712a.txt

  2. 图内配置的 Webhook URL 为https://webhook-service.com/**

  3. 那么我们将访问 https://webhook-service.com/aligenie/13f776873db7e9dfae87121bcec0712a.txt

  4. 将获取到的结果做校验,校验通过 Webhook URL 才能配置成功。

结合我们函数计算,以Python Web框架Bottle为例,通过下载认证文件之后,我们可以编写我们的认证代码:

# -*- coding: utf-8 -*-

import bottle

@bottle.route('/aligenie/eaf3f19e4fcac40131ee278cdb0284dd.txt', method='GET')
def token():
    return 'Jfc4Z4Ur15JwUBuvUQD5wg7Nu8+l+HscqYlfofbyJdYyLiBpubYhF9sbUIH/ig6g'

app = bottle.default_app()

并将代码部署到阿里云函数计算,绑定自定义域名,例如此处我绑定了域名:aligenie.iot.serverless.fun,此处可以保存:

image.png

保存完成之后,我们可以继续开发我们的掷骰子应用,我们可以根据文档,找到我们需要返回的数据结构:

image.png

此时,我们对刚才的函数进行升级,增加掷骰子的方法。增加后的完整代码:

# -*- coding: utf-8 -*-

import bottle
import random


@bottle.route('/', method='POST')
def test():
    return {
        "returnCode": "0",
        "returnErrorSolution": "",
        "returnMessage": "",
        "returnValue": {
            "reply": random.choice(['1', '2', '3', '4', '5', '6']),
            "resultType": "RESULT",
            "executeCode": "SUCCESS",
            "msgInfo": ""
        }
    }

@bottle.route('/aligenie/eaf3f19e4fcac40131ee278cdb0284dd.txt', method='GET')
def token():
    return 'Jfc4Z4Ur15JwUBuvUQD5wg7Nu8+l+HscqYlfofbyJdYyLiBpubYhF9sbUIH/ig6g'

app = bottle.default_app()

更新函数之后,我们可以在线上进行简单的测试:

image.png

可以看到,当我们发出掷骰子的指令,系统已经是可以为我们返回掷骰子后的随机数字可。至此,我们完成了天猫精灵版的“Serverless掷骰子”小技能。

3. 小爱同学

和天猫精灵一样,我们需要去小爱同学开发者平台进行账号注册、登录和认证。然后,我们可以创建一个技能:

image.png

完成之后,我们设置唤醒指令,并且需要填写一些数据,例如图标,介绍等:

image.png

设置成功之后,我们可以在阿里云函数计算创建一个函数,根据小爱同学规约的服务端返回结构:image.png

代码为:

# -*- coding: utf-8 -*-

import bottle
import random


@bottle.route('/', method='POST')
def test():
    return {
        "is_session_end": True,
        "version": "1.0",
        "response": {
            "open_mic": True,
            "to_speak": {
                "type": 0,
                "text": random.choice(['1', '2', '3', '4', '5', '6'])},
        }
    }


app = bottle.default_app()

完成之后,我们进行设备调试:

image.png

可以看到,当我们输入预定的命令“打开掷个骰子”,系统已经可以返回给我们预期的结果,至此小爱同学版的“Serverless掷骰子”开发完成。

4. 总结

至此为止,我们通过Serverless架构,成功地为我们的天猫精灵和小爱同学开发了一项新功能,接下来想要让更多人使用这个新功能就可以去发布,审核,上线了。当然,本节内容仅仅是举了一个例子,除此之外,我们还可以通过Serverless架构,为我们的智能音箱定制更有趣的功能,例如,我们通过爬虫技术来实现一个网站流量监控,或者服务状态监控,当我们问智能音箱某某服务或者网站目前运营状态如何,智能音箱就会告诉我们;或者说当我们可以将要追的电视剧、电子书爬虫与智能音箱整合,当我们问智能音箱剧或者书的更新状况时,通过API网关触发我们的函数服务,获得到结果,再交由智能音箱告知我们,这些功能都算是很有趣的定制化服务或定制化功能。

通过本节内容,希望读者可以对Serverless架构有新的启发,其实随着5G的到来,IoT技术会有更大的契机进行更快速的发展,而此时Serverless架构可以说是与IoT技术非常的般配。

作者介绍
目录