Sunday, October 11, 2015



XML-RPC là gì ?
XML-RPC là một cài đặt RPC (Remote Procedure Call) trên nền giao thức HTTP, sử dụng XML để mã hoá và trao đổi dữ liệu.

Vậy RPC là gì?
Khi bạn viết chương trình, ắt hẳn bạn cũng đã quen với các khái niệm thủ tục và hàm. Các đoạn chương trình lặp đi lặp lại bạn viết lại thành 1 hàm (hay thủ tục) và sau đó khi dùng chỉ cần gọi thủ tục hoặc hàm đó với các tham số thích hợp. Các thủ tục hoặc hàm đó bạn có thể:
– Để chung trong 1 file nguồn cùng với chương trình chính,
– Để trong 1 file nguồn khác và được include vào file nguồn chính khi cần,
– Được biên dịch sẵn và để trong 1 thư viện hoặc unit để các chương trình khác của bạn (cùng được viết bằng 1 ngôn ngữ) sử dụng,
– Được biên dịch sẵn để trong file DLL để các chương trình (được viết bằng các ngôn ngữ khác nhau) sử dụng.

Điểm chung của tất cả các phương thức trên là các hàm và thủ tục cần gọi đều nằm trên cùng 1 máy với nơi gọi chúng. Tuy nhiên bạn có thể thấy là nơi gọi và hàm cần gọi có thể được tách rời nhau ra: từ chung file, đến khác file, rồi đến khác ngôn ngữ.

RPC – Remote Procedure Call (lời gọi hàm xa)
Là một mở rộng của lời gọi hàm (procedure call) theo cách cổ điển. Giờ đây hàm cần gọi và nơi gọi hàm có thể nằm ở 2 máy tính khác nhau; thậm chí có thể cách xa nhau nửa vòng trái đất, nối với nhau qua mạng internet.

Một ví dụ đơn giản của XML-RPC là tạo một web service caung cấp thông tin về thời tiết của một khu vực địa lý nào đó:
- XML-RPC client gọi một hàm có tên getWeatherInfo("DaNang City") với tham số đầu vào là địa điểm cần lấy thông tin là "DaNang City"
- Các thông tin sẽ được đóng gói và mã hóa dưới dạng XML, truyền đến XML-RPC server qua kết nối web thông thường là http(s)
- Server nhận request, mở gói, giải mã, thực hiện hàm  getWeatherInfo và trả về kết quả lại cho XML-RPC client theo cách tương tự như khi client gửi thông tin đi
- Client nhận lai được response, mở gói, giải mã, phân tích và hiển thị thông tin nhận được.





Trong bài viết này sẽ hướng dẫn build một thư viện có tên XML-RPC for C and C++. Ngữ cảnh đặt ra trong bài viết này là chúng ta sẽ build chương trình XML-RPC client chạy trên máy tínhXML-RPC server chạy trên board nhúng (Mini2440)

Các bước thực hiện:
- Truy cập http://xmlrpc-c.sourceforge.net để download source code (xmlrpc-c-1.33.17)
- Tiến hành giải nén và build thư viện xmlrpc-c-1.33.17
Các thư viện phụ thuộc:
    + curl
    + libxml2
    + openssl
Xem hướng dẫn cross.

Build xmlrpc-c trên máy tính:
 yum install libcurl-devel  
 yum install libxml2-devel  
 yum install openssl-devel     
    
 ./configure --prefix=/path/to/xmlrpc/client/install  
 make  
 make install  

Build xmlrpc-c cho board:
 export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin   
 export CROSS=arm-none-linux-gnueabi-    
 export HOST=arm-none-linux-gnueabi  
   
 #first
 ./configure  
 make CC=gcc CXX=g++ -C lib/expat/gennmtab  
   
 #second
 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   
 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 

 PREFIX=/path/to/xmlrpc/server/install
 ./configure --prefix=$PREFIX --host=${HOST} \  
 CC=${CROSS}gcc \  
 CXX=${CROSS}g++  
   
 make  
 make install  
   

- Build ví dụ
Trong thư mục xmlrpc-c-1.33.17/examples có ví dụ chạy chương trình tính tổng
 xmlrpc_sample_add_client.c  
 xmlrpc_sample_add_server.c  

Build chương trình client:
 DEPEND_LIB_DIR=/path/to/xmlrpc/client/install  
 export CFLAGS="-I${DEPEND_LIB_DIR}/include -I${DEPEND_LIB_DIR}/include/xmlrpc-c"
 export CPPFLAGS=${CFLAGS}
 export LDFLAGS=-L${DEPEND_LIB_DIR}/lib
 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

 XMLRPC_C_CONFIG=xmlrpc-c-config
 INCLUDES=$($XMLRPC_C_CONFIG client abyss-server cgi-server --cflags)
 LIBS=$($XMLRPC_C_CONFIG client abyss-server cgi-server --libs)

 gcc xmlrpc_sample_add_client.c ${CFLAGS} ${INCLUDES} ${LIBS}  

Build chương trình server:
 export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin   
 export CROSS=arm-none-linux-gnueabi-    
 export HOST=arm-none-linux-gnueabi   
     
 export CFLAGS="-I${DEPEND_LIB_DIR}/include -I${DEPEND_LIB_DIR}/include/xmlrpc-c"
 export CPPFLAGS=${CFLAGS}
 export LDFLAGS=-L${DEPEND_LIB_DIR}/lib
 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

 XMLRPC_C_CONFIG=xmlrpc-c-config
 INCLUDES=$($XMLRPC_C_CONFIG client abyss-server cgi-server --cflags)
 LIBS=$($XMLRPC_C_CONFIG client abyss-server cgi-server --libs)
   
 arm-none-linux-gnueabi-gcc xmlrpc_sample_add_server.c ${CFLAGS} ${INCLUDES} ${LIBS}  


- Copy toàn bộ thư viện và chương trình xmlrpc server xuống board
- Source biến môi trường và chạy chương trình server trên board
   
 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  
 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  
   

- Source biến môi trường và chạy chương trình client trên máy tính


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 -