一、开发环境:
QT:5.10.1
编译环境:Android_for_armeabi_v7a_GCC_4_9_Qt_5_10_1_android_armv7
Linux:Ubuntu 14.04LTS
gsoap:2.8.122
Android:7.0
硬件平台:全志H6
二、gsoap安装
在官网上下载gsoap(https://www.genivia.com/products.html)
1.点击getgsoap
2.下载开源版本
三、gsoap针对安卓环境的交叉编译
1.将gsoap包解压到ubuntu自定义一个路径下
2.参考官方文档在linux环境下安装方法(https://www.genivia.com/downloads.html#unix),先确保系统中已有 Flex 、 Bison以及OpenSSL工具包
若无则可以通过以下指令安装
Flex 、 Bison:
sudo apt-get install flex bison
OpenSSL:(也可以不装,在编译时添加–disable-ssl实现)
sudo apt-get install libssl-dev
3.开始编译gsoap,cd到gsoap-2.8路径下
–prefix:编译输出路径
–host:编译工具链(参考文章:https://blog.csdn.net/weixin_41472344/article/details/109677761)
./configure --prefix=$PWD/out_android_gcc --host=arm-linux-gnueabi --disable-ssl
4.然后make
make
这里会报一个错误:
需要在当前目录下修改config.h文件,将#define malloc rpl_malloc注释以及HAVE_MALLOC的值改成1
参考文章:http://blog.chinaunix.net/uid-27018250-id-3431184.html
然后重新make后会报错:
make
此时需要cd到libgsoap++.a的路径下:
ranlib libgsoap++.a
返回上一路径再make一下:
make
5.最后make install即可安装成功
make install
四、Qt安卓服务端编写
1.测试服务头文件mySoap.h
//gsoap ns service name: dataStream
//gsoap ns service namespace: http://localhost/dataStream.wsdl
//gsoap ns service location: http://localhost
//gsoap ns service executable: dataStream.cgi
//gsoap ns service encoding: encoded
//gsoap ns schema namespace: urn:dataStream
int ns__dataStream(std::wstring param_in, std::wstring& param_out);
2.准备测试服务所需文件
将mySoap.h复制到输出路径的bin目录下
命令行执行:
./soapcpp2 mySoap.h
这里还需要两个文件stdsoap2.cpp与stdsoap2.h
stdsoap2.cpp:路径(gsoap-2.8\gsoap)
stdsoap2.h:路径(输出目录\include)
3.新建一个服务端qt项目
将以下文件导入到项目中
编写服务实现对象Service.cpp
#include "service.h"
#include "stdsoap2.h"
#include "mySoap.h"
#include "datastream.nsmap"
#include "QDebug"
Service::Service(QWidget *parent)
: QMainWindow(parent)
{
int m, s;
struct soap add_soap;
soap_init(&add_soap);
m = soap_bind(&add_soap, "192.168.1.101", 30000, 100);
if (m < 0)
{
soap_print_fault(&add_soap, stderr);
exit(-1);
}
qDebug()<<"Socket connection successful: master socket =";
qDebug()<< m;
while(true)
{
s = soap_accept(&add_soap);
if (s < 0)
{
soap_print_fault(&add_soap, stderr);
exit(-1);
}
fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
qDebug()<<"Socket connection successful: slave socket =";
qDebug()<< s;
soap_serve(&add_soap);//该句说明该server的服务
soap_end(&add_soap);
}
}
int ns__dataStream(struct soap* mysoap, std::wstring param_in, std::wstring& param_out)
{
wprintf(L"\nreceived %s\n", param_in.c_str());
param_out = L"中文456 ";
qDebug() << QString::fromStdWString(param_in);
return 0;
}
Service::~Service()
{
}
4.编译时出现的问题及解决
1.E:\Work\soap\Sdatastream\stdsoap2.h:694: error: ‘freelocale’ was not declared in this scope
# define SOAP_FREELOCALE(soap) (void)((soap)->c_locale && (freelocale((soap)->c_locale), ((soap)->c_locale = NULL)))
按照如图位置注释# define WITH_C_LOCALE
参考文章:https://blog.csdn.net/a812417530/article/details/103886795
2.E:\Work\soap\Sdatastream\stdsoap2.cpp:22634: error: invalid conversion from ‘int’ to ‘const char*’ [-fpermissive]
return strerror_r(err, soap->msgbuf, sizeof(soap->msgbuf)); /* GNU-specific */
返回类型有点问题,强制转换一下。
5.真机调试
编译成功后,直接在安卓设备上运行。
同一局域网下浏览器测试,服务开启成功。
五、Qt安卓客户端编写
1.新建一个客户端qt项目
注:为了测试方便,客户端采用windows下qt5.8.0 mingw编译环境。
以下配置文件需要在windows下重新编译输出一遍,由于gsoap在windows下已有编译好的生成工具,直接将接口头文件复制到路径(C:\gsoap-2.8\gsoap\bin\win32)
命令行执行
soapcpp2.exe mySoap.h
客户端程序需要用到以下文件
新建一个客户端项目用于实现服务端接口
#include "client.h"
#include "stdsoap2.h"
#include "soapH.h"
#include "datastream.nsmap"
#include "QDebug"
client::client(QWidget *parent)
: QMainWindow(parent)
{
struct soap add_soap;
int result = 0;
soap_init(&add_soap);
std::wstring str_in = L"<message><type>write</type><device_id>12</device_id><point_id>617</point_id><value>0</value></message>";
std::wstring str_out;
// soap_set_namespaces(&add_soap, add_namespaces);
// 该函数是客户端调用的主要函数,后面几个参数和add.h中声明的一样,前面多了3个参数,
// 函数名是接口函数名ns__add前面加上soap_call_
soap_call_ns__dataStream( &add_soap, "192.168.1.101:30000", NULL,str_in, str_out );
if(add_soap.error)
{
printf("soap error:%d,%s,%s\n",
add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap) );
result = add_soap.error;
}
soap_end(&add_soap);
soap_done(&add_soap);
}
client::~client()
{
}
windows下pro文件中还需要添加以下依赖
LIBS += -lpthread libwsock32 libws2_32
否则会报如下错误
2.测试客户端
运行客户端后,服务端成功接收到内容
六、项目源码
下载链接:https://download.csdn.net/download/sinat_29233203/86246795