2

我想使用 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-action。但是,我不知道该怎么做。如果您知道 C 中的一些代码片段或有用的 URL,请告诉我。

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

1 回答 1

1

我知道这是一个老问题,但可以保留以供参考。您可以在此处查看 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() 创建动作,然后同步或异步发送它。

于 2018-10-09T01:32:00.820 回答