Wednesday, October 7, 2015

Thông thường để xây dựng một trang web / ứng dụng web bạn cần hai thành phần
- web server (apache, lighttpd, boa, ...)
- source code web (html, javascript, php, ...)

Cách này thường được dùng để xây dựng các trang web để xuất bản lên internet mà ta truy cập hằng ngày.

Trong thưc tế các thiết bị mạng mà bạn sử dụng hằng ngày như router, modem <wifi>, switch<repeater wifi> đều được build sẵn một giao diện qủan trị bằng giao diện web mà bạn dễ dàng truy cập bằng địa chỉ ip gateway như 192.168.1.1



Cũng là một giao diện web như các trang web thôngg thường nhưng có sự khác biệt lớn về nguyên tắc hoạt động bên trong. Thay vì source code được viết bằng các ngôn ngữ web thì ở đây source code được viết bằng các ngôn ngữ khác như C/C++, Perl hay Python, để làm được điều đó người ta cần một bộ công cụ gọi là web application toolkit.
Chính vì source code không được viết bằng ngôn ngữ web nên trong quá trình chạy, nó cần một chương trình thông dịch đứng ở giữa để làm nhiệm vụ dịch các http request thành các API C/C++ tương ứng, thưc thi request bằng C/C++, trả lại kết quả, chương trình thông dịch sẽ dịch các kết quả trả về thành http respond thông thường. Chương trình đứng giữa đó gọi là CGI.
Kiểu hoạt động này có ưu điểm thực thi rất nhanh và ổn định, có thể dễ dàng điều khiển truy cập các thành phần / thiết bị ngoại vi của thiết bị vì request đã được dịch sang ngôn ngữ C/C++, chính vì thế nó là cách để xây dựng các giao diện quản trị nền web của các thiết bị nhúng như router, modem ... mà ta thường thấy.

Trong bài viết này sẽ hướng dẫn xậy dựng một Web Application Toolkit dựa trên bộ công cụ Web Toolkit gọi là Wt.

Thư viện phụ thuộc (tối thiểu):
- boost
- fcgi
- openssl
- zlib

Xem hướng dẫn cross.

Có thể build thêm các lib sau để dùng full tính năng cảu Wt:
- GraphicsMagick-1.3.21
- postgresql-9.4.4
- pango-1.37.0


1. Build Wt:
 mkdir release  
 cd release  
   
   
 "create ToolChain.cmake in release directory"  
 SET(CMAKE_SYSTEM_NAME Linux)   
 SET(CMAKE_C_COMPILER /opt/FriendlyARM/toolschain/4.4.3/bin/arm-none-linux-gnueabi-gcc)   
 SET(CMAKE_CXX_COMPILER /opt/FriendlyARM/toolschain/4.4.3/bin/arm-none-linux-gnueabi-g++)   
 SET(CMAKE_FIND_ROOT_PATH /path/to/dependent/install)   
 SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)   
 SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)   
 SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)  
 SET(BOOST_DIR /path/to/boost/install)  
 SET(BOOST_INCLUDEDIR /path/to/boost/install/include)  
 SET(BOOST_LIBRARYDIR /path/to/boost/install/lib)  
   
 "create Makefile by cmake"  
 DEPEND_LIB_DIR=/path/to/dependent/install  
 export CFLAGS=-I${DEPEND_LIB_DIR}/include  
 export CPPFLAGS=-I${DEPEND_LIB_DIR}/include  
 export LDFLAGS="-L${DEPEND_LIB_DIR}/lib -pthread -lm"  
 export PKG_CONFIG_PATH=${DEPEND_LIB_DIR}/lib/pkgconfig  
 export LD_LIBRARY_PATH=${DEPEND_LIB_DIR}/lib  
 export PATH=$PATH:${DEPEND_LIB_DIR}/bin:${DEPEND_LIB_DIR}/sbin  
   
 export PREFIX=/friendlyarm
 cmake -DCMAKE_TOOLCHAIN_FILE=ToolChain.cmake \  
 -DCMAKE_BUILD_TYPE=RELEASE \  
 -DCMAKE_INSTALL_PREFIX=$PREFIX ..  
   
   
 make   
 make install  

Chú ý:
- CMAKE_FIND_ROOT_PATH: path đến thư mục install các thư viện phụ thuộc đã installed (boost, fcgi, openssl, ...)
- BOOST_DIR: path đến thư mục đã installed boost

Nói chung nên install tất cả các thư viện phụ thuộc vào chung một folder


2. Buid Wt application
Chương trình ví dụ hello.C được lấy trong thư mục examples của gói thư viện Wt.

 export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin   
 export CROSS=arm-none-linux-gnueabi-   
 export HOST=arm-none-linux-gnueabi   
   
   
 DEPEND_LIB_DIR=/path/to/dependent/install  
 export CFLAGS=-I${DEPEND_LIB_DIR}/include  
 export CPPFLAGS=-I${DEPEND_LIB_DIR}/include  
 export LDFLAGS="-L${DEPEND_LIB_DIR}/lib -pthread -lm -lwt -lwthttp -lwtfcgi"  
 export PKG_CONFIG_PATH=${DEPEND_LIB_DIR}/lib/pkgconfig  
 export LD_LIBRARY_PATH=${DEPEND_LIB_DIR}/lib  
 export PATH=$PATH:${DEPEND_LIB_DIR}/bin:${DEPEND_LIB_DIR}/sbin  
 LIBS="-Wl,-rpath-link -Wl,$DEPEND_LIB_DIR/lib"  
   
 "build"  
 arm-xilinx-linux-gnueabi-g++ hello.C -o hello ${CFLAGS} ${LDFLAGS} ${LIBS}  

Chạy ví dụ:
 "run"  
 ./hello --docroot . --http-address 0.0.0.0 --http-port 80 #port web 80
   

Mở trình duyệt lên và truy cập địa chỉ http://localohost


Wt sẽ chạy một web server local được build-in có tên wtpttp, nếu bạn muốn truy cập được ứng dụng web app như trên từ một máy tính khác thì cần một web server như appache hay lighttpd.

Trong blog này chúng ta sử dụng lighttpd cho đơn giản, sua khi build xong web server các bước cần thực hiện là:
- chạy web server
- chạy ví dụ hello ở trên
- trên một máy tính khác, mở trình duyệt vào truy cập
  http://192.168.1.100  trong đó 192.168.1.100 là địa chỉ của máy server.

Leave a Reply

Subscribe to Posts | Subscribe to Comments

- Copyright © Lập trình hệ thống nhúng Linux . Powered by Luong Duy Ninh -