Saturday, October 17, 2015

Tương tự như XML-RPC thì SOAP cũng là một giao thức dùng để làm ứng dụng web service để server phục vụ yêu cầu của client, trong đó client gọi một function đến server để server thực hiện function đó và trả về kết quả.

                                  

Nếu so sánh thì XML-RPC thực sự đơn giản, dễ dàng để thực hiện trong khi đó SOAP thì phức tạp và mạnh mẽ hơn nhiều.
Trong bài viết này chúng ta sẽ tiến hành build thư viện gSOAP, viết ứng dụng client-server demo cho giao thức SOAP. Hiện tại gSOAP là một thư viện được dùng phổ biến bởi rất nhiều hãng lớn trên thế giới, nó vẫn liên tục được cập nhật và phát triển.

1. Build gSOAP
- Download source gSOAP (version gSOAP-2.8)
- Thư viện phụ thuộc 
     + openssl
- Build gSOAP
 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  
 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  
   
 "buid soapcpp2 for host first"  
 ./configure  
 make CC=gcc CXX=g++ -C gsoap/src  
     
 export PREFIX=/path/to/gsoap/install  
 ./configure --prefix=$PREFIX --host=${HOST} \  
 CC=${CROSS}gcc \  
 CXX=${CROSS}g++ \  
 --with-openssl=${DEPEND_LIB_DIR}  
   
 "Modify config.h which have just is generated  
 comment #define malloc rpl_malloc  
 Note: fixbug ::malloc has not been declared  
 "  
   
 make   
 make install  


2. Giới thiệu gSOAP
Sau khi build xong gSoap chúng ta sẽ có hai chương trình chính trong thư mục bin:
2.1 soapcpp2 (stub/skeleton generator)
soapcpp2 -c <name of generated .h file e.g chatpp.h> cho chương trình C
soapcpp2 <name of generated .h file> hoặc 
soapcpp2 -i <name of generated .h file e.g chatpp.h> cho chương trình C++
Chương trình tạo ra các file.c và file.cpp implement các function đã define trong file.h

Trong gsoap-2.8/gsoap/bin/win32 đã có sẵn hai chương trình này cho Windows OS.




2.2 wsdl2h (schema importer)
wsdl2h <path and name of .wsdl file> -o <name of generated .h file e.g chatpp.h> 
file.wsdl là file mô tả về các function/kết nối mà một web service nào đó đang chạy. Chương trình wsdl2h sẽ phân tích file.wsdl này để tạo ra file.h từ đó sẽ dùng để viết một chương trình client cho web service đã có đó.




2.3 Nguyên lý hoạt động gSOAP





3. Ví dụ
Xét ví dụ soap-2.8/gsoap/samples/calc và soap-2.8/gsoap/samples/calc++

calc.h
File này định nghĩa các function và các cài đặt về gsoap ns.
 //gsoap ns service name:     calc Simple calculator service  
 //gsoap ns service protocol:     SOAP  
 //gsoap ns service style:     rpc  
 //gsoap ns service encoding:     encoded  
 //gsoap ns service namespace:     http://10.49.46.201:2012/calc.wsdl  
 //gsoap ns service location:     http://10.49.46.201:2012  
 //gsoap ns schema namespace:     urn:calc  
   
 Với http://10.49.46.201:2012  máy Server có địa chỉ IP: 10.49.46.201, serrvice chạy qua port 2012.  

Build ứng dụng calc:
 DEPEND_LIB_DIR=/path/to/gsoap-2.8-host/install  
 export CFLAGS="-I${DEPEND_LIB_DIR}/include -DWITH_OPENSSL"  
 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  
 export LIBS="-lm -lssl -lcrypto -lpthread"  
   
 Copy stdsoap2.c stdsoap2.h from gsoap-2.8/gsoap to samples/calc  
 Copy stdsoap2.cpp stdsoap2.h from gsoap-2.8/gsoap to samples/calc++  
   
 Compilation in C (see samples/calc):  
   soapcpp2 -c calc.h  
   cc -o calcclient calcclient.c stdsoap2.c soapC.c soapClient.c ${CFLAGS} ${LDFLAGS} ${LIBS}  
   cc -o calcserver calcserver.c stdsoap2.c soapC.c soapServer.c ${CFLAGS} ${LDFLAGS} ${LIBS}  
   
 Compilation in C++ (see samples/calc++):  
   soapcpp2 -i calc.h  
   cc -o calcclient++ calcclient.cpp stdsoap2.cpp soapC.cpp soapcalcProxy.cpp ${CFLAGS} ${LDFLAGS} ${LIBS}  
   cc -o calcserver++ calcserver.cpp stdsoap2.cpp soapC.cpp soapcalcService.cpp ${CFLAGS} ${LDFLAGS} ${LIBS}  
     


Chạy chương trình
server
 $ ./calcserver 2012  

client
 $ ./calcclient add 2 3  



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 -