Question

Je veux mettre en œuvre le port-forwarding utilisant intel-upnp. J'ai données XML comme:

Device found at location: http://192.168.10.1:49152/gatedesc.xml  
service urn:schemas-upnp-org:service:WANIPConnection:1  
controlurl /upnp/control/WANIPConn1  
eventsuburl : /upnp/control/WANIPConn1  
scpdurl : /gateconnSCPD.xml  

Et maintenant, je veux faire upnp-action. Mais, je ne sais pas comment faire. Si vous connaissez un certain bout de code ou l'URL utile en C, s'il vous plaît me dire.

char actionxml[250];  
IXML_Document *action = NULL;  
strcpy(actionxml, "<u:GetConnectionTypeInfo xmlns:u=\"urn:schemas-upnp- org:service:WANCommonInterfaceConfig:1\">");  
action = ixmlParseBuffer(actionxml);  
int ret = UpnpSendActionAsync( g_handle,
                    "http:192.168.10.1:49152/upnp/control/WANCommonIFC1",
                    "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1",
                    NULL,
                    action,
                    upnp_callback,
                    NULL);
Était-ce utile?

La solution

Je sais que c'est une vieille question, mais il peut être conservé pour référence. Vous pouvez jeter un oeil à l'exemple de code dans la bibliothèque de libupnp ici: https://github.com/mrjimenez/pupnp/blob/master/upnp/sample/common/tv_ctrlpt.c

Le code correspondant est dans la fonction TvCtrlPointSendAction ():

int TvCtrlPointSendAction(
    int service,
    int devnum,
    const char *actionname,
    const char **param_name,
    char **param_val,
    int param_count)
{
    struct TvDeviceNode *devnode;
    IXML_Document *actionNode = NULL;
    int rc = TV_SUCCESS;
    int param;

    ithread_mutex_lock(&DeviceListMutex);

    rc = TvCtrlPointGetDevice(devnum, &devnode);
    if (TV_SUCCESS == rc) {
        if (0 == param_count) {
            actionNode =
                UpnpMakeAction(actionname, TvServiceType[service],
                       0, NULL);
        } else {
            for (param = 0; param < param_count; param++) {
                if (UpnpAddToAction
                    (&actionNode, actionname,
                     TvServiceType[service], param_name[param],
                     param_val[param]) != UPNP_E_SUCCESS) {
                    SampleUtil_Print
                        ("ERROR: TvCtrlPointSendAction: Trying to add action param\n");
                    /*return -1; // TBD - BAD! leaves mutex locked */
                }
            }
        }

        rc = UpnpSendActionAsync(ctrlpt_handle,
                     devnode->device.
                     TvService[service].ControlURL,
                     TvServiceType[service], NULL,
                     actionNode,
                     TvCtrlPointCallbackEventHandler, NULL);

        if (rc != UPNP_E_SUCCESS) {
            SampleUtil_Print("Error in UpnpSendActionAsync -- %d\n",
                     rc);
            rc = TV_ERROR;
        }
    }

    ithread_mutex_unlock(&DeviceListMutex);

    if (actionNode)
        ixmlDocument_free(actionNode);

    return rc;
}

L'explication est que vous devez créer l'action avec UpnpMakeAction () si vous avez pas de paramètres ou UpnpAddToAction () si vous avez des paramètres pour créer votre action, puis l'envoyer de manière synchrone ou asynchrone.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top