4-1 综合应用延申:RYU北向接口的应用实现案例

news2024/9/22 21:24:30

ryu控制器在SDN三层架构中是处于中间层,(如图1)
在这里插入图片描述
图1 SDN三层架构

如何实现与应用层的通信,如图1所示,实现RYU控制器与应用层(如开发应用web界面时数据可视化平台)数据通信就需要利用SDN的北向接口。北向接口实现的功能就时某个应用软件实体与控制器中的数据的通信。本文,我们将用socket编程就能轻易实现应用层与RYU控制器之间的数据通信以及简单展示

实现拓扑逻辑原理
三、实现代码
服务端(在ubuntu上)
server端主要用于接收控制器的连接,并接收由控制器发送过来的信息,这里主要是dpid和port信息,也就是当主机h1、h2进行通信时,控制器收集通信时经过的端口和交换机id
具体代码:

import socket
import re


def main():
 server1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # TCP

 host = '10.0.0.2' #ubuntu地址,开启服务功能,用来给ryu主动连接提交数据
 port = 12345 #开放端口,自主定义一般大于1024
 server1.bind((host, port))

 server1.listen(5)
 while True:
     conn, addr = server1.accept()
     print("----------------------------")
     print("Success connect from ", addr)

     try:
         count = 0
         while True:
             data = conn.recv(1024)
             data = re.split(r'[, :]', data.decode('utf-8'))  # 对收到的信息进行解析,包括dpid和port
             count += 1
             print("from {0}:dpid={1}, in_port={2}".format(addr, data[0], data[1]))
         conn.close()
     except Exception as error:  # 当控制器和应用层断开连接后,输出统计信息
         print('共接收{}条信息。'.format(count-1))
         print(error)
         exit()


if __name__ == '__main__':
 main()

mininet拓扑代码

ryu

from ryu.base import app_manager
from ryu.controller.handler import set_ev_cls
from ryu.controller.handler import MAIN_DISPATCHER, CONFIG_DISPATCHER
from ryu.controller import ofp_event
from ryu.ofproto import ofproto_v1_3
import socket
 
 
class L2Switch(app_manager.RyuApp):
    OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
 
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.dp_id = '0'
        self.in_port = '0'
        
        
        self.client1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        dst_host = '10.0.0.2'
        dst_port = 12345
        
        try:
            self.client1.connect((dst_host, dst_port))
        except Exception as error:
            print('Connect error:', error)
 
    def doflow(self, datapath, command, priority, match, actions):
        ofp = datapath.ofproto
        ofp_parser = datapath.ofproto_parser
        inst = [ofp_parser.OFPInstructionActions(ofp.OFPIT_APPLY_ACTIONS, actions)]
        req = ofp_parser.OFPFlowMod(datapath=datapath, command=command,
                                    priority=priority, match=match, instructions=inst)
        datapath.send_msg(req)
    
    
    @set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
    def switch_features_handler(self, ev):
        msg = ev.msg
        datapath = msg.datapath
        ofp = datapath.ofproto
        ofp_parser = datapath.ofproto_parser
 
        # add table-miss
        command = ofp.OFPFC_ADD
        match = ofp_parser.OFPMatch()
        actions = [ofp_parser.OFPActionOutput(ofp.OFPP_CONTROLLER, ofp.OFPCML_NO_BUFFER)]
        self.doflow(datapath, command, 0, match, actions)
 
    @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
    def packet_in_handler(self, ev):
        msg = ev.msg
        dp = msg.datapath
        ofp = dp.ofproto
        ofp_parser = dp.ofproto_parser
        self.dp_id = dp.id
 
       
        start = str(msg).index('oxm_fields') + 11
        end = str(msg).index('),reason')
        inport_str = str(msg)[start:end]
        instr = eval(inport_str)
        self.in_port = instr['in_port']
 
        actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)]
 
        data = None
        if msg.buffer_id == ofp.OFP_NO_BUFFER:
             data = msg.data
        print('id:{0}     in_port:{1}'.format(self.dp_id, self.in_port))
        
        info = str(self.dp_id) + ',' + str(self.in_port)
        self.client1.send(info.encode())
 
        out = ofp_parser.OFPPacketOut(
            datapath=dp, buffer_id=msg.buffer_id, in_port=self.in_port,
            actions=actions, data=data)
        dp.send_msg(out)

四、实验测试
注意启动步骤:(如图中编号)
在这里插入图片描述

扩展,如何把服务器上收集的数据存入一个文件

将数据存储为Excel文件(.xlsx),您可以使用第三方库如openpyxl来实现。以下是将数据存储到Excel文件的修改版本:


import openpyxl
import socket
import re

def main():
    server1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # TCP

    host = '10.0.0.2'  # ubuntu地址,开启服务功能,用来给ryu主动连接提交数据
    port = 12345  # 开放端口,自主定义一般大于1024
    server1.bind((host, port))

    server1.listen(5)

    # 创建Excel文件并写入表头
    workbook = openpyxl.Workbook()
    sheet = workbook.active
    sheet.append(['Address', 'DPID', 'In_Port'])  # 表头

    while True:
        conn, addr = server1.accept()
        print("----------------------------")
        print("Success connect from ", addr)

        try:
            count = 0
            while True:
                data = conn.recv(1024)
                data = re.split(r'[, :]', data.decode('utf-8'))  # 对收到的信息进行解析,包括dpid和port
                count += 1
                print("from {0}: dpid={1}, in_port={2}".format(addr, data[0], data[1]))

                # 将数据写入Excel文件
                sheet.append([addr, data[0], data[1]])

        except Exception as error:  # 当控制器和应用层断开连接后,输出统计信息
            print('共接收{}条信息。'.format(count - 1))
            print(error)
            workbook.save('data.xlsx')  # 保存Excel文件
            exit()
    if __name__ == '__main__':
    main()

在上述代码中,我们使用了openpyxl库来创建并写入Excel文件。在循环中,每次接收到数据时,将数据写入Excel文件的工作表中。最后,使用workbook.save方法保存Excel文件

方法2
可以使用Python的CSV模块来实现。以下是将数据存储到CSV文件的修改版本:

import csv
import socket
import re


def main():
    server1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # TCP

    host = '10.0.0.2'  # ubuntu地址,开启服务功能,用来给ryu主动连接提交数据
    port = 12345  # 开放端口,自主定义一般大于1024
    server1.bind((host, port))

    server1.listen(5)

    # 创建CSV文件并写入表头
    with open('data.csv', 'w', newline='') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(['Address', 'DPID', 'In_Port'])  # 表头

        while True:
            conn, addr = server1.accept()
            print("----------------------------")
            print("Success connect from ", addr)

            try:
                count = 0
                while True:
                    data = conn.recv(1024)
                    data = re.split(r'[, :]', data.decode('utf-8'))  # 对收到的信息进行解析,包括dpid和port
                    count += 1
                    print("from {0}: dpid={1}, in_port={2}".format(addr, data[0], data[1]))

                    # 将数据写入CSV文件
                    writer.writerow([addr, data[0], data[1]])

            except Exception as error:  # 当控制器和应用层断开连接后,输出统计信息
                print('共接收{}条信息。'.format(count - 1))
                print(error)
                exit()
if __name__ == '__main__':
    main()

在上述代码中,我们使用了csv模块来创建并写入CSV文件。在循环中,每次接收到数据时,将数据写入CSV文件中。
在这里插入图片描述
在服务端所在文件的通目录下(默认情况)可以检测到有有新生成的文件data .csv用记事本打开可以看到相关的数据 在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1678553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能文档处理:解析文档场景下多模态大模型的应用与研究前沿

解析文档场景下多模态大模型的应用与研究前沿 一、TextIn 文档解析技术1. 现有大模型文档解析问题2. 文档解析技术背景3. TextIn 文档解析技术架构4. 版面分析关键技术 Layout-engine 二、TextIn 文本向量化技术三、TextIn.com Text Intelligence 一、TextIn 文档解析技术 hell…

Linux系统 -目录结构与配网

目录的特点 Windows中有C盘、D盘等,每个都是一个根系统是个多根系统 Linux中只有一个根是个单根系统 Linux-目录存储的内容 1、/root:管理员的家目录 2、/home:存储普通用户家目录的目录/3、/tmp:临时目录,这个目录存储…

【二叉树】(二)二叉树的基础修改构造及属性求解1

(二)二叉树的基础修改构造及属性求解1 翻转二叉树递归实现迭代实现(深度遍历)层序实现(广度遍历) 对称二叉树递归实现迭代实现(非层序遍历) 二叉树的最大深度递归法迭代法&#xff0…

欢乐钓鱼大师攻略大全,新手钓鱼入坑必备攻略!

《欢乐钓鱼大师》是一款深受玩家喜爱的钓鱼手游,在游戏中,玩家可以通过升级和更换鱼竿来享受钓鱼的乐趣,并有机会钓到各种稀有鱼类。然而,很多玩家在闯关过程中遇到了不少困难。为了帮助大家更好地掌握游戏技巧,小编特…

量化交易策略:经典量化交易策略大汇总(内附开通方法)

01、什么是量化交易? 量化交易是一种依赖于先进的数学模型和计算机技术的交易方式,旨在制定能带来超额收益的多种“大概率”事件策略。 这个过程从大量的历史数据中筛选,极大地减少了投资者情绪波动的影响,避免了在市场极度狂热或…

关于FIFO Generator IP和XPM_FIFO在涉及位宽转换上的区别

在Xilinx FPGA中,要实现FIFO的功能时,大部分时候会使用两种方法: FIFO Generator IP核XPM_FIFO原语 FIFO Generator IP核的优点是有图形化界面,配置参数非常直观;缺点是参数一旦固定,想要更改的化就只能重…

【大数据】计算引擎MapReduce

目录 1.概述 1.1.前言 1.2.大数据要怎么计算? 1.3.什么是MapReduce? 2.架构 3.工作流程 4.shuffle 4.1.map过程 4.2.reduce过程 1.概述 1.1.前言 本文是作者大数据系列专栏的其中一篇,专栏地址: https://blog.csdn.ne…

AI交互数字人赋能农业数字化、智能化推广营销

2024陵水荔枝文化节上“数字新农人”陵小荔身着黎族服饰、佩戴银器亮相开幕式现场,AI交互数字人生动地以互动式推介和歌舞等形式,带领宾客们了解陵水荔枝的发展历程、产业布局、未来愿景等。如今,越来越多农产品品牌通过3D虚拟数字人定制&…

声纹识别的对抗与防御

随着机器学习理论和方法的发展, 出现了用于模仿特定说话人语音的深度伪造、针对语音识别和声纹识别的对抗样本, 它们都为破坏语音载体的可信性和安全性提供了具体手段, 进而对各自应用场景的信息安全构成了挑战。 深度伪造是利用生成式对抗网络等方法, 通过构建特定的模型, 产生…

用HAL库改写江科大的stm32入门例子4-1 OLED

大体 步骤: step1:使用STM32CubeMX初始化I2C1,生成初始化代码 step2:将任意一个库导入到工程,配置好编译路径 step3:调用函数即可 IIC原理图: 接线图: 先设置clock: 开…

GPT-4o模型介绍和使用方法

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

VBA直连SAP RFC 接口实例

引用依赖: VBA 调用 SAP API的RFC函数:RFC_READ_TABLE Sub A() 查询SAP表数据并输出到EXCEL,VBA中不区分大小写(保存后会自动把代码、变量转换大小写)Dim iData As Integer Dim nField As Integer Dim nData As Integer Dim Result As Boolean Dim vRow As Variant MsgBox…

Socks5:网络世界的隐形斗篷

在数字化时代,网络隐私和安全已成为人们日益关注的话题。Socks5,作为一种代理协议,为用户在网络世界中的匿名性提供了强有力的支持。本文将从Socks5的多个方面,深入探讨这一技术如何成为网络世界的“隐形斗篷”。 一、Socks5的基本…

如何在WordPress中启用两因素身份验证?

在WordPress中启用两因素身份验证方法:安装和激活WordFence安全性、启用两因素验证。 使用您可以从任何位置登录的任何门户,建议启用两个因素身份验证以增加帐户的安全性。 这样,即使有人可以正确猜测你的密码,它们仍然需要获得2…

代码随想录算法训练营第四十八天|121. 买卖股票的最佳时机 、122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 思路: 动规五部曲分析如下: 1.确定dp数组(dp table)以及下标的含义 dp[i][0] 表示第i天持有股票所得最多现金 ,这里可能有同学疑惑,本题中只能买卖一次,持有股票之…

队列的实现与OJ题目解析

"不是你变优秀了, 那个人就会喜欢你." 文章索引 前言1. 什么是队列2. 队列的实现3. OJ题目解析4. 总结 前言 感情可以培养是个伪命题. 如果有足够多的时间和爱, 就可以让另一个人爱上你的话, 那谁和谁都可以相爱了. 爱情之所以会让人死去活来, 是因为, 答案都写在了…

虚拟化技术 安装和配置StartWind iSCSI目标服务器

一、实验内容 安装StartWind iSCSI目标服务器配置StartWind iSCSI目标服务器 二、实验主要仪器设备及材料 安装有64位Windows操作系统的台式电脑或笔记本电脑,建议4C8G或以上配置已安装vSphere Client已创建虚拟机并在其上安装CentOS6.5StarWind安装介质starwind.…

VUE如何实现批量下载多个文件并导出zip格式

效果图 1、安装jszip和file-saver插件 npm install jszip npm install file-saver2、在所需页面引入 import JSZip from "jszip"; import FileSaver from "file-saver";3、模拟fileList数组 //fileList模拟文件数组export default {name: "notic…

react18【系列实用教程】useMemo —— 缓存数据 (2024最新版)

为什么添加了 memo &#xff0c;子组件2依然重新渲染了呢&#xff1f; 因为父组件向子组件2传递了引用类型的数据 const userInfo {name: "朝阳",};<Child2 userInfo{userInfo} />memo() 函数的本质是通过校验Props中数据的内存地址是否改变来决定组件是否重新…

《米小圈动画成语》—和孩子一起意动“神州”成语连击!

成语有着独特的语言魅力&#xff0c;以其源远流长、凝练浓缩、概括力强而历久弥新,久盛不衰&#xff0c;是中华民族特有的文化现象。成语既是语言文字符号&#xff0c;又具有无穷的艺术魅力。在表情达意、传递高质量语言信息方面起着以一当十的作用。成语的结构严谨、言简意赅&…