把arduino以簡單的方式接入Amazon Alexa實現語音控制

本文只是提供一個簡單的思路,以一種比較簡單的方式把自己使用arduino製作的硬件連接到Amazon Alexa中,可以使用Amazon Echo等設備控制它。

原文地址:http://blog.csdn.net/luhanglei/article/details/54289986

效果:http://weibo.com/tv/v/EpwDW1ktb?fid=1034:35b0913deed1b50f38fbad52f4c03382

大體的原理如圖所示


我選擇java做服務器語言,完整開發需要了解並實現oauth的過程、servlet或jsp、socket通信

1.硬件環境:首先需要配置Amazon Echo,按照說明書配置好即可,不過多描述。

2.雲服務器:準備好一個雲服務器,必須要有一個固定的端口號給server socket(主要是讓arduino跟自己的服務器同步數據用,如果有更好的解決方案,請忽視)。我採用的是bae和它的擴展服務中的port服務,因爲用起來比較熟悉。如果會node.js或者python,也可以直接使用亞馬遜的AWS Lambda。

注意申請完port之後要把port和你的bae應用綁定起來,就是把port映射到你bae應用的某一個端口上。

3.亞馬遜的配置:註冊skill

到亞馬遜開發者網站的Alexa管理頁面,選擇Alexa Skills Kit,然後新建一個Skill

選Custom Interaction Model,並填寫插件的名字。選智能家居後面的部分步驟會比選普通插件麻煩,如果想嘗試的朋友也可以嘗試直接使用智能家居的選項。

填好後選擇next

填寫你要用到的口令的相關信息(JSON格式)

Intent Schema,可以理解爲定義一下你命令中可能出現的一些東西,比如設備、動作

以下是亞馬遜提供的Intent Schema的實例

{
  "intents": [
    {//以上爲固定格式
      "intent": "GetHoroscope",//intent的名字,在下方命令定義中,針對這個intent的命令必須以引號中的字符開頭
      "slots": [
        {
          "name": "Sign",//slot的名字,比如你要操作好幾個設備,這裏可以是設備
          "type": "LIST_OF_SIGNS"//slot對應的type,在下方的輸入框中會進行定義,比如定義的type是機器,那麼type可以在下方的定義中可以包含燈、插座等
        },
        {
          "name": "Date",
          "type": "AMAZON.DATE"//亞馬遜也給出了一些默認的type,如果需要可以查看,因爲我控制的是淨化器,沒有用到
        }
      ]
    },
    {
      "intent": "GetLuckyNumbers"
    }
  ]
}

假如我需要從空氣淨化器讀取我家裏的空氣質量,那我只需要把Intent Schema定義成下面的樣子

{"intents":[{
    "intent":"air",//intent會被髮送到自己的服務器,告訴自己是要獲取空氣質量
    "slots":[{
      "name":"quality",//給關鍵詞定義名字爲質量
      "type":"QUALITY"//slot的類型爲QUALITY,至於關鍵詞到底有什麼,會在Slot type中定義    
}]
  }
]
}

Slot Type
某個類別的關鍵詞定義在一起方便識別

比如:在machine中定義light和switch等詞語,這裏的詞語不再是一個類別的名稱,而是你命令中確切會出現的詞語。特別注意,最後亞馬遜發送給我們服務器的消息只包含了命令的intent的名字、slot的名字和type中具體的口令詞,不會包含type的名字。

還是以獲取空氣質量爲例:

要在QUALITY這個type中加入air quality、dust、PM2.5等詞語,關鍵詞之間換行分割即可。


Sample Utterances

這一步是要給出命令的範例,還是拿空氣質量舉例

air How is the {quality} in the house

其中air是intent的名字,空格後是命令,{quality}是一個通配符,是slot的名字,Alexa會把它匹配到上一步定義的air quality、dust、PM2.5等詞語中。

把自己的服務器關聯到Alexa,讓Alexa知道把消息傳遞到哪。

圖片上方要填寫的地址就是當Alexa收到我們的命令之後,把json post的目的地址。

下半部分爲用戶綁定相關設置。因爲牽扯到智能家居控制,所以最好選擇綁定賬戶,可以在我們自己的服務器上區分用戶是誰。

grant type選擇 implicit grant比較簡單,就是很常見的oauth的認證方式,只不過這次我們的角色變成了token的頒發方,Alexa引導用戶來獲取token。當第一次打開插件的時候,Alexa APP會把用戶引向我們填寫的Authorization URL,由我們進行認證,在認證完成後,按照要求重定向到圖中所示的Redirect url中,完成賬戶的綁定。

認證完成後,我們讓用戶重定向的地址類似於:

https://pitangui.amazon.com/spa/skill/account-linking-status.html?vendorId=AAAAAAAAAAAAAA#state=xyz&access_token=2YotnFZFEjr1zCsicMWpAA&token_type=Bearer
其中#之前的是亞馬遜給我們的重定向地址,後面的參數需要我們添加上。state是在亞馬遜請求Authorization URL的時候,會帶過來的一個參數,此處需要傳回去。access_token就是我們給予用戶的令牌。token_type是固定值,Bearer

此外網頁中其他的數據分別是:client-id,輸入的數值會在亞馬遜請求的時候發送給我們用於識別。scope是Alexa需要請求的權限,也是我們自己定義的,我瞎填的。

SSL Certificate

這一步是亞馬遜要求我們的服務器必須是有效的sll證書的。因爲我是用的是bae,所以直接選My development endpoint is a sub-domain of a domain that has a wildcard certificate from a certificate authority即可,bae是支持https的,應該所有的二級域名都有證書。

測試

前面都按步驟設置好的話,就可以打開測試了。打開測試以後,可以在網頁下方的Service Simulator輸入文字命令查看自己服務器的返回結果是不是正確。也可以在Alexa APP中的skill中的your skills中看到自己的skill了!

到這裏,亞馬遜的配置就完成了。

ARDUINO連接到服務器

我用的是esp-13的wifi板,使用arduino uno的軟串口連接。連接到服務器的方式比較簡單,在esp-13的配置界面裏把模式改成client,然後把在bae申請到的port的ip和端口號填進去就行了。

【此處有坑】我申請的時候port的端口號總是在30000多,esp-13的提交總顯示非法數值。解決方法是:除了端口號之外,其他東西照常填,端口號瞎填一個30015以下的數字。提交。然後刷新一下,把esp的配置界面保存下來,用文本編輯軟件打開,把javascript中進行端口號合法性檢查函數的返回值直接改爲永遠是true。然後把post配置信息的相對地址改成以ip開頭的絕對地址進行提交,就可以正常使用了。

arduino和服務器之間就可以通過socket進行數據交換了。

服務器的幾個接口

1.oauth授權的頁面,alexa的app打開這個頁面,確定用戶身份後按規定跳轉回指定的redirect url。

2.Alexa發來的信息交互

發來的信息的樣式可以在test中看到

回覆的格式爲:

{
  "version": "1.0",
  "response": {
    "outputSpeech": {"type":"PlainText","text":"Text to speak back to the user."},//text中是語音回覆的內容
    "card": {//顯示在Alexa APP中的內容
      "type": "Simple",
      "title": "Example of the Card Title",
      "content": "Example of card content. This card has just plain text content.\nThe content is formatted with line breaks to improve readability."
    }
  }
}
3.一個server socket,跟arduino通信

大體過程就是這樣,如果有什麼需要補充的歡迎在評論中提出,如有錯誤歡迎批評指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章