2018年2月14日 星期三

Line Bot Notify 聊天機器人 使用 ASP.net VB.net

Line是台灣最流行的聊天軟體,因此如果IoT的一些裝置能透過LINE傳送就很棒了,簡單的來說,例如說當倉庫的溫度濕度或濕度超過某一溫度時,就傳訊到管理員手機LINE中進行提醒來查看,或者,家中窗戶被打開時,就拍照並傳訊到使用者LINE中。

LINE的自動化傳訊工具目前來說分成兩種,BOT跟Notify
本文只說明Notify的用法,LINE Notify 製作過程分成四個部份
  • 一、申請LINE Notify服務:利用自己的LINE申請一個Notify服務帳號,過程中需要確認對象為何,只能自己或自己所在的群組,無法針對其他個人用戶,需將對方拉入群組中
  • 二、取得使用者Token:在步驟一完成後,需要由Authorize Code轉成用戶的傳訊代號(Token),只須做一次,取得群組Token後即可傳遞訊息到群組內
  • 三、POSTMAN簡易測試傳遞訊息:完成步驟二之後,可以透過POSTMAN快速測試服務是否正常。
  • 四、ASP自動化訊息:透過IIS網站,以ASP.net透過POST來傳遞訊息,也可透過IFTTT來取代(請參考:使用 LINE Notify 接收網站更新通知),這樣就可以省去寫ASP跟IIS的部份
  • 本文所需工具:POSTMAN(簡易POST工具)、VS.net、IIS、自己固定IP的網址
一、申請LINE Notify服務
1.申請Line 服務:https://notify-bot.line.me/zh_TW/,拉到最下面的登錄服務

2.輸入自己的帳號密碼登入LINE服務

3.輸入相關資訊,
資料可以自行選擇輸入,不過最後好像沒什麼用,最後都是以官方圖片為主,但其中Callback URL則最為重要,到時要接收Authorize Code,例如我輸入我自己的網站:http://210.60.88.47/

4.完成新增服務

5.收信並驗證服務

6.點選我的服務

7.點選剛剛新增的服務內容

8.驗證完畢後,點選顯示,查看Client ID及Client Secret,馬上要用到

9.取得發行權杖

10.輸入相關資訊後,點選發行

11.獲得發行權杖,記得要把它先複製存到其他地方,但是這組文字現在(2018/02月)好像沒啥用

12.這時你的LINE會收到一個訊息,表示權杖已經申請完畢

13.要取得Authorize Code,須透過網頁POST一個網址給Line做認證,因此在IIS中建立名為Line.htm的一個網頁,內容如下,請更換紅色標示的部份

<html lang="tw">
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script>
        function oAuth2() {
            var URL = 'https://notify-bot.line.me/oauth/authorize?';
            URL += 'response_type=code';
            URL += '&client_id=你的Client ID';
            URL += '&redirect_uri=你的CALLBACK_URL';
            URL += '&scope=notify';
            URL += '&state=NO_STATE';
            window.location.href = URL;
        }
    </script>
    </head>
    <body>
        <button onclick="oAuth2();"> 連結到 LineNotify 按鈕 </button>
    </body>
</html>

14.瀏覽你這個IIS的Line.htm網址會得到下面的按鈕,點選這個按鈕

15.連結需要的群組(不懂為何要做兩次)

16.取得Authorize Code,請複製起來以後要用

到此已經完成第一步驟,以目前的程序來猜,可能未來會省略13-16的步驟

二、取得使用者Token
步驟一最後取得的Authorize Code並非群組代號,因此必須由Authorize Code轉換成Token,這時可以利用Postman來做,請自行下載安裝後啟動,或者也可以自行建立一個網頁來POST資訊
POSTMAN下載:POSTMAN,下載、安裝並登入(用Gmail帳號即可登入)後,開啟一個頁簽
1.使用POST
2.網址輸入Token 的服務網址:https://notify-bot.line.me/oauth/token
3.點選Params打開參數視窗
4.依序輸入參數如下(請注意前後不能有空白)
Key欄位Value欄位
grant_type上面取得的authorization code
codeAuthorize Code
redirect_uri你的Callback URL
client_id你的client id
client_secret你的client secret
5.點選Send送出POST
6.查看收回的Token值,將之複製下來,這個Token代表你上面申請傳訊的群組對象ID,步驟三每次傳訊時都會用到


三、POSTMAN簡易測試傳遞訊息
步驟二中取得Token就是代表傳訊的群組,有了這個就可以透過網址傳訊息到該群組,也是利用POST的方法,可以先用POSTMAN測試,再改用ASP設定自動傳訊。
在POSTMAN中依序完成以下
1.修改傳遞方式為POST
2.輸入Notify傳訊網址: https://notify-api.line.me/api/notify
3.點選Header頁簽
4.新增一個Header參數,請注意Bearer與Token之間有一個空白
Key欄位Value欄位
AuthorizationBearer 上面取得的群組Token


5.點選Body頁簽
6.選擇傳送格式x-www-form-urlencoded
7.點選Params設定參數
8.新增一個message參數,此為真正的傳訊內容
Key欄位Value欄位
message訊息內容....
9.完成後,點選Send送出,即可得到結果,若結果為OK,代表傳送完成
10.查看手機,可得到訊息已經進來了



四、ASP自動化訊息
用POSTMAN只能手動傳遞訊息,如果要能系統自動傳訊息,則需要利用IIS+ASP,例如說當Arduino偵測到溫度或濕度(或有害氣體濃度)過高,則發送訊息到網站,而網站接收到Arduino傳來的訊息之後,將訊息以LINE Notify轉發群組內,所以下面我們將介紹如何以ASP(VB.net)來說明如何傳遞訊息到LINE
本部份也可透過IFTTT來取代,請參考:使用 LINE Notify 接收網站更新通知,但之所以用自己的網站是因為這樣將會有更多的權限及可能,例如我們可以把訊息存到sql資料庫,或者給予一些準則或機制等等
1.Arduino傳遞部份
參考範例檔的Wifi/WifiWebClient範例

分別修改WIFI AP的SSID及密碼、Server的IP=自己IIS網站的IP、將get 後面的網址改為要接收網頁的網址(本文為default.aspx),並加上後續要接收的參數,以本例而言,將接收user(使用者代號)及value(有害氣體濃度ppm)
2. ASP程式碼(本文CodePage採用VB.net)
建立一個網頁,檔案名稱為上述default.aspx,用以接收Arduino傳來的參數,並立即轉發,因此在Codepage程式主要分成兩個部份,A接收及B轉送
在default.aspx的Load事件函數中,輸入以下的程式碼(要記得Import兩個Lib:System.IO跟System.Net)
A.接收參數:利用request接收user及value
B.轉送到LINE Notify:建立一個WebRequest,並以Stream方式把資料POST給LINE網頁將訊息送出
其中,訊息要換行時,使用"%0D%0A"換行
Private Sub default_Load(sender As Object, e As EventArgs) Handles Me.Load
        'A.接收參數
        Dim user As String = Request.QueryString("user")
        Dim value As String = Request.QueryString("value")
   
        'B.轉送到LINE Notify:
        Dim request1 As WebRequest = WebRequest.Create("https://notify-api.line.me/api/notify")
        request1.Method = "POST"
        '
        request1.Headers.Set("Authorization", "Bearer 你的Token")
        Dim postData As String = "message=%0D%0A用戶:" & user & "%0D%0A偵測器發現有害氣體濃度過高(數值=" & value & ")。%0D%0A時間:" & Now().ToString("yyyy/MM/dd HH:mm")
        Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)
        request1.ContentType = "application/x-www-form-urlencoded"
        request1.ContentLength = byteArray.Length
        Dim dataStream As Stream = request1.GetRequestStream()
        dataStream.Write(byteArray, 0, byteArray.Length)
        dataStream.Close()
        Dim response As WebResponse = request1.GetResponse()
        Console.WriteLine(CType(response, HttpWebResponse).StatusDescription)
        dataStream = response.GetResponseStream()
        Dim reader As New StreamReader(dataStream)
        Dim responseFromServer As String = reader.ReadToEnd()
        Console.WriteLine(responseFromServer)
        reader.Close()
        dataStream.Close()
        response.Close()
End Sub
訊息內容


2018年2月6日 星期二

[Telemba] 遠端親臨機器人中橋接平板和掃地機器人的程式設計


打開firmware/application可以瞭解橋接平板和掃地機器人的程式設計,我們找到main.c程式,如上圖,可以看到LED燈初始化(led_init)、按鈕初始化(button_init)、掃地機器人初始化(roomba_init)、還有平板初始化(android_init),所有初始化工作結束後,就進入無窮迴圈for (;;),在這個迴圈中只做一件事android_update。
android_update()函式就在android.c程式中,一開始若dev_handle為0,表示跟平板間的連線有題題,此時會暫停掃地機器人的運作roomba_set_drive (0, 0),熄燈led_set(1, 0),接下來判斷和平板間的通訊是否完成AndroidAppIsReadComplete,若通訊結束,先判斷是否成功,若不成功則閃燦燈號led_set(1, !led_get(1));,接下來讀取資料AndroidAppRead。
接下來依照接收資料的第一個位元組來決定掃地機器人的動作,您可以參閱前一篇文章的說明遠端親臨機器人Android App程式設計,其他命令如下:

要查看如何與掃地機器人溝通可以打開roomba.c,以下是控制馬達部份,可以清楚地看到是採用UART的通訊來和掃地機器人溝通,前後把計時器關閉或啟用。

2018年2月5日 星期一

[Telemba] 遠端親臨機器人Android App程式設計


開放原始碼網址:https://github.com/start-jsk/telemba
可以看到有五個資料夾,分別為:
  1. android/TelembaController (APP)
  2. electric (電路)
  3. firmware/application (韌體,用來連接平板以及掃地機器人)
  4. hangouts (影音通話)
  5. mechanical/Telemba-012 (機構)
本篇文章將介紹APP,點選android/TelembaController,可以看到三個資料夾以及五個檔案。

點選src/jp/hackerspace/TelembaController,就可以看到2個資料夾以及4個檔案,分述如下:
打開MQTTClientService.java,重要的物聯網相關程式如下圖。


this.pubNode = new MQTTPublishNode() ; //建立物聯網發佈節點
this.brokerUrl = "tcp://telemba.jp:1883"; //設定物聯網仲裁主機的網址以及通訊埠
this.usb2roomba = new USB2Roomba(TelembaActivity.getActivity()) ;//建立USB到掃地機器人的物件
this.usb2roomba.setMQTTClient(this.pubNode);//設定物聯網發佈節點

有關MQTT客戶端(Client)是使用org.eclipse.paho.client.mqttv3.MqttClient;,請參考https://www.eclipse.org/paho/files/javadoc/org/eclipse/paho/client/mqttv3/MqttClient.html的說明。
以下是訂閱主題的程式說明:

在打開MQTTUtil有兩支程式分別是MQTTCallback.javaMQTTPublishNode.java,前者是負責處理訂閱主題後,收到伺服主機送主題更新資料的回呼程式,而後者則是發佈主題命令。

從上面程式,可以很清楚收到物聯網主題訊息後,如何把訊息轉換成命令來控制掃地機器人。下圖為收到"invite"命令後,啟動Hangout的情形。



進入USBUtil資料夾,打開RoombaCommand.java就可以查看平板程式是如何下命令來指揮掃地機器人,例如啟動則用START命令,也就是128。


2018年2月4日 星期日

[Telemba] 如何製作遠端親臨機器人

前三篇有關於遠端臨場機器人文章:
1. 遠端臨場機器人(Telepresence Robot)
2. 號稱世界上最便宜的遠端臨場機器人
3. 一個不錯的開放源碼機器人研究基地:START@JSK

本篇將介紹如何製作全世界最便宜的遠端親臨機器人,大家可以拜訪:How to make your Telemba,如下圖:



在上圖右手邊有19篇文章,仔細閱讀就可以瞭解如何製作遠端親臨機器人,以下是介紹幾個重要的文件:

1. Android_APP_JP 

在Google Play 可以找到TelebaController,它是Android應用程式,筆者試過在台灣的Google Play找不到。



2. Development Environment
經由一塊板子PIC24FJ64GB002,來連接Android平板和Roomba掃地機器人,不過PIC不再支援MLA (Microchip Library for Application),必須使用v2013_06_15版本。
目前PIC支援智慧型手機的現況:
http://www.microchip.com/design-centers/smartphone-accessory

3. DMMPrinting_JP

3D列印的資料,您可以上網去購買,網站:https://make.dmm.com/item/97852/,7696日元。








機構連接
電子元件連接


使用Hangouts來通訊


9. MQTT_JP
此份文件記錄控制命令。


ルンバ 600シリーズ
ルンバ 700シリーズ