完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 zxl_zxl 于 2016-5-29 21:57 编辑 NanoPiM2试用体验之基于gsoap的WebService开发 Webserive是不同开发平台、开发语言间数据共享的一种行业标准,我们开发出基于websevice的服务API,这些API对外以函数的形式提供接口,而函数本身实现具体的功能,其他开发语言设计的软件可以通过Webservice协议远程调用我们开发的服务器端函数提供的不同功能,并将运算结果反馈到调用端,实现不同开发平台、开发语言的数据共享,形成基于Webservice协议的C/S(Client/Server)架构。 对于基于C/S架构的数据库软件开发,我们通常不会直接让客户端软件直接通过用户名和密码去连接数据库,而是采用客户端调用服务器端的Webserice提供的相关函数,Webservice提供的函数去在服务器本地执行对数据库的SQL操作,这样可以大大提高对数据库操作的安全性,避免了在每一个客户端设置服务器端数据库的登陆名和密码。 本篇试用报告就是要实践如何安装、配置gsoap,以及如何配置和开发服务器端的Webservice程序和客户端的Webservice程序。 本篇报告分别在PC机端的Ubuntu系统下安装和配置gsaop,交叉编译可以在Nanopi M2 Debian系统下运行的WebService服务端程序,本地X86体系架构下gcc编译的可以在Ubuntu系统中运行的WebService客户端程序。 首先下载gsoap2.8源码:http://sourceforge.net/projects/gsoap2/ 然后通过samba将下载到的gsoap源码拷贝到PC机端的Ubuntu系统和Nanopi M2端的debian系统下。 1. PC机Ubuntu端 1.1 PC机端编译安装 gsoap 先安装gsoap依赖软件: 命令:sudo apt-get install bison 命令:sudo apt-get install flex 命令:sudo apt-get install libssl-dev 命令:sudo apt-get install openssl 在自己的用户目录下创建gsoap目录,以下命令均基于我本人的环境,请根据自己的实际情况替换成你自己的目录。 命令:mkdir /hom/xxx/gsoap (xxx代表你自己的用户目录) 命令:cp yyy/gsoap_2.8.32.zip/ /hom/xxx/gsoap (yyy代表你自己的samba目录路径) 命令:cd home/xxx/gsoap 命令:unzip gsoap_2.8.32.zip 命令:./configure --prefix=/usr/local/gSOAP 命令:make 命令:sudo make install (1)将源代码目录下gsoap子目录中的import目录拷贝到gSOAP目录下来; (2)gSOAP目录下建一个env目录,将gsoap/samples/link下的所有文件拷贝到env目录,并且生成envC.o(C版本要用到),方法是: cd 到env目录,然后: /usr/local/gSOAP/bin/soapcpp2 -penv -cenv.h g++ -c -I /usr/local/gSOAP/include envC.c 1.2 编写PC机端的程序 (1)头文件:SmsWBS.h //gsoap ns service name: SmsWBS //gsoap ns service style: rpc //gsoap ns service namespace: http://192.168.1.88:9000/SmsWBS.wsdl //gsoap ns service location: http://192.168.1.88:9000 //gsoap ns service encoding:encoded //gsoap ns schema namespace:urn:SmsWBS int ns__add(int num1, int num2, int *sum); 这个头文件需要注意的是,前面的 // 部分是有意义的,可以在上面修改,如果完全去掉,将会导致生成的中间文件不同,由此会引起要修改Makefile文件 (2)Makefile文件(本地编译): 比较关键,如果头文件中的 // 部分有修改,要检查是否要修改Makefile文件 GSOAP_ROOT=/usr/local/gSOAP WSNAME0=soap WSNAME=SmsWBS CC=g++ -g -DWITH_NONAMESPACES INCLUDE=-I $(GSOAP_ROOT)/include SERVER_OBJS=$(WSNAME0)C.o $(WSNAME0)Server.o stdsoap2.o CLIENT_OBJS=$(GSOAP_ROOT)/env/envC.o $(WSNAME0)ClientLib.o stdsoap2.o ALL_OBJS=${WSNAME}server.o $(WSNAME0)C.o $(WSNAME0)Server.o ${WSNAME}test.o$(WSNAME0)ClientLib.o #GSOAP_SRC=/usr/local/gsoap-2.7/gsoap all:server ${WSNAME}.wsdl:${WSNAME}.h $(GSOAP_ROOT)/bin/soapcpp2 -c$(GSOAP_ROOT)/import ${WSNAME}.h #stdsoap2.o:$(GSOAP_ROOT)/src/stdsoap2.c stdsoap2.o: stdsoap2.c $(CC) -c $? $(INCLUDE) $(ALL_OBJS):%.o:%.c $(CC) -c $? $(INCLUDE) server:Makefile ${WSNAME}.wsdl ${WSNAME}server.o$(SERVER_OBJS) $(CC) ${WSNAME}server.o$(SERVER_OBJS) -o ${WSNAME}server client:Makefile ${WSNAME}.wsdl${WSNAME}test.c $(ALL_OBJS) stdsoap2.o $(CC) ${WSNAME}test.o $(CLIENT_OBJS)-o ${WSNAME}test clean: rm -f *.o *.xml *.a *.wsdl *.nsmap$(WSNAME0)H.h $(WSNAME0)C.c $(WSNAME0)Server.c $(WSNAME0)Client.c$(WSNAME0)Stub.* $(WSNAME)$(WSNAME)Proxy.* $(WSNAME)$(WSNAME)Object.*$(WSNAME0)ServerLib.c $(WSNAME0)ClientLib.c $(WSNAME)server ns.xsd$(WSNAME)test (3)服务端程序SmsWBSserver.c: #include "soapH.h" #include "SmsWBS.nsmap" int main(int argc, char **argv) { int m,s; /* master and slave sockets */ struct soap SmsWBS_soap; soap_init(&SmsWBS_soap); soap_set_namespaces(&SmsWBS_soap, namespaces); if (argc < 2) { printf("usage: %s exit(1); } else { m = soap_bind(&SmsWBS_soap, NULL, atoi(argv[1]), 100); if (m < 0) { soap_print_fault(&SmsWBS_soap, stderr); exit(-1); } fprintf(stderr, "Socket connection successful: master socket = %dn",m); for (;;) { s = soap_accept(&SmsWBS_soap); if (s < 0) { soap_print_fault(&SmsWBS_soap, stderr); exit(-1); } fprintf(stderr, "Socket connection successful: slave socket = %dn",s); soap_serve(&SmsWBS_soap); soap_end(&SmsWBS_soap); } } return 0; } int ns__add(struct soap *add_soap, intnum1, int num2, int *sum) { *sum = num1 + num2; return 0; } (4)客户端程序SmsWBStest.c: #include #include #include "soapStub.h" #include "SmsWBS.nsmap" int add(const char *server, int num1, intnum2, int *sum); int add(const char *server, int num1, intnum2, int *sum) { struct soap SmsWBS_soap; int result = 0; soap_init(&SmsWBS_soap); soap_set_namespaces(&SmsWBS_soap, namespaces); soap_call_ns__add(&SmsWBS_soap, server, "", num1, num2, sum); if(SmsWBS_soap.error) { printf("soap error:%d, %s, %s ", SmsWBS_soap.error,*soap_faultcode(&SmsWBS_soap), *soap_faultstring(&SmsWBS_soap)); result = SmsWBS_soap.error; } soap_end(&SmsWBS_soap); soap_done(&SmsWBS_soap); return result; } int main(int argc, char **argv) { int result = -1; char* server="192.168.1.xxx:9000"; //192.168.1.xxx为Nanopi M2 Debian系统下载的IP地址 int num1 = 0; int num2 = 0; int sum = 0; if( argc < 3 ) { printf("usage: %s num1 num2 n", argv[0]); exit(0); } num1 = atoi(argv[1]); num2 = atoi(argv[2]); result = add(server, num1, num2, &sum); if (result != 0) { printf("soap err, errcode = %d n", result); } else { printf("%d + %d = %d n", num1, num2, sum); } return 0; } (5)拷贝stdsoap2.c拷贝到当前目录 命令:cp 源码目录/gsoap/stdsoap2.c ./ (6)编译和运行: 前面都已经准备好了,现在只需要: make ---得到服务端程序SmsWBSserver makeclient ---得到客户端程序SmsWBStest ./SmsWBSserver9000 ----运行服务端程序 出来类似下面的显示就表示运行正常 Socket connection successful: master socket= 3 如图所示: 再运行客户端程序: ./SmsWBStest 67 78 显示: 67 + 78 = 145 调用Web Service成功,如图示: 在浏览器中输入命令:192.168.1.124:9000 (124为我自己的IP地址),如果出现如图所示的界面说明我们运行的Webservice服务程序是成功的。 以上说明我们在Ubuntu环境中已经搭建好了gsoap Webservice开发环境,下面开始在Nanopi M2上搭建。 2. Nanopi M2端 (1)将上述程序拷贝到另外一个文件夹,比如: sudo mkdir add_ARM cp ./add/* ./add_arm (2)修改makefile GSOAP_ROOT=/usr/local/gSOAP WSNAME0=soap WSNAME=SmsWBS CC=arm-linux-g++ -g -DWITH_NONAMESPACES INCLUDE=-I $(GSOAP_ROOT)/include SERVER_OBJS=$(WSNAME0)C.o $(WSNAME0)Server.o stdsoap2.o CLIENT_OBJS=$(GSOAP_ROOT)/env/envC.o $(WSNAME0)ClientLib.o stdsoap2.o ALL_OBJS=${WSNAME}server.o $(WSNAME0)C.o $(WSNAME0)Server.o ${WSNAME}test.o $(WSNAME0)ClientLib.o #GSOAP_SRC=/usr/local/gsoap-2.7/gsoap all:server ${WSNAME}.wsdl:${WSNAME}.h $(GSOAP_ROOT)/bin/soapcpp2 -c$(GSOAP_ROOT)/import ${WSNAME}.h #stdsoap2.o:$(GSOAP_ROOT)/src/stdsoap2.c stdsoap2.o: stdsoap2.c $(CC) -c $? $(INCLUDE) $(ALL_OBJS):%.o:%.c $(CC) -c $? $(INCLUDE) server:Makefile ${WSNAME}.wsdl${WSNAME}server.o $(SERVER_OBJS) $(CC) ${WSNAME}server.o$(SERVER_OBJS) -o ${WSNAME}server client:Makefile ${WSNAME}.wsdl${WSNAME}test.c $(ALL_OBJS) stdsoap2.o $(CC) ${WSNAME}test.o $(CLIENT_OBJS)-o ${WSNAME}test clean: rm -f *.o *.xml *.a *.wsdl *.nsmap$(WSNAME0)H.h $(WSNAME0)C.c $(WSNAME0)Server.c $(WSNAME0)Client.c$(WSNAME0)Stub.* $(WSNAME)$(WSNAME)Proxy.* $(WSNAME)$(WSNAME)Object.* $(WSNAME0)ServerLib.c$(WSNAME0)ClientLib.c $(WSNAME)server ns.xsd $(WSNAME)test 主要是把编译工具链g++修改为arm-linux-g++,以编译可以在ARM平台上运行的服务端程序。 然后执行命令: make ------------生成可以在Nanopi M2上运行的服务器端程序SmsWBSserver 将SmsWBSserver拷贝到/nfsshare目录下,以供Nanopi M2系统调用: sudo cp ./add_arm/SmsWBSserver /nfsshare Ubuntu虚拟机下执行 sudo mount -t nfs192.168.1.xxx:/nfsshare /mnt -onolock //M2 Debian系统下执行 cd /mnt ./SmsWBSserver 9000 WebService服务器端程序启动执行 3. Nanopi M2作为服务器端、PC机作为客户端的功能测试 我们在PC机和Nanopi M2上均搭建好了gsoap的开发环境,并且都本地启动服务和启动客户程序均成功执行,下面我们让Nanopi M2作为服务器端,而PC机作为客户端,远程访问一下Webservice提供的Add函数。 在Nanopi M2环境中执行命令: ./SmsWBSserver 9000 此时Nanopi M2处于服务器监听状态。 在Nanopi M2的命令行终端输入命令: ifconfig wlan0 查看M2的IP地址,然后在PC机端的Ubuntu系统中,修改msWBStest.c中的char* server="http://localhost:9000"; 为char* server="http://192.168.1.xxx:9000"; (xxx为M2的IP地址) 再次执行make client 执行./SmsWBStest 67 78 如果返回67 + 78 = 145 评分 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
369个成员聚集在这个小组
加入小组NanoPi m3适合刷什么系统,刚接触玩,我刷了一个比较卡
5425 浏览 1 评论
7162 浏览 1 评论
4763 浏览 1 评论
【NanoPC-T4试用体验】4、手把手教你从单片机移植驱动到ARM Linux上
7720 浏览 1 评论
【NanoPC-T4试用体验】NanoPC-T4控制步进电机
24574 浏览 1 评论
NanoPi m3适合刷什么系统,刚接触玩,我刷了一个比较卡
5425浏览 1评论
426浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-15 01:20 , Processed in 0.478108 second(s), Total 43, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号