簡體   English   中英

如何將消息從客戶端應用程序(Dash.js)發送到OpenFlow交換機

[英]How to sending messages from a client application (Dash.js) to the OpenFlow Switch

我有一個名為Dash.js的客戶端應用程序,視頻播放器,該應用程序在模擬具有交換機和openflow控制器的SDN網絡的環境中運行。

此應用程序使視頻質量適應用戶網絡的帶寬。

確定客戶端是否將請求替換段以適應可用帶寬的類是AbrController.js。

 MediaPlayer.dependencies.AbrController = function () { "use strict"; var autoSwitchBitrate = true, qualityDict = {}, confidenceDict = {}, getInternalQuality = function (type) { var quality; if (!qualityDict.hasOwnProperty(type)) { qualityDict[type] = 0; } quality = qualityDict[type]; return quality; }, setInternalQuality = function (type, value) { qualityDict[type] = value; }, getInternalConfidence = function (type) { var confidence; if (!confidenceDict.hasOwnProperty(type)) { confidenceDict[type] = 0; } confidence = confidenceDict[type]; return confidence; }, setInternalConfidence = function (type, value) { confidenceDict[type] = value; }; return { debug: undefined, abrRulesCollection: undefined, manifestExt: undefined, metricsModel: undefined, metricsBaselinesModel: undefined, getAutoSwitchBitrate: function () { return autoSwitchBitrate; }, setAutoSwitchBitrate: function (value) { autoSwitchBitrate = value; }, getMetricsFor: function (data) { var deferred = Q.defer(), self = this; self.manifestExt.getIsVideo(data).then( function (isVideo) { if (isVideo) { deferred.resolve(self.metricsModel.getMetricsFor("video")); } else { self.manifestExt.getIsAudio(data).then( function (isAudio) { if (isAudio) { deferred.resolve(self.metricsModel.getMetricsFor("audio")); } else { deferred.resolve(self.metricsModel.getMetricsFor("stream")); } } ); } } ); return deferred.promise; }, getMetricsBaselineFor: function (data) { var deferred = Q.defer(), self = this; self.manifestExt.getIsVideo(data).then( function (isVideo) { if (isVideo) { deferred.resolve(self.metricsBaselinesModel.getMetricsBaselineFor("video")); } else { self.manifestExt.getIsAudio(data).then( function (isAudio) { if (isAudio) { deferred.resolve(self.metricsBaselinesModel.getMetricsBaselineFor("audio")); } else { deferred.resolve(self.metricsBaselinesModel.getMetricsBaselineFor("stream")); //self.debug.log("GET STREAM."); } } ); } } ); return deferred.promise; }, getPlaybackQuality: function (type, data, availableRepresentations) { var self = this, deferred = Q.defer(), newQuality = MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE, newConfidence = MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE, i, len, funcs = [], req, values, quality, confidence; quality = getInternalQuality(type); confidence = getInternalConfidence(type); //self.debug.log("ABR enabled? (" + autoSwitchBitrate + ")"); if (autoSwitchBitrate) { //self.debug.log("Check ABR rules."); self.getMetricsFor(data).then( function (metrics) { self.getMetricsBaselineFor(data).then( function (metricsBaseline) { self.abrRulesCollection.getRules().then( function (rules) { for (i = 0, len = rules.length; i < len; i += 1) { funcs.push(rules[i].checkIndex(quality, metrics, data, metricsBaseline, availableRepresentations)); } Q.all(funcs).then( function (results) { //self.debug.log(results); values = {}; values[MediaPlayer.rules.SwitchRequest.prototype.STRONG] = MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE; values[MediaPlayer.rules.SwitchRequest.prototype.WEAK] = MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE; values[MediaPlayer.rules.SwitchRequest.prototype.DEFAULT] = MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE; for (i = 0, len = results.length; i < len; i += 1) { req = results[i]; if (req.quality !== MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE) { values[req.priority] = Math.min(values[req.priority], req.quality); } } if (values[MediaPlayer.rules.SwitchRequest.prototype.WEAK] !== MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE) { newConfidence = MediaPlayer.rules.SwitchRequest.prototype.WEAK; newQuality = values[MediaPlayer.rules.SwitchRequest.prototype.WEAK]; } if (values[MediaPlayer.rules.SwitchRequest.prototype.DEFAULT] !== MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE) { newConfidence = MediaPlayer.rules.SwitchRequest.prototype.DEFAULT; newQuality = values[MediaPlayer.rules.SwitchRequest.prototype.DEFAULT]; } if (values[MediaPlayer.rules.SwitchRequest.prototype.STRONG] !== MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE) { newConfidence = MediaPlayer.rules.SwitchRequest.prototype.STRONG; newQuality = values[MediaPlayer.rules.SwitchRequest.prototype.STRONG]; } if (newQuality !== MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE && newQuality !== undefined) { quality = newQuality; } if (newConfidence !== MediaPlayer.rules.SwitchRequest.prototype.NO_CHANGE && newConfidence !== undefined) { confidence = newConfidence; } self.manifestExt.getRepresentationCount(data).then( function (max) { // be sure the quality valid! if (quality < 0) { quality = 0; } // zero based if (quality >= max) { quality = max - 1; } if (confidence != MediaPlayer.rules.SwitchRequest.prototype.STRONG && confidence != MediaPlayer.rules.SwitchRequest.prototype.WEAK) { confidence = MediaPlayer.rules.SwitchRequest.prototype.DEFAULT; } setInternalQuality(type, quality); //self.debug.log("New quality of " + quality); setInternalConfidence(type, confidence); //self.debug.log("New confidence of " + confidence); deferred.resolve({quality: quality, confidence: confidence}); } ); } ); } ); } ); } ); } else { self.debug.log("Unchanged quality of " + quality); deferred.resolve({quality: quality, confidence: confidence}); } return deferred.promise; }, setPlaybackQuality: function (type, newPlaybackQuality) { var quality = getInternalQuality(type); if (newPlaybackQuality !== quality) { setInternalQuality(type, newPlaybackQuality); } }, getQualityFor: function (type) { return getInternalQuality(type); } }; }; MediaPlayer.dependencies.AbrController.prototype = { constructor: MediaPlayer.dependencies.AbrController }; 

我想要的是,每當有段更改請求時,就會觸發一條消息以通知openflow交換機,以便它可以將數據包發送到控制器,然后控制器采取措施。

對我而言,現在的問題是客戶端與OpenFlow交換機之間的通信交換。

有誰知道如何拍攝此消息並進入openflow開關?

謝謝!

您可以使用REST API將參數傳遞到網絡。 大多數SDN控制器公開其API,以便與外部應用程序進行交互。

Ryu REST API: https: //osrg.github.io/ryu-book/zh/html/rest_api.html Opendaylight REST API: https ://wiki.opendaylight.org/view/OpenDaylight_Controller:REST_Reference_and_Authentication

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM