前言
众所周知,随着网络技术的不断发展,IoT技术也逐渐走进了千家万户,无论是扫地机器人、智能窗帘等智能家居,还是说智能音箱等娱乐设施,IoT技术都变得可见可及,而众多物联网产品中,智能音箱可以说是近几年最火热的设备之一了,无论是小米的小爱同学、百度的小度还是腾讯的9420、阿里的天猫精灵,它们都在努力走进寻常百姓家。
在之前的章节中,我们对Serverless已经有了比较深刻的了解,对Serverless的应用领域也有了比较深刻的接触,本文将会通过与IoT能力进行结合,让Serverless架构在智能音箱中,发挥有趣的作用。本文将会以阿里云函数计算,通过为天猫精灵和小爱同学赋能,制作属于我们自己的应用程序。
无论是天猫精灵还是小爱同学,与函数计算的结合都是相对比较容易的:
通过API网关/HTTP函数来触发函数。实际上和前文中所讲述的Github Issue机器人是类似的原理。
首先明确我们要通过智能音箱要实现的功能,在日常生活中,我们经常会“纠结”,这个时候就会有人想要掷骰子来做一些决定,所以,我们可以通过智能音箱实现一个掷骰子的功能,当我们对音响说“掷骰子”,音响给我们返回扔骰子后的点数。
天猫精灵
以天猫精灵为例,我们需要先在天猫精灵开发者平台注册开发者账号,并且登陆、认证。然后我们新建技能:
这里面我们剋设置好我们的应用调用词为“扔骰子”,即通过扔骰子来触发我们的功能,然后我们保存项目。保存之后,我们可以新建意图,所谓的意图,官方给的描述是:意图(Intent)是自定义技能中提供功能的载体,所以在创建意图时需要明确此意图提供什么样的功能,我们可以将意图设定为掷骰子,并将其设为默认意图:
完成之后,我们需要进行接口权限绑定,首先,我们需要找到回复逻辑的WebHook详情:
在这里,我们需要下载认证文件,并将其配置到服务器中,根据官网文档的描述:获取您配置的 Webhook URL,取出URL中域名和端口号(如果有),然后拼接上"aligenie/认证文件名.txt "访问这个路径,以返回的结果(认证文件的内容)作为依据,判断认证是否成功。
例如:
- 下载到的认证文件是 13f776873db7e9dfae87121bcec0712a.txt;
- 意图内配置的 Webhook URL 为 https://webhook-service.com/** ;
- 那么我们将访问 https://webhook-service.com/aligenie/13f776873db7e9dfae87121bcec0712a.txt;
- 将获取到的结果做校验,校验通过 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,此处可以保存:
保存完成之后,我们可以继续开发我们的掷骰子应用,我们可以根据文档,找到我们需要返回的数据结构:
此时,我们对刚才的函数进行升级,增加掷骰子的方法。增加后的完整代码:
# -*- 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()
更新函数之后,我们可以在线上进行简单的测试:
可以看到,当我们发出掷骰子的指令,系统已经是可以为我们返回掷骰子后的随机数字可。至此,我们完成了天猫精灵版的“Serverless掷骰子”小技能。
小爱同学
和天猫精灵一样,我们需要去小爱同学开发者平台进行账号注册、登陆和认证。然后,我们可以创建一个技能:
完成之后,我们设置唤醒指令,并且需要填写一些数据,例如图标,介绍等:
设置成功之后,我们可以在阿里云函数计算创建一个函数,根据小爱同学规约的服务端返回结构:
代码为:
# -*- 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()
完成之后,我们进行设备调试:
可以看到,当我们输入预定的命令“打开掷个骰子”,系统已经可以返回给我们预期的结果,至此小爱同学版的“Serverless掷骰子”开发完成。
总结
至此为止,我们通过Serverless架构,成功地为我们的天猫精灵和小爱同学开发了一项新功能,接下来想要让更多人使用这个新功能就可以去发布,审核,上线了。当然,本节内容仅仅是举了一个例子,除此之外,我们还可以通过Serverless架构,为我们的智能音箱定制更有趣的功能,例如,我们通过爬虫技术来实现一个网站流量监控,或者服务状态监控,当我们问智能音箱某某服务或者网站目前运营状态如何,智能音箱就会告诉我们;或者说当我们可以将要追的电视剧、电子书爬虫与智能音箱整合,当我们问智能音箱剧或者书的更新状况时,通过API网关触发我们的函数服务,获得到结果,再交由智能音箱告知我们,这些功能都算是很有趣的定制化服务或定制化功能。
通过本节内容,希望读者可以对Serverless架构有新的启发,其实随着5G的到来,IoT技术会有更大的契机进行更快速的发展,而此时Serverless架构可以说是与IoT技术非常的般配