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 に答える