__亲测,可用,gsoap版本为2.8.96最新版本,在网上搜索的其他设置ip地址的gsoap版本都太低了,里面函数和接口都变更了,没办法,只好自己搞。如下: __
我生成的是C++版本的代码,C语言的只需要把数据结构修改成struct即可,另外也可以直接拿到QT里面使用,亲测可用。
void PrintErr(struct soap* _psoap)
{
fflush(stdout);
processEventLog(__FILE__, __LINE__, stdout, "error:%d faultstring:%s faultcode:%s faultsubcode:%s faultdetail:%s", _psoap->error,
*soap_faultstring(_psoap), *soap_faultcode(_psoap),*soap_faultsubcode(_psoap), *soap_faultdetail(_psoap));
}
/* step -4. set NetworkInterfaces */
int set_networkinterfaces()
{
char szHostName[MAX_HOSTNAME_LEN] = { 0 };
char uname[20];
char pword[20];
char ip_port[20];
DeviceBindingProxy proxyDevice;
strcpy(ip_port, "193.169.4.63:80");
//char *url = "193.169.4.82:80";
strcat(szHostName, "http://");
strcat(szHostName, ip_port);
strcat(szHostName, "/onvif/device_service");
proxyDevice.soap_endpoint = szHostName;
struct soap *soap = soap_new();
if (soap == NULL){
printf("%s %d get_networkinterfaces soap == NULL\n", __FILE__, __LINE__);
return -1;
}
if (SOAP_OK != soap_wsse_add_UsernameTokenDigest(proxyDevice.soap, NULL, "admin", "admin"))
{
return -1;
}
printf("\n\n*************** Step1.get_networkinterfaces *********************************************\n\n");
_tds__GetNetworkInterfaces *tds__GetNetworkInterfaces = soap_new__tds__GetNetworkInterfaces(soap, -1);
_tds__GetNetworkInterfacesResponse *tds__GetNetworkInterfacesResponse = soap_new__tds__GetNetworkInterfacesResponse(soap, -1);
if (SOAP_OK == proxyDevice.GetNetworkInterfaces(tds__GetNetworkInterfaces, *tds__GetNetworkInterfacesResponse))
{
//processEventLog(__FILE__, __LINE__, stdout, "-------------------NetworkInterfaces-------------------");
processEventLog(__FILE__, __LINE__, stdout, "token:%s", tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->token);
processEventLog(__FILE__, __LINE__, stdout, "HwAddress:%s", tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->Info->HwAddress);
processEventLog(__FILE__, __LINE__, stdout, "LinkLocal addr:%s", tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->IPv4->Config->LinkLocal->Address);
processEventLog(__FILE__, __LINE__, stdout, "LinkLocal PrefixLength:%d", tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->IPv4->Config->LinkLocal->PrefixLength);
processEventLog(__FILE__, __LINE__, stdout, "Manual addr:%s", tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->IPv4->Config->Manual[0]->Address);
processEventLog(__FILE__, __LINE__, stdout, "Manual PrefixLength:%d", tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->IPv4->Config->Manual[0]->PrefixLength);
}
else
{
PrintErr(proxyDevice.soap);
}
soap_destroy(soap);
soap_end(soap);
//soap_done(soap);
printf("\n\n get networkinterfaces over now ......\n\n\n");
/* ip invalid return directly */
/* set network interfaces */
printf("\n\n*************** Step2.set_networkinterfaces *********************************************\n\n");
tt__NetworkInterfaceSetConfiguration NetworkInterface;
tt__IPv4NetworkInterfaceSetConfiguration tt_ipv4;
tt__PrefixedIPv4Address tt_ipv4_address;
tt__PrefixedIPv4Address* p_tt_ipv4_address;
bool netEnable = true;
bool netDisable = false;
NetworkInterface.Enabled = &netEnable;
/*
processEventLog(__FILE__, __LINE__, stdout, "Manual PrefixLength:%d", *tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->Info->MTU);
processEventLog(__FILE__, __LINE__, stdout, "Manual PrefixLength:%d", tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->Link->AdminSettings->AutoNegotiation);
processEventLog(__FILE__, __LINE__, stdout, "Manual PrefixLength:%d", tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->IPv4->Config->DHCP);
processEventLog(__FILE__, __LINE__, stdout, "Manual PrefixLength:%d", tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->IPv4->Enabled);
processEventLog(__FILE__, __LINE__, stdout, "Manual PrefixLength:%d", tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->IPv4->Config->Manual[0]->PrefixLength);
processEventLog(__FILE__, __LINE__, stdout, "Manual PrefixLength:%d", *tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->Info->MTU);*/
NetworkInterface.MTU = tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->Info->MTU;
//NetworkInterface.IPv4->__sizeManual =1;
tt_ipv4.__sizeManual = 1;
tt_ipv4.DHCP = &netDisable;
//NetworkInterface.IPv4->DHCP = &tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->IPv4->Config->DHCP;
tt_ipv4.Enabled = &netEnable;
//NetworkInterface.IPv4->Enabled = &tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->IPv4->Enabled;
//new ip
//NetworkInterface.IPv4->Manual[0]->Address = ui->lineEdit_ip->text().toUtf8().data();
tt_ipv4_address.Address = "193.169.4.154";
tt_ipv4_address.PrefixLength = tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->IPv4->Config->Manual[0]->PrefixLength;
//NetworkInterface.IPv4->Manual[0]->PrefixLength = tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->IPv4->Config->Manual[0]->PrefixLength;
p_tt_ipv4_address = &tt_ipv4_address;
tt_ipv4.Manual = &p_tt_ipv4_address;
NetworkInterface.IPv4 = &tt_ipv4;
if (SOAP_OK != soap_wsse_add_UsernameTokenDigest(proxyDevice.soap, NULL, "admin", "admin"))
{
return -1;
}
printf("token = %s\n", tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->token);
char token_name[20];
memset(token_name, 0, sizeof(token_name));
strcpy(token_name, tds__GetNetworkInterfacesResponse->NetworkInterfaces[0]->token);
_tds__SetNetworkInterfaces * tds__SetNetworkInterfaces = soap_new__tds__SetNetworkInterfaces(soap, -1);
tds__SetNetworkInterfaces->InterfaceToken = token_name;
tds__SetNetworkInterfaces->NetworkInterface = &NetworkInterface;
_tds__SetNetworkInterfacesResponse * tds__SetNetworkInterfacesResponse = soap_new_req__tds__SetNetworkInterfacesResponse(soap, false);
//proxyDevice.SetNetworkInterfaces
printf("\n\n begin set networkinterfaces now ......\n\n\n");
if (SOAP_OK == proxyDevice.SetNetworkInterfaces(tds__SetNetworkInterfaces, *tds__SetNetworkInterfacesResponse))
{
printf("set networkinterfaces ok...\n");
}
else
{
PrintErr(proxyDevice.soap);
}
printf("\n\n set networkinterfaces over now ......\n\n\n");
soap_destroy(soap);
soap_end(soap);
soap_done(soap);
}