基于Webservice gSOAP的嵌入式计算器的设计总结
?????? Web Service 是流行的Web应用开发技术,它改变了传统个C/S或者是B/S软件开发的模式。 gSOAP 编译工具提供了一个SOAP/XML 关于C/C++的实现方法,它包含WSDL生成器,可以生成Web服务的解释,也可以把它看做C/C++的Web服务协议栈 该协议栈包含5个部分 1.网络传输 2.Web服务调用(消息传输) 3.Web服务描述和注册(接口描述、发布、与实现) 4.Web服务质量(安全性,可靠性、事务控制) 5.Web服务工作流(商业流程、事务等) gSOAP工具包中提供了2个可执行文件 wsdl2h和soapcpp2 SOAP(Simple Object Access Protocol,简单对象访问协议)? 包含4个部分:SOAP封装(envelop),SOAP编码规则,SOAP RPC ,SOAP绑定 SOAP协议规范说明中SOAP消息包含3个部分:1.必须的根元素<Envelope>?? 2.可选的SOAP头<Header>? 3.必须的SOAP体<Body> 实现客户端的程序 calcclient.c #include "soapH.h" #include "calc.nsmap" const char server[] ="http://192.168.1.199:8080"; int main(int argc,char **argv) { struct soap soap; double a,b,result; if (argc < 4) { fprintf(stderr,"Usage: [add|sub|mul|div|pow] num numn"); exit(0); } soap_init(&soap); a = strtod(argv[2],NULL); b = strtod(argv[3],NULL); switch (*argv[1]) { case 'a': soap_call_ns__add(&soap,server,"",a,&result); break; case 's': soap_call_ns__sub(&soap,&result); break; case 'm': soap_call_ns__mul(&soap,&result); break; case 'd': soap_call_ns__div(&soap,&result); break; case 'p': soap_call_ns__pow(&soap,&result); break; default: fprintf(stderr,"Unknown commandn"); exit(0); } if (soap.error) { soap_print_fault(&soap,stderr); exit(1); } else printf("result = %gn",result); soap_destroy(&soap); soap_end(&soap); soap_done(&soap); return 0; }
calcserver.c #include "soapH.h" #include "calc.nsmap" int main(int argc,char **argv) { int m,s; /* master and slave sockets */ struct soap soap; soap_init(&soap); if (argc < 2) soap_serve(&soap); /* serve as CGI application */ else { m = soap_bind(&soap,NULL,atoi(argv[1]),100); if (m < 0) { soap_print_fault(&soap,stderr); exit(-1); } fprintf(stderr,"Socket connection successful: master socket = %dn",m); for ( ; ; ) { s = soap_accept(&soap); fprintf(stderr,"Socket connection successful: slave socket = %dn",s); if (s < 0) { soap_print_fault(&soap,stderr); exit(-1); } soap_serve(&soap); soap_end(&soap); } } return 0; } int ns__add(struct soap *soap,double a,double b,double *result) { *result = a + b; return SOAP_OK; } int ns__sub(struct soap *soap,double *result) { *result = a - b; return SOAP_OK; } int ns__mul(struct soap *soap,double *result) { *result = a * b; return SOAP_OK; } int ns__div(struct soap *soap,double *result) { if (b) *result = a / b; else { char *s = (char*)soap_malloc(soap,1024); sprintf(s,"<error xmlns="http://tempuri.org/">Can't divide %f by %f</error>",b); return soap_sender_fault(soap,"Division by zero",s); } return SOAP_OK; } int ns__pow(struct soap *soap,double *result) { *result = pow(a,b); if (soap_errno == EDOM) /* soap_errno is like errno,but compatible with Win32 */ { char *s = (char*)soap_malloc(soap,"Can't take the power of %f to %f",b); sprintf(s,"<error xmlns="http://tempuri.org/">Can't take power of %f to %f</error>","Power function domain error",s); } return SOAP_OK; }
GSOAP=../../bin/soapcpp2 SOAPH=../../stdsoap2.h SOAPC=../../stdsoap2.c SOAPCPP=../../stdsoap2.cpp CC=gcc CPP=g++ LIBS= COFLAGS=-O2 CWFLAGS=-Wall CIFLAGS=-I../.. CMFLAGS= CFLAGS= $(CWFLAGS) $(COFLAGS) $(CIFLAGS) $(CMFLAGS) all: calcclient calcserver calcclient: calc.h calcclient.c $(SOAPH) $(SOAPC) $(GSOAP) -c calc.h $(CC) $(CFLAGS) -o calcclient calcclient.c soapC.c soapClient.c $(SOAPC) $(LIBS) calcserver: calc.h calcserver.c $(SOAPH) $(SOAPC) $(GSOAP) -c calc.h arm-linux-gcc $(CFLAGS) -o calcserver calcserver.c soapC.c soapServer.c $(SOAPC) -lm $(LIBS) clean: rm -f *.o soapH.h soapStub.h soapC.cpp soapC.c soapClient.cpp soapClient.c soapServer.cpp soapServer.c soap*Proxy.h distclean: rm -f *.o *.wsdl *.xsd *.xml *.nsmap *.log soapH.h soapStub.h soapC.cpp soapC.c soapClient.cpp soapClient.c soapServer.cpp soapServer.c soap*Proxy.h calcclient calcserver
? ? ? 实验步骤如下: 1.配置交叉编译库arm-linux-gcc 2.解压gsoap_linux_2.7.9e.tar.gz [root@localhost arm2410cl]# tar -zxvf gsoap_linux_2.7.9e.tar.gz 3. 修改Makefile文件 ?进入arm2410cl/gsoap-linux-2.7/samples/calc/目录下的文件, [root@localhost calc]# vi Makefile 找到 ?????? ?????? calcserver:???? calc.h calcserver.c $(SOAPH) $(SOAPC) ? ??????????????? ?? $(GSOAP) -c calc.h ? ??????????????? ?? arm-linux-gcc $(CFLAGS) -o calcserver ??????????? calcserver.c ?????? soapC.c soapServer.c $(SOAPC) -lm $(LIBS) ? ?????? //将calcserver:中的$(CC)改为arm-linux-gcc编译器 4、修改calcclient.c [root@localhost calc]# vi calcclient.c ? ?????? //编辑calc客户端文件,为了能看出效果可以用目录标板的IP地址,将下面的内容: ? ?????? const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi"; ? ?????? 修改成: ? ?????? const char server[] = “http://192.168.1.199:8080”; ? 5.编译Makefile文件 ?????? [root@localhost calc]# make //编译原程序代码,在编译的时候会显示一些关于限制范围的一些警告信息,但不会影响运行结果。 6、挂载: U盘? mount /dev/sda1 /mnt/nfs 7、进入/mnt/nfs/ gsoap-linux-2.7/samples/calc/ ?[/mnt/yaffs] cd /mnt/nfs/ gsoap-linux-2.7/samples/calc/ 8、执行交叉编译好的可执行文件 [/mnt/nfs/gsoap-linux-2.7/samples/calc]./calcserver 8080 出现下图表示运行成功 ???? 9、在linux打开浏览器,在地址栏输入:http://192.168.1.199:8080/ ,显示下面界面,同时也会在目标板显示一个从slave socket接口号4连接成功的信息。 10.执行乘法运算:5 *6=30 ?[root@localhost calc]# ./calcclient mul 5 6 运行结果如图 ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |