一、开发环境:

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

gson Android使用的最低版本Android android gsi下载_服务端


2.下载开源版本

gson Android使用的最低版本Android android gsi下载_android_02

三、gsoap针对安卓环境的交叉编译

1.将gsoap包解压到ubuntu自定义一个路径下

gson Android使用的最低版本Android android gsi下载_客户端_03


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:编译工具链(参考文章:

./configure --prefix=$PWD/out_android_gcc --host=arm-linux-gnueabi --disable-ssl

4.然后make

make

这里会报一个错误:

gson Android使用的最低版本Android android gsi下载_android_04


需要在当前目录下修改config.h文件,将#define malloc rpl_malloc注释以及HAVE_MALLOC的值改成1

gson Android使用的最低版本Android android gsi下载_android_05


gson Android使用的最低版本Android android gsi下载_服务端_06


参考文章:http://blog.chinaunix.net/uid-27018250-id-3431184.html

然后重新make后会报错:

make

gson Android使用的最低版本Android android gsi下载_android_07


此时需要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目录下

gson Android使用的最低版本Android android gsi下载_android_08


命令行执行:

./soapcpp2 mySoap.h

gson Android使用的最低版本Android android gsi下载_android_09


这里还需要两个文件stdsoap2.cpp与stdsoap2.h

stdsoap2.cpp:路径(gsoap-2.8\gsoap)

stdsoap2.h:路径(输出目录\include)

gson Android使用的最低版本Android android gsi下载_qt_10

3.新建一个服务端qt项目

将以下文件导入到项目中

gson Android使用的最低版本Android android gsi下载_客户端_11

编写服务实现对象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)))

gson Android使用的最低版本Android android gsi下载_qt_12


按照如图位置注释# define WITH_C_LOCALE

gson Android使用的最低版本Android android gsi下载_android_13


参考文章:

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 */

gson Android使用的最低版本Android android gsi下载_客户端_14


返回类型有点问题,强制转换一下。

gson Android使用的最低版本Android android gsi下载_qt_15

5.真机调试

编译成功后,直接在安卓设备上运行。

gson Android使用的最低版本Android android gsi下载_qt_16


同一局域网下浏览器测试,服务开启成功。

gson Android使用的最低版本Android android gsi下载_客户端_17

五、Qt安卓客户端编写

1.新建一个客户端qt项目

注:为了测试方便,客户端采用windows下qt5.8.0 mingw编译环境。

以下配置文件需要在windows下重新编译输出一遍,由于gsoap在windows下已有编译好的生成工具,直接将接口头文件复制到路径(C:\gsoap-2.8\gsoap\bin\win32)

命令行执行

soapcpp2.exe mySoap.h

gson Android使用的最低版本Android android gsi下载_qt_18

客户端程序需要用到以下文件

gson Android使用的最低版本Android android gsi下载_#include_19


新建一个客户端项目用于实现服务端接口

#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

否则会报如下错误

gson Android使用的最低版本Android android gsi下载_#include_20

2.测试客户端

运行客户端后,服务端成功接收到内容

gson Android使用的最低版本Android android gsi下载_android_21

六、项目源码

下载链接: