Как сделать действие upnp? - PullRequest
       7

Как сделать действие upnp?

2 голосов
/ 16 декабря 2010

Я хочу реализовать переадресацию портов с помощью intel-upnp.Я получил XML-данные вроде:

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  

И теперь я хочу выполнить upnp-действие.Но я не знаю, как это сделать.Если вам известен фрагмент кода или полезный URL на C, сообщите мне.

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);

1 Ответ

1 голос
/ 09 октября 2018

Я знаю, что это старый вопрос, но его можно сохранить для справки.Вы можете посмотреть пример кода в библиотеке libupnp здесь: https://github.com/mrjimenez/pupnp/blob/master/upnp/sample/common/tv_ctrlpt.c

Соответствующий код находится в функции 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;
}

Объяснение состоит в том, что вы должнысоздайте действие с помощью UpnpMakeAction (), если у вас нет параметров, или UpnpAddToAction (), если у вас есть параметры для создания вашего действия, а затем отправьте его либо синхронно, либо асинхронно.

...