聊天室( 前後端實作) - Webduino 實戰智慧插座教學

文章推薦指數: 80 %
投票人數:10人

上一篇我們已經做出一個基本的網頁聊天室,這篇要來做兩件事情, ... 然後就可以開始聊天控制燈泡,不論在燈泡、前端、後端或是資料庫,都可以看到即時的變化。

聊天室(前後端實作) 上一篇我們已經做出一個基本的網頁聊天室,這篇要來做兩件事情,第一件事情「和燈泡聊天」,第二件事情則是「美化聊天室」。

我們剛剛做的那個頁面可以完全不用更動,重點在要設計另外一個頁面給燈泡使用(其實就是你用頁面A,燈泡用頁面B和你聊天,這樣才有聊天室的感覺)。

撰寫燈泡的聊天程式(網頁前端) 因為對於燈泡來說,對話的內容不需要顯示出來,只需要在程式內容撰寫對應的邏輯,所以這邊就純粹用console印出內容,不過因為要透過Webduino控制智慧插座,所以一開始在HTML的部分要先引入對應的JavaScript。

JavaScript一開始先對變數做宣告,主要就是初始化Firebase資料庫。

(記得要用自己的資料庫!) varfirebase; varled; varconfig={ databaseURL:"你的資料庫網址" }; firebase.initializeApp(config); vardatabase=firebase.database().ref(); 然後寫一個獲取時間並且可以自動判斷「如果是個位數就補零」的流程,待會會用到。

functiongetTime(){ vardate=newDate(); varh=date.getHours(); varm=date.getMinutes(); vars=date.getSeconds(); if(h<10){ h='0'+h; } if(m<10){ m='0'+m; } if(s<10){ s='0'+s; } varnow=h+':'+m+':'+s; returnnow; } 再來就是裝置開發板的程式,這邊先宣告智慧插座是接在板子的10號腳上,一開始會出現連線中的提示,然後「當裝置上線之後」,就會觸發database.push這一段程式,也就是會發一段「我上線囉!」的訊息進資料庫,也因為資料庫有變動,有連接資料庫的聊天室就會收到燈泡上線的訊息。

boardReady('evkG',function(board){ board.systemReset(); board.samplingInterval=250; led=getLed(board,10); console.log('裝置連線中...'); database.push({ name:'智慧燈泡', content:'我上線囉!', time:getTime() }); //主程式... }); 在還沒有寫主程式的狀況下,我們讓裝置上線,這時候就會在聊天室裡頭收到智慧燈泡說「我上線囉!」的訊息。

最後就是主程式,一開始先設定一個event的陣列物件,裡面放入收到指定的訊息(text)後,智慧插座要做的對應行為(fn),還有燈泡要回覆的訊息(msg),接著使用Firebase的.limitToLast(1),來獲取最後一筆訊息,然後內容作出對應的判斷,當然這邊寫的判斷非常簡單(單純判斷有沒有包含文字),如果有興趣也可以寫得複雜些。

varevent=[ { text:'開燈', msg:'燈泡已經打開!', fn:function(){led.on();} }, { text:'關燈', msg:'燈泡已經關起來了!', fn:function(){led.off();} }, { text:'閃爍', msg:'一閃一閃亮晶晶~', fn:function(){led.blink(500);} } ]; database.limitToLast(1).on('value',function(snapshot){ vars={}; for(variinsnapshot.val()){ s=snapshot.val()[i]; console.log('('+s.time+')'+s.name+'說:'+s.content); for(varjinevent){ if(s.content.indexOf(event[j].text)!=-1){ event[j].fn(); database.push({ name:'智慧燈泡', content:event[j].msg, time:getTime() }); } } } }); 完整程式碼:http://bin.webduino.io/budiw/2/edit?html,js,output 完成之後讓裝置上線,在聊天室打「開燈」、「關燈」或「閃爍」,就可以看到燈泡作出對應的變化,而且燈泡也會把當前的狀態回報在聊天室裡面。

撰寫燈泡的聊天程式(網頁後端) 剛剛看到的是網頁前端的做法,雖然很方便但某種程度上也會受限於瀏覽器,如果你會使用Node.js的話,我們就可以讓燈泡聊天的程式跑在後端運作,要使用Node.js首先必須安裝Node.js Node.js:https://nodejs.org/en/download/ 基本上現在安裝完成之後就會連同npm(nodepackagemanager)一起安裝,透過npm我們就可以安裝對應的package,打開指令輸入工具,進入開發的目錄,安裝webduino-js、webduino-blockly和firebase。

(Mac可能要用sudo開頭) npminstallwebduino-jswebduino-blocklyfirebase 安裝好了之後應該會看到目錄下多一個node_modules的資料夾,裡面包含了所需要的程式內容。

接著建立一個名為index.js的檔案,一開始先require對應的package,後面的程式基本上就把剛剛寫的完全複製貼上就可以了。

require("webduino-js"); require("webduino-blockly"); varfirebase=require('firebase'); 編輯完成存檔之後,在指令輸入nodeindex,就可以透過Node.js操控智慧插座上頭的燈泡,我們在前端網頁的聊天室,也就會看到出現燈泡上線的訊息。

然後就可以開始聊天控制燈泡,不論在燈泡、前端、後端或是資料庫,都可以看到即時的變化。

美化聊天室 到這邊為止基本上已經幾乎完成所有的工作,最後一步就是美化一下聊天室,而美化的工作幾乎全部都在CSS身上,為了讓設計的結構更完整,這邊稍微調整了一下HTML,目的是「讓輸入框在最底下,而訊息顯示在上方」。

姓名:
內容:
送出訊息 CSS的部分先看到最外層,設定背景色,以及把對話區域的背景色設為半透明的黑色,同時指定最大的寬度與置中,box-sizing的目的在於不要讓padding影響了實際的寬度。

body,html{ width:100%; height:100%; margin:0; padding:0; background:url(http://www.oxxostudio.tw/firebase-webduino-im/bg2.jpg); background-size:cover; } #im{ position:relative; margin:0auto; width:100%; max-width:600px; height:100%; box-sizing:border-box; background:rgba(0,0,0,.4); } 接下來這幾段則是輸入框的部分,首先把位置設為absolute這樣才可以將其固定在最下方(不要用fixed因為fixed是針對最外層視窗),z-index設為2讓輸入框可以在比較高層的位置,接下來的幾個屬性是在編排輸入框的內容位置。

#input{ position:absolute; z-index:2; height:90px; width:100%; left:0; bottom:0; margin:0; padding:15px; box-sizing:border-box; background:#222; color:#fff; } #inputinput,#inputspan{ display:inline-block; margin:5px0; } #inputinput{ width:75%; border:none; padding:5px; } #inputspan{ width:10%; min-width:50px; } #inputdiv{ width:80%; float:left; } #inputbutton{ float:right; height:90%; width:20%; margin:5px0; border:none; padding:0; background:#369; font-size:16px; color:#fff; } 再來看到訊息顯示區域,同樣位置設定為position,高度直接用CSS的計算功能,記得減去最下方輸入框的高度,然後透過overflow-y讓y軸出現捲軸而不會超過版面,其他的屬性大概都是在設定對話區域的樣式、時間的樣式...等。

#show{ position:absolute; top:0; left:0; z-index:1; width:100%; height:calc(100%-90px); overflow-y:scroll; padding:20px; box-sizing:border-box; } #show>div{ position:relative; margin:0020px0; clear:both; height:40px; } #show>div>div{ display:inline-block; } #show.time{ position:absolute; top:-2px; font-size:10px; color:#777; } #show.name{ color:#fff; vertical-align:middle; } #show.content{ background:rgba(255,255,255,.8); padding:10px; margin-top:15px; margin-left:10px; border-radius:5px; vertical-align:middle; } 最後這段的目的在設定捲軸樣式,不過基本上只有支援webkit的瀏覽器才支援就是了。

#show::-webkit-scrollbar{ width:5px; } #show::-webkit-scrollbar-track{ background:rgba(255,255,255,.1); border-radius:5px; } #show::-webkit-scrollbar-thumb{ background:rgba(255,255,255,.2); border-radius:2px; } 不過只有CSS還不夠,因為對話內容是動態產生,由於這裡想要讓「自己」發出的對話會有點不同(例如說位置在右邊),所以JavaScript裡面就動態產生一些style套進去,當中$show.scrollTop($show[0].scrollHeight);這段比較特別,因為之前是用prepend把新訊息放在最上面,而這邊適用append把新的訊息放在最下面,間接導致輸入完訊息會看不到最新的內容,所以就透過網頁捲軸的操控,讓每次捲軸都能保持在最下方的位置。

database.limitToLast(1).on('value',function(snapshot){ for(variinsnapshot.val()){ $show.append(''+snapshot.val()[i].time+''+snapshot.val()[i].name+'說'+snapshot.val()[i].content+''); } $show.scrollTop($show[0].scrollHeight); $show.find('.id'+ms+'.name').css({ 'float':'right', 'padding-top':'12px', 'color':'#fc0' }); $show.find('.id'+ms+'.content').css({ 'float':'right', 'margin-right':'10px' }); $show.find('.id'+ms+'.time').css({ 'right':'0', 'color':'#777' }); }); 完成後來實際測試看一下長相,總算是比較有聊天室的樣子了,這時候如果打開前端的燈泡網頁,或是剛剛後端的Node.js程式,就可以在這個聊天室裡面真正和燈泡聊天囉! 完整程式碼:http://bin.webduino.io/luxe/1/edit?html,css,js,output 小結 其實透過FireBase來實做一個聊天室非常的簡單,真正花時間的地方反而是在美化聊天室,當然如果背後邏輯能再多花一點時間優化,就可以做出更多種的變化與應用,不然以現在的例子,你輸入「不要開燈」,燈泡還是會打開喔!畢竟沒有做更複雜的判斷,只是判斷有沒有包含字詞而已。

最後,其實也可以透過WebduinoBlockly編輯工具(https://blockly.webduino.io)做出燈泡的聊天主程式,因為線上工具真的是做得非常強大! 範例:https://goo.gl/eJ1hjA 聯絡我們 如果對於Webduino產品有興趣,歡迎透過下列方式購買: 個人線上購買:https://store.webduino.io/(支援信用卡、超商取貨付款) 企業&學校採購:來信[email protected]或來電07-3388511。

如果對於這篇教學有任何問題或建議,歡迎透過下列方式聯繫我們: Email:[email protected](如對於產品有使用上的問題,建議透過Email附上照片或影片聯繫) Facebook粉絲團:https://www.facebook.com/webduino/ Facebook技術討論社團:https://www.facebook.com/groups/webduino/ Webduino基礎教學 Webduino開發板 馬克一號(介紹) 馬克一號(初始化設定) WebduinoFly(介紹) WebduinoFly(初始化設定) WebduinoSmart(介紹) WebduinoSmart(初始化設定) 開發板擴充設定 Arduino韌體下載與燒錄 使用WebSocket操控 WebduinoBlockly 認識WebduinoBlockly WebduinoBlockly基本操作 WebduinoBlockly特殊功能 連動多塊開發板 腳位偵測設定 發光元件 LED 三色LED LED點矩陣 輸入輸出 繼電器 蜂鳴器 按鈕開關 震動開關 搖桿 紅外線發射接收 環境偵測 超音波偵測 溫濕度偵測 人體紅外線偵測 聲音偵測 光敏電阻 可變電阻 土壤濕度偵測 三軸加速度計 無線感應 RFID 玩具及馬達 伺服馬達 Webduino綜合應用 元件應用 LED(兩顆交互閃爍) LED(霹靂燈) LED(語音聲控) LED(人臉追蹤) LED(Google表單操控) 三色LED(調色盤) 蜂鳴器(多人協奏) 蜂鳴器(會說話的鬧鐘) 傳感器應用 超音波(改變圖片大小) 超音波(控制LED) 超音波(控制三色LED) 溫濕度(Firebase紀錄) RFID(控制Youtube) 可變電阻(改變Youtube音量) 聲音偵測(吹點矩陣蠟燭) 玩具改造 Smart自走車(組裝步驟) Smart自走車(網頁遙控器操控) Smart自走車(超音波避障) Smart自走車(溫濕度感測車) Smart智慧路燈(組裝步驟) Smart智慧路燈(接線教學) Smart飛天車(組裝步驟) Smart飛天車(接線教學) 馬克一號自走車(鍵盤操控) 馬克一號自走車(行動裝置操控) 馬克一號自走車(循跡功能) WABot機器人(初始化設定) WABot機器人(基礎操控) 百元玩具車大改造 智慧生活 智慧植栽(水泵) 智慧插座(組裝與操控) 智慧追蹤(伺服馬達+攝影機) Webduino雲端平台 基本介紹 註冊與登入 Blockly程式積木 Device裝置管理(裝置認證) Device裝置管理(雲端更新) 兌換券(領取與添加新功能) 發光元件 LCD螢幕 七段顯示器 輸入輸出 MP3播放器 環境偵測 PM2.5細懸浮微粒偵測 顏色感測器 電子羅盤 光度計 溫濕度計 資料庫 Google試算表(設定) Google試算表(儲存) Google試算表(讀取) 綜合應用 記錄PM2.5(Google試算表) 玩具改造 Smart智慧小屋(組裝步驟) Blockly教學 基本功能 變數 流程 文字 數學式 列表 邏輯 迴圈 進階功能 控制台 等待 數值轉換 鍵盤行為 語音聲控 語音朗讀 行動裝置 網頁互動區 文字、點擊、圖片 顏色、按鈕、拉霸 遙控器 Youtube 影像追蹤 創意應用 抽籤並朗讀姓名 大樂透自動選號 隨機組合朗讀語句 語音朗讀逐字稿 小時鐘 語音報時 九九乘法你問我答 BlocklyGames 迷宮 鳥 烏龜 影片 池塘導師 Dr.Smart教學 開發板元件 三色LED 三色LED(色彩輪播) 光敏電阻 光敏電阻(色彩變化) 按鈕開關 按鈕開關(控制顏色) 按鈕開關(控制Youtube) 元件及傳感器 LED 蜂鳴器 震動開關 LED點矩陣 超音波偵測 溫濕度偵測 綜合應用 蜂鳴器(多人協奏) 超音波(倒車雷達) 超音波(控制Youtube) LED點矩陣(顯示距離) LED點矩陣(顯示溫度) 按鈕開關(控制蜂鳴器) 實戰智慧插座 基本操控 組裝智慧插座 網頁操控智慧插座 傳感器應用 超音波偵測距離 光線偵測 人體紅外線偵測 聲音偵測 電視機遙控器 按鈕開關 電流急急棒 土壤濕度偵測 RFID感應 進階應用 語音辨識 人臉、顏色追蹤 手機陀螺儀 聊天室(原理) 聊天室(前後端實作) Google試算表(原理) Google試算表(前後端實作) Google地圖(原理) Google地圖(前後端實作) Youtube互動 Opendata實作 Node-Red(基礎操作) Node-Red(Twitter) Node-Red(E-mail) 日幣匯率(Node-Red爬蟲) 日幣匯率(Node-js爬蟲) 常見問題 Webduino相關 關於Webduino 購買Webduino產品 技術支援與合作 Webduino開發板 關於Webduino開發板 連線相關&初始化設定問題 Web:Bit相關問題 WebduinoSmart相關問題 其它問題



請為這篇文章評分?