第一章 連接世界 - 碁峰資訊epaper.gotop.com.tw/pdfsample/a512.pdf · 1 第一章...

12
1 第一章 連接世界 JavaScript 獨特之處在於彈性高,能夠在各種環境中執行,雖然這支程式語言最早源起 於網頁瀏覽器,然而經過多年演變成長,時至今日,不僅驅使著網站應用程式的發展, 也能在資料庫和機器人的系統上運行。當我們談論後面那兩個領域時,往往會交替混用 JavaScript Node.js(一套 JavaScript 執行環境)這兩個詞彙。 如果沒有 JavaScript ,要讓各種設備與裝置連上網路的話,將需要以三種不同的程式語 言撰寫軟體。特別是嵌入式裝置,其本身往往要求使用 C C++,然而網頁瀏覽器的使 用者介面那一端,卻需要網站開發技術,扣掉嵌入式裝置和使用者介面之後,負責網路 傳輸溝通的中間層軟體,可能還要另一支不同的程式語言。 當我們需要在不同環境上面進行開發作業時,JavaScript 是個值得考慮採用的選項,因 其已逐漸成為四處通用的程式語言。本章開頭將會概觀介紹嵌入式裝置、以及如何連接 任何東西,然後帶領你進入 JavaScript 的基礎課程,介紹 JavaScript 各種不同的執行環 境。此外,還會學習 Node.js 的背景知識。 為什麼需要物聯網? 從物理層級來看,電腦由含有幾億(上看幾十億)個電晶體的矽晶片組合而成,電晶體 的作用就如同開關一般,不是負責儲存狀態、就是執行二進位運算。若與機械開關相比 較,操縱電晶體的方式是透過電壓和電子訊號。 隨著技術演進,電晶體的體積越來越小,人們把此種現象稱為 摩爾定律Moores Law)。為了明白電晶體的運作原理、以及其未來發展,讓我們把電腦放在顯微鏡底下, 仔細檢視一番。

Upload: others

Post on 27-Aug-2020

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 第一章 連接世界 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A512.pdf · 1 第一章 連接世界. JavaScript 獨特之處在於彈性高,能夠在各種環境中執行,雖然這支程式語言最早源起

1

第一章

連接世界

JavaScript獨特之處在於彈性高,能夠在各種環境中執行,雖然這支程式語言最早源起於網頁瀏覽器,然而經過多年演變成長,時至今日,不僅驅使著網站應用程式的發展,

也能在資料庫和機器人的系統上運行。當我們談論後面那兩個領域時,往往會交替混用

JavaScript和 Node.js(一套 JavaScript執行環境)這兩個詞彙。

如果沒有 JavaScript,要讓各種設備與裝置連上網路的話,將需要以三種不同的程式語言撰寫軟體。特別是嵌入式裝置,其本身往往要求使用 C或 C++,然而網頁瀏覽器的使用者介面那一端,卻需要網站開發技術,扣掉嵌入式裝置和使用者介面之後,負責網路

傳輸溝通的中間層軟體,可能還要另一支不同的程式語言。

當我們需要在不同環境上面進行開發作業時,JavaScript是個值得考慮採用的選項,因其已逐漸成為四處通用的程式語言。本章開頭將會概觀介紹嵌入式裝置、以及如何連接

任何東西,然後帶領你進入 JavaScript的基礎課程,介紹 JavaScript各種不同的執行環境。此外,還會學習 Node.js的背景知識。

為什麼需要物聯網?

從物理層級來看,電腦由含有幾億(上看幾十億)個電晶體的矽晶片組合而成,電晶體

的作用就如同開關一般,不是負責儲存狀態、就是執行二進位運算。若與機械開關相比

較,操縱電晶體的方式是透過電壓和電子訊號。

隨著技術演進,電晶體的體積越來越小,人們把此種現象稱為摩爾定律(Moore’s

Law)。為了明白電晶體的運作原理、以及其未來發展,讓我們把電腦放在顯微鏡底下,

仔細檢視一番。

Page 2: 第一章 連接世界 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A512.pdf · 1 第一章 連接世界. JavaScript 獨特之處在於彈性高,能夠在各種環境中執行,雖然這支程式語言最早源起

2 | 第一章 連接世界

電晶體由不同的物質所組成,包括導體、絕緣體、半導體,所有物質層都堆積在矽基板

之上,藉由變更基板的電子性質,便可建構出電晶體。在電晶體的頂部,有一金屬層,

該處可構成電子電路。矽晶片的視覺示意圖,請見圖 1-1。

圖 1-1 電晶體由絕緣體、半導體、導體物質組合構成(A. C. Redolfi繪製)

電晶體的形狀由光微影技術的輔助加以決定,使用所謂的「步進式晶片曝光機」,把電

晶體的影像投射到矽晶圓上,這些機器正是摩爾定律背後的主要驅動力量之一。

藉由減少光的波長,就可以把電晶體的體積從毫米尺度、縮減到數十奈米尺度(一般來

說,我們相信電晶體的大小可以縮減到次奈米尺度)。

因製程進步、使得電子裝置越來越小,導致計算裝置的數量呈爆炸性成長,不論是在家

庭、工作場合、或是公共區域,電腦隨處可見,對人們的生活、旅遊、學習和工作方

式,帶來翻天覆地的革命性轉變。

然而,直到最近不久,大部分電子裝置彼此之間的溝通傳輸方式,相當稀少;我們從物

聯網(Internet of Things, IoT)的概念可預測,在不久的將來,將會發生遽變,再次革新現代社會的日常生活。藉由連接各種裝置與設備,工程師就有能力創造出更為聰明的環

境,應用到各個領域,諸如物流貨運、製造生產與醫療保健等方面。

為了能夠把各種裝置連接在一起,工程師必須解決硬體、軟體、網路傳輸協定等等問

題。接下來,讓我們深入看看嵌入式裝置,以及裝置之間如何進行溝通傳輸。

Page 3: 第一章 連接世界 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A512.pdf · 1 第一章 連接世界. JavaScript 獨特之處在於彈性高,能夠在各種環境中執行,雖然這支程式語言最早源起

為什麼需要物聯網? | 3

電晶體與積體電路的歷史

1947年,威廉·蕭克利(William Shockley),以及約翰·巴丁(John Bardeen)和沃爾特·布拉頓(Walter Brattain),發現如何運用半導體來建構電子開關。

1953年於曼徹斯特大學,史上第一台由電晶體焊接而成的電腦誕生了,1958年,傑克·基爾比(Jack Kilby)構思設計出另一項突破性的技術:積體電路(Integrated Circuit, IC)。

打從那時起,因為能夠在小小的空間裡塞進一大堆電晶體,致使所有種類的計

算機器,體積大幅縮小,走入到每個人的房間與桌上。後來,更甚者,積體電

路成為每個玩具與工廠的數位控制器的一部分。

晶片的電晶體密度越來越高,高登·摩爾(Gordon Moore)在 1965年做出重要的預測,也就是眾人熟知的摩爾定律:他發現積體電路裡的電晶體密度,每

18個月就會翻倍。因為電晶體的體積不斷縮減,而且由於摩爾定律至今為止仍然成立,使得數千家的公司與數以百萬計的民眾,都能負擔得起計算機和電腦

的費用,即便許多人抱持懷疑態度,但摩爾定律在今天依然顛撲不破。

嵌入式裝置

嵌入式裝置可擁有許多功能,如播放音樂、追蹤人體移動、或是辨識卡車裡的包裹。嵌

入式裝置通常會由一或多個建構區塊所組成,如圖 1-2所示。

顯示器

感測器

微控制器/ 微處理器

嵌入式裝置

控制面板

馬達

網路

圖 1-2 嵌入式裝置由好幾個不同的建構區塊所組成

Page 4: 第一章 連接世界 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A512.pdf · 1 第一章 連接世界. JavaScript 獨特之處在於彈性高,能夠在各種環境中執行,雖然這支程式語言最早源起

24 | 第二章 Arduino閃爍燈光

微控制器入門

日常生活中的手錶、掌上型計算機、或是小型收音機,裡頭大概都含有微控制器

(Microcontroller Unit, MCU)。

如圖 2-1所示,微控制器提供輸入腳位與輸出腳位,用來與外在物理環境互動。除了實體腳位之外,微控制器還會執行程式,依據它懂得的指令集,處理從腳位進來的事件。

-指令集-程式記憶體-執行期間記憶體

例子 例子

輸出

輸入

腳位

感測器、 致動器、 電子零件

麵包板、 Grove端子、 模組

Arduino Uno、 Espruino、 Tessel 2

圖 2-1 微控制器提供連接腳位和執行程式的能力

微控制器的指令集,僅支援幾個執行動作,像是基本的算術運算,或是操控程式的執行

流程。

大部分的程式設計師,應該都會認為以指令集的十六進位代碼來撰寫程式,是一件困難

的苦差事,因此微控制器的程式通常都是從高階語言編譯而成。其產出的二進位執行

檔,會被放進微控制器的快閃記憶體(flash memory),有時候會是唯讀記憶體(read-

only memory, ROM),皆屬於非揮發性的記憶體,意思是說,即便關掉電源後重啟,其內容仍然存在。Arduino的快閃記憶體,大小通常是 32 KB左右。

與之對比,微控制器的「靜態記憶體(static RAM, SRAM)」則是在程式執行時負責存放變數;SRAM屬於揮發性記憶體,也就是說,當你關掉電源,SRAM的內容就會消失不見。SRAM也比快閃記憶體來得小,Arduino的 SRAM大概只有 1~2 KB而已。

微控制器只能執行小小的程式,但這是權衡取捨後的結果,它們運作時消耗的電流也僅

有數個毫安培(milliampere, mA)而已,一般 Arduino開發板大概是 10∼ 20 mA。因為此一特性,使得微控制器非常適合用來建構只有電池可用的裝置。

Page 5: 第一章 連接世界 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A512.pdf · 1 第一章 連接世界. JavaScript 獨特之處在於彈性高,能夠在各種環境中執行,雖然這支程式語言最早源起

微控制器的功能區塊 | 45

小警告:並非所有數位腳位都可存取計時器/計數器,所以並非所有腳位都能送出

PWM訊號。一般的 Arduino開發板通常有 6個腳位擁有 PWM功能,這些腳位旁邊常常標示著「~」波浪符號。

腳位功能圖

查詢各個腳位的功能時,若要抱著規格書硬啃,所花時間未免太多,因此有人繪製出腳

位功能圖,如圖 2-11所示,以視覺化圖解形式,幫助你查詢各個腳位的功能與位置。

雖然規格書內容非常詳盡,忠實描述晶片內部的細節,但軟體開發人員大都只對晶片的

對外介面感到興趣。為了讓嵌入式軟體的開發工作更加便利,絕對需要準備一張腳位功

能圖,迅速查閱腳位的名稱、位置、功能。

圖 2-11  Arduino Uno腳位功能圖,秀出各腳位的位置與功能(http://www.pighixxx.com/test/pinouts/

boards/uno.pdf)

Page 6: 第一章 連接世界 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A512.pdf · 1 第一章 連接世界. JavaScript 獨特之處在於彈性高,能夠在各種環境中執行,雖然這支程式語言最早源起

系統單晶片嵌入網路功能 | 65

功能區塊圖

圖 4-3  Mediatek MT7620的功能區塊圖(取自 MIPS公司的軟體使用者手冊:https://people.freebsd.

org/~adrian/mips/MD00343-2B-24K-SUM-03.11.pdf)

只需看幾眼,並與先前章節介紹的微控制器比較,應該就能看出其中差異。為了提供網

路連線能力,這顆 SoC擁有效能超群的微處理器負責運行 MIPS 24K,並且嵌入整合式WiFi與乙太網路功能區塊。因為如此,許多網路閘道器和 WiFi路由器,都採用這顆晶片,非常受歡迎。

RISC(Reduced Instruction Set Computing,精簡指令集計算)

MIPS公司是率先推出 RISC商業電腦的先驅之一,我們可在特殊用途(如傳輸閘道器)或行動裝置上,找到 RISC的身影。顧名思義,RSIC代表的意思是以較少指令集來執行程式,因為採用「精簡」過的指令集,RSIC處理器的價格,比起競爭對手「複雜指令集(Complex Instruction Set Computing, CISC)」的處理器,通常較為低廉。MIPS 公司的創辦人之一是 John H. Hennessy 教授,電腦架構領域非常重要的研究者,也是史丹佛大學校長。

因為 Tessel 2有著 SoC,便可提供諸多連網功能,供網路裝置開發運用。舉例來說,你必須要燒錄 SD記憶卡、然後安裝映像檔到裝置裡,只要拆開 Tessel 2的箱子,就可立即撰寫 JavaScript程式。Tessel 2的 SoC已內建連接到 32 MB的快閃記憶體,而且也已經預先裝好 OpenWRT映像檔。

Page 7: 第一章 連接世界 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A512.pdf · 1 第一章 連接世界. JavaScript 獨特之處在於彈性高,能夠在各種環境中執行,雖然這支程式語言最早源起

76 | 第六章 單板電腦

但因為缺少微控制器,你也喪失掉 GPIO的即時操控能力。若需要從感測器讀取類比資料、或是要驅動馬達,往往必須回到簡單的二進位傳輸協定、並額外加裝晶片。雖說如

此,Raspberry Pi與其他單板電腦依然非常受歡迎,也已提供一大堆 3.3 V電壓準位的數位腳位,供我們用來控制電子零件。

Raspberry Pi有許多不同型號:Model A、Model B、Pi 2、Zero、Pi 3,大部分都內建乙太網路與 RJ45插槽,提供網路連線能力。若你想要建構無線產品,則需要另加 USB介面的 WiFi網路卡(Pi 3已內建 WiFi網路卡),若是沒有乙太網路的板子(如 Model A與 Zero),則可使用 USB轉乙太網路的轉接卡。

找出 Raspberry Pi的 IP位址

Raspberry Pi的作業系統,預設通常會以 DHCP(Dynamic Host Configuration Protocol,動態主機設定協定)取得 IP位址。這麼一來,把 Raspberry Pi放入網路之後,將會很難知道它的 IP位址為何。

除了以鍵盤滑鼠登入的做法之外,可運用其他工具,查知 Raspberry Pi的 IP位址。

舉例而言,Mac OS X 與 Linux 可使用 nmap 工具(http://linuxcommand.org/

man_pages/nmap1.html),安裝後,輸入底下指令,可在指定範圍內的網路 IP位址中,尋找開放的連接埠:

$ nmap -p 22 --open -sV 192.168.2.0/24

掃描連接埠的作業,需花上數秒鐘,若一切正常,應可看到類似底下的訊息:

Starting Nmap 6.46 ( http://nmap.org ) at 2014-07-13 14:10 CEST

Strange error from connect (65):No route to host

Nmap scan report for myrouter.ip (192.168.2.1)

Host is up (0.0024s latency).

PORT STATE SERVICE VERSION

80/tcp open http Router HAD23V WAP http config

Service Info: Device: WAP

Nmap scan report for MYRPI (192.168.2.103)

Host is up (0.024s latency).

PORT STATE SERVICE VERSION

22/tcp open sshd

另一種做法是在智慧型手機上安裝 App,已有好幾支 App可資利用,幫你管理Raspberry Pi。

Page 8: 第一章 連接世界 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A512.pdf · 1 第一章 連接世界. JavaScript 獨特之處在於彈性高,能夠在各種環境中執行,雖然這支程式語言最早源起

BeagleBone | 77

BeagleBoneBeagleBone 計畫由 TI(Texas Instruments,德州儀器)、DigiKey、Element14 於 2008年發起,自從第一代 BeagleBone板子問世後,已經過數次改版。

BeagleBone最受歡迎的版本是 BeagleBone Black。這張板子含有 AM335,是一顆 ARM架構的 Cortex A8處理器,256 MB的 RAM,運作時脈頻率 1 GHz,而且板子已內建 2 GB的快閃記憶體。

BealgeBone Black單板電腦已內建許多周邊功能,如 micro-HDMI端子可連接螢幕輸出視訊,以及 SD卡插槽作為外部儲存空間,也具備乙太網路孔,輕鬆連上網路。若想使用WiFi的話,則必須自行加裝WiFi網卡,如圖 6-1所示。

圖 6-1 BeagleBone Black插上 USB介面的WiFi網卡

BeagleBone Black 這塊板子已預先裝好 Linux 發行套件 Debian,並擁有自己的JavaScript執行環境,叫做 BoneScript。

BeagleBone Black支援 I2C與 SPI傳輸匯流排,更新且更便宜的 BeagleBone Green板子還擁有 Grove端子,可加裝各種 I2C電子裝置。

BeagleBone 板子內建 ADC,負責類比轉數位的轉換工作,這是 Raspberry Pi 沒有的 功能。

若想初步接觸 BeagleBone,可參閱官方文件「BeagleBone與 BeagleBone Black入門手冊」(http://beagleboard.org/getting-started),照著指引一步步熟悉。

Page 9: 第一章 連接世界 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A512.pdf · 1 第一章 連接世界. JavaScript 獨特之處在於彈性高,能夠在各種環境中執行,雖然這支程式語言最早源起

node-serialport程式庫 | 113

因為 RX與 TX是裝置之間的實體連接線路,所以傳輸協定可盡量保持簡單,只需事前定義好資料傳輸速率,就不需要額外的時脈訊號。當你希望擁有彈性更高的傳輸方式

時,可以在發送器與接收器之間共享時脈訊號,使用同樣的時序資訊。

圖 8-3 CodeBender平台,如同把 Arduino IDE放進瀏覽器,進行序列傳輸

圖 8-4 序列傳輸介面提供裝置之間傳輸資料的溝通協定

序列埠的核心建構區塊是 UART(Universal Asynchronous Receiver and Transmitter,通

用非同步收發傳輸器),但某些序列埠的規格書寫著採用的元件是 USART(Universal

Synchronous / Asynchronous Receiver and Transmitter,通用非同步/同步收發傳輸器)。

若是 UART,時脈資訊自動從傳入的資料串流取得,可稍稍簡化序列埠的組態設置;若

Page 10: 第一章 連接世界 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A512.pdf · 1 第一章 連接世界. JavaScript 獨特之處在於彈性高,能夠在各種環境中執行,雖然這支程式語言最早源起

130 | 第九章 網路協定

HTTPHTTP(HyperText Transfer Protocol,超文本傳輸協定)描述客戶端與伺服器之間的狀態傳輸規則,HTTP是全球資訊網路的礎石之一。藉由 HTTP,嵌入式裝置能夠回應來自網路上其他地方的請求,或者,也能自己送出代表更新資訊或抓取檔案的請求,送給

別台伺服器。

請求氣象資訊

因為氣象站台和所需顯示器較為簡單,非常適合用來介紹 HTTP請求與回應的用法,讓我們輕易了解嵌入式裝置如何運用 HTTP與外界溝通。在硬體方面,可使用 Grove零件模組(請見第 7章)來建構簡單的氣象顯示器。另一條路則是到 eBay、SparkFun或Adafruit購買小型顯示器與溫濕度感測器,然後自行焊接。

採購氣象顯示器所需零件,可能需要等待幾天,在此同時,可先玩玩智慧型手機上的天

氣 App,研究有何功能,嘗試指定某個地區,看看會發生什麼事情。

請看圖 9-1的左半邊,你的智慧型手機扮演著使用者代理人的角色,從公開的氣象資料庫、請求取得氣象資料。智慧型手機是台「輸出」裝置,擁有顯示螢幕與連接網路的 能力。

公開的 氣象資料

請求

回應

氣象 顯示器

本地端 伺服器

溫度 感測器 1

溫度 感測器 2

輸出裝置

輸入裝置

資料存儲地

圖 9-1 氣象資訊來自各個地方,並且有不同的輸出(顯示器)與輸入(感測器)

藉由加入作為「輸入」裝置的感測器,你可以連接自己的氣象站台到顯示器,此部分位

於圖 9-1的右半邊。

Page 11: 第一章 連接世界 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A512.pdf · 1 第一章 連接世界. JavaScript 獨特之處在於彈性高,能夠在各種環境中執行,雖然這支程式語言最早源起

HTTP | 131

輸出入裝置並不能直接轉換成 HTTP請求與回應,根據 RFC2616(https://www.w3.org/

Protocols/rfc2616/rfc2616-sec6.html),回應提供了狀態碼和訊息主體。這份訊息主體才是

該被處理分析的部分,然後把資料放到顯示器上。

採用 JavaScript作為開發語言的話,不論是在網頁瀏覽器、命令列、或是嵌入式裝置上,你都能快速寫出氣象功能的雛型。此時由 Node.js腳本程式而非瀏覽器來扮演「使用者代理人」的角色,腳本程式代表使用者,向氣象站台請求取得氣象資訊,各個不同

的氣象顯示器,都能向相同的(公開)資料庫抓取氣象資料,如圖 9-2所示。

公開

使用者代理人

氣象顯示器

請求

回應

圖 9-2 氣象資料與站台的客戶端

網路上有好幾個公開提供氣象資訊的資料庫網站。在 npm管理的眾多模組之中,可找到專門負責存取氣象資料的模組,其中一個相當不錯的選擇是 weather-js(https://www.

npmjs.com/package/weather-js)。

請新增資料夾,以底下指令進行初始化,並安裝所需模組:

$ npm init -y

$ npm install weather-js

接下來撰寫腳本程式,從 MSN天氣預報服務網站,抓取氣象資訊:

// hello_weather.js

var weather = require('weather-js');

var location = 'Paris, France';

var degreeType = 'C';

weather.find({search: location, degreeType: degreeType}, function(err, result) {

if (err) {

console.log(err);

process.exit(0);

}

console.log(result);

});

在上面程式的背後,Node.js模組 request與 xml2js會發出 HTTP請求,並且以 JSON格式把 HTTP回應交給你。在連接嵌入式裝置、運用所取得的氣象資訊之前,讓我們先在命令列模式裡,迅速地檢查看看 API是否能正常運作。

Page 12: 第一章 連接世界 - 碁峰資訊epaper.gotop.com.tw/PDFSample/A512.pdf · 1 第一章 連接世界. JavaScript 獨特之處在於彈性高,能夠在各種環境中執行,雖然這支程式語言最早源起

系統設計與 NodeRED | 187

每個節點可以是輸入(INPUT)節點、輸出(OUTPUT)節點、或是處理(PROCESS)節點。一般來說,輸入節點會啟動 FLOW,通常會從外部來源取得輸入,而且至少擁有一個輸出。以圖 11-5所示範例來說,其輸入是 Twitter搜尋關鍵字「javascript」的 結果。

圖 11-5 不同的節點類型:輸入、處理、輸出

處理節點有一個輸入、至少一個輸出,必定是從另一個節點取得輸入。在這個範例裡,

其輸入來自於 Twitter的輸出,而節點本身拿到東西後,會進行情感分析。

輸出節點一般來說會是 flow的終點,從其他節點取得輸入,其輸出則送出到外界。在這個範例裡,輸出會送到「除錯主控台」,你也可以把除錯輸出轉向到伺服器程序。

從節點傳送到另一節點的資料,NodeRED稱之為 MESSAGE(訊息)。訊息是個 JSON格式的物件,裡頭至少要有個叫做「payload」的元素,但可以有多個根元素。在這個範例裡,訊息內含有名為「topic」的元素。

底下列出從 Twitter送出來的資料範例,名為「antwerp」:

1 Mar 13:36:35 - [info] [debug:2f55a60b.8dc4aa]

{ score: 2,

comparative: 0.11764705882352941,

tokens:

[ 'we',

'are',

'proud',

'to',