文章類型
開發平台
解決方案
關注主題
文章類型
開發平台
解決方案
關注主題

將node.js的控制中心移植到QNAP上運行

作者:Perry Wu/編輯:賴芳如

pillaKloud之前派樂雲的控制中心主要運行在樹莓派上,雖然樹莓派價格便宜,但是考量到一般使用情況下,大眾對樹莓派的接受度還不是很高,所以試著將控制中心在QNAP上運行看看。

一拿到QNAP TS-251A,研究一下系統後,我認為有三個可能Porting的方向:

  1. 在Docker中運行
  2. 在Virtual PC中運行
  3. APP Center安裝運行

首先拿Docker來Porting,不過設置環境後,發現了一些預期之外的問題,於是就先將Docker擱置。而Virtual PC因為會瓜分掉原本NAS的CPU/記憶體空間,則是完全不列入考慮。

再來,考量到一般人最容易上手的應該是由APP Center安裝程式直接使用,所以,就先朝向App Center的開發進行。(雖然我個人傾向在Docker上運作,但需要再花些時間研究可行性……)

所以,這篇主要在講如何Porting一個node.js的應用到QNAP上。

首先來分析一下控制中心,它主要是由以下套件所組成:

  1. node.js 控制中心
  2. mysql 資料庫
  3. motion 進行動作偵測以及縮時攝影的程式
  4. ffmpge 縮時攝影需要用到的程式
  5. jhead 圖像編輯用
  6. nmap 掃描區網需要用的工具

查了一下,QNAP內建的有node.js、MariaDB (mysql compatible)以及jhead 這三個安裝,所以若要移植控制中心,仍需先把motion、ffmpge和nmap先Porting到系統中。

底下是我用到的步驟:

1. 安裝QPKG

要啟用開發模式,第一步當然是按照官網的文件指示,安裝QPKG。
官網說明連結:
https://wiki.qnap.com/wiki/QPKG_Development_Guidelines
下載QPKG連結:
http://download.qnap.com/QPKG/QDK/QDK_2.2.14.zip
解壓縮後,會得到一個QDK_2.2.14.qpkg檔案。

開啟QNAP NAS中的APP Center,選擇手動安裝套件,將這個套件帶入手動安裝的套件中。

完成安裝後,NAS中的QPKG的環境就設定完成。

2. 在X86上準備QNAP的Cross Compiler

先由以下連結下載x86的Cross compiler:
https://sourceforge.net/projects/qosgpl/files/QNAP%20NAS%20Tool%20Chains/cross-project-x86.u7-20111011.tar.gz/download

下載完成後,在linux主機上安裝這個cross compiler的環境。

以下指令會將cross compiler安裝到/opt/cross-project/x86下:

tar zxvf cross-project-x86.u7-20111011.tar.gz -C /

安裝好cross compiler後,每次登入系統要使用環境時,需要先執行以下指令:

sudo chroot /opt/cross-project/x86/sys-root

這樣能夠改變root path到cross compiler的環境,就可以使用QNAP打包好的開發環境了。

3. Porting motion、ffmpge、nmap

以下步驟都是在QNAP Cross Compiler的環境進行。
(sudo chroot /opt/cross-project/x86/sys-root)

a. 建立開發資料夾,所有需要編譯的程式都下載到這裡:

mkdir build

b. 安裝x264
下載以下程式碼:

git clone git://git.videolan.org/x264

解壓縮後,把程式碼放到build/x264之下:

./configure –disable-asm –enable-shared –prefix=/build/pk-ha-center
make; make install;

c. 安裝ffmpge

wget http://ffmpeg.org/releases/ffmpeg-3.0.tar.bz2
tar xvfj ffmpeg-3.0.tar.bz2
cd ffmpeg-3.0
mkdir tmp

CFLAGS=’-I /build/pk-ha-center/include/’ CPPFLAGS=’-I /build/pk-ha-center/include/’ LDFLAGS=’-L /build/pk-ha-center/lib/’ TMPDIR=/build/ffmpeg-3.0/tmp ./configure –disable-yasm –enable-shared –prefix=/build/pk-ha-center –enable-gpl –disable-libmp3lame –disable-librtmp –enable-shared –disable-libfaac –enable-libx264

d. 安裝motion

./configure –with-ffmpeg=/build/pk-ha-center/ –without-optimizecpu –prefix=/build/pk-ha-center –without-sqlite3

修改Makefile 中的CFLAGS,以及在LIBS 加入-I/include 和-lswresample -lm -lz, 如下所示:

e. 安裝nmap

wget https://nmap.org/dist/nmap-7.30.tar.bz2
./configure –prefix=/build/pk-ha-center –without-openssl –without-liblua
make; make install

經由以上步驟,在/build/pk-ha-center下面應該就會出現以下程式:
(在此我先省略內容檔,只顯示第一層的資訊,不然檔案會過多)

f. 安裝中控中心node.js 的modules
由於node.js的安裝是由npm下載相依套件完成的,過程中還可能會調用node-gyp來編譯程式,所以一定要事先下載能在Target System中運行的node_modules。

先將中控中心的整個node.js的程式碼,搬到/build/pk-ha-center/lib/node_modules/pk-ha_center下。

由於依然是在QNAP cross compiler環境下,所以執行npm安裝,若有需要編譯的部分,也會使用cross compiler編譯。

整個npm 安裝完成後,這個node.js程式就可以在QNAP NAS中執行了。

g. 打包QPKG
打包QPKG要在 QNAP NAS環境中執行,所以先以ssh登入QNAP環境,登入後
在/share/CACHEDEV1_DATA/Public 下開一個資料夾build,然後使用qbuild建立一個新專案:

cd /share/CACHEDEV1_DATA/Public
mkdir build; cd build;
qbuild –create-env ha-center

準備qpkg.cfg,底下是部分的ha-center/qpkg.cfg檔案:

接著準備package_routines,底下是部分的ha-center/package_routines檔案:

然後準備ha-center/share/ha-center.sh,QNAP之後會使用這個shell來呼叫我們的start/stop函式:

然後再把剛剛在cross compiler環境中打包的pk-ha-center.tar.gz ,下載到ha-center/share之下。

放在share下的東西,之後會完整安裝指定路徑(/share/CACHEDEV1_DATA/.qpkg/ha-center/)

最後再把ha-center/icons裡的圖示稍作修改,圖示的規則如下:

在ha-center這目錄,執行 qbuild,進行打包QPKG的動作。打包好的檔案,會放在ha-center/build中。我們可以拿這個檔案,直接使用手動的方式在APP Center中進行安裝:

裝起來就會看到這個畫面:

配圖_2

4. 運作

運行後,控制中心就可以在QNAP NAS上運行,接下來就能用簡單的方式控制家中的連網裝置,如下圖所示:

配圖_3

還可以達成裝置之間的連動控制,下面影片是在Maker Faire時展出的Demo:

 

5. 其他

但是,目前使用APP Center的方式還有一個滿大的問題,那就是:沒辦法簡易的讓使用者從外地直接存取家中設備。我向QNAP的技術支援詢問,他們提供一個Proxy的處理方式。

若使用這個方式存取http://192.168.100.124:8080/pillakloud (NAS存取為192.168.100.124:8000),則這樣的存取會被proxy到控制中心來,但這麼一來,URL PATH都會多一個path:

比如在html中,想要存取js的路徑是js/pk.js (相對路徑),然後,瀏覽器會開啟的路徑是192.168.100.124:8080/pillakloud/js/pk,所以控制中心收到這個要求時,要把中間的pillakloud拿掉,這樣就能夠正常處理。

最後,我認為在QNAP環境中Porting node.js的應用,應該都可以使用類似方法來達成。

(本文同步發表於作者部落格“Pillakloud技術宅”,原文連結

Perry Wu

Perry Wu

擁有近20年網路系統軟體開發經驗,涉獵範圍涵蓋了組合語言、驅動程式、核心模組、應用程式、網頁開發、雲端後台、系統整合。熟悉的領域為網路通訊、物聯網及雲端應用,近幾年主要使用node.js在進行系統開發。
熱愛自己動手做出生活周邊會使用的應用。目前為派樂雲(Pillakloud)創辦人,致力於提供豐富好用的智慧家庭雲服務。
Perry Wu

Latest posts by Perry Wu (see all)

上一篇: | 下一篇:

我想回應

你的電子郵件位址並不會被公開。 必要欄位標記為 *

邀您加入《MakerPro》粉絲團:Maker&Startup開發社群的學習與知識平台