ONOS应用示例开发

2023-05-16

ONOS应用示例开发
风继续吹  15-04-09 9239 人围观

本文主要是提供了有关ONOS的基于意图的流量转发应用如何开发、构建及部署等方面的实战经验,并且详细讲解了如何在命令行上调用服务的过程。最后,介绍了在开发ONOS应用过程中所遇到的常见疑难问题,并且给出了自己的看法。

1 应用程序开发手册

1.1 项目骨架安装

1.1.1 新建Maven工程

首先,打开Eclipse,导入相应的ONOS源码(详细导入过程可参考该文档),导入成功以后的代码结构如下图所示,每个bundle都是以独立的Maven工程形式存在,它们之间通过POM文件相关联:

图1. ONOS源码

然后,选择创建新的Maven工程,直接选择下一步Next,选择好相应的Archetype以后,直接选择下一步Next。在添加完相应的Group Id,Artifact Id,Version以及Package后,点击结束按钮,创建完成。如下所示:

图2. 新建Maven工程

1.1.2 编辑POM文件

1、Maven工程创建好以后,首先可以查看应用程序根目录下的pom.xml文件。该POM文件被Maven用来构建该应用程序。

图3. hello目录结构

如下所示:

图4. 应用的POM文件

这样的话,最终的bundle将会以”onos-app-hello“的名称存在。这将是在Karaf/ONOS命令行下使用类似”feature:install”的命令时指定的bundle名称。

2、接下来,编辑${ONOS_ROOT}/apps目录下的pom.xml文件,将hello添加进去,如下所示。注意,这里指定的不是bundle名称,而是应用程序的根目录。这样,就会将该应用作为它的子项目。

编辑如下所示:

图5.组件列表

1.1.3 注册应用程序

当一个新应用程序开发完以后,会把它放到Karaf下运行。而Karaf runtime需要一个应用程序的描述信息,称为一个feature,去部署该组件作为一个OSGi bundle。编辑${ONOS_ROOT}/features/features.xml文件,添加如下片段,这个片段描述了该应用程序的feature声明,该声明会告诉karaf到指定位置运行该应用程序。如下所示:

图6. 应用feature详情

至此,开发该应用之前的所有准备工作都做好了。

1.2 开发应用程序

1.2.1 应用综述

为简单起见,也本着为后面能开展更多实验的目的,这里选取的应用程序小示例以ONOS官方给出的ifwd作为参考。接下来的应用程序开发都将以此为基础。详情可参阅相关的代码和文档。

下面简单介绍一下基于意图的应用:

基于意图的转发应用与将收到数据包下发流表项的转发应用相比,它设置了一个意图。特别地,在本应用中,设置了一个主机到主机的意图,可以支持两个主机之间的互通。比起使用流表项来编程网络,使用意图的一个主要优势就在于意图能探测网络状态和重配置自身以便满足特定的意图。例如,如果某条链路down掉了,意图框架将会重路由你的意图到可用的路径。而当没有可选的路径时,此时意图将会进入失败状态,并且保持到链路重新恢复为止。关于意图的具体应用小案例,可以参见官方链接。

前面一个小节,我们创建好了一个项目骨架,现在就可以开始写我们的应用程序了。该转发应用程序的核心类是Hello.java。接下来就描述如何构建该Hello类。

1.2.2  添加注解

在编码之前,先简单介绍一下该应用使用到的Karaf的相关技术。Karaf组件加载机制会识别如下几种注解,并且允许java类通过此注解向它注册。主要包括如下几类:

  • Component(immediate = true) – 声明一个类作为组件激活,并且强制立即激活
  • Activate – 标记一个方法作为组件启动时调用
  • Deactivate – 标记一个方法作为组件关闭时调用

Reference(Cardinality = ReferenceCardinality.MANDATORY_UNARY) – 标记一个服务作为一个应用程序的依赖,并且在该应用程序启动之前,需要这样服务的一个实例被提前加载。

如下所示:

要想了解更多的关于注解的信息,可以参考以下链接:

http://felix.apache.org/documentation/subprojects/apache-felix-maven-scr-plugin/scr-annotations.html。

1.2.3 注册服务

我们的应用程序在使用ONOS的各种服务之前,必须向CoreService注册获取一个唯一的application ID。然后,它会向PacketService注册去监听网络事件(packet-ins)和发送数据包(packet-outs)。通常,PacketService需要提供一个事件处理句柄,例如在这里实现了PacketProcessor接口的内部类ReactivePacketProcessor。

如下图所示:

1.2.4 添加处理代码

该事件处理句柄中的process( )方法在PacketService每次收到网包的时候被调用。这样的话,我们就可以在该方法中定义我们自己的数据包转发行为。

如下所示:

1.2.5 构建应用程序

因为本应用程序本身就是作为一个项目,它可以直接从项目的根目录下运行Maven命令,独立于其它的ONOS bundle单独构建。

图7. 构建应用程序

图8. 构建成功

如上图所示,此时应用程序已经构建成功了。此时,该应用程序就可以加载和使用了。

1.3 启动应用程序

启动应用程序主要有两种方式,一个是在启动时,还有就是在运行时。通过这两种方式均可以成功加载应用程序。分别介绍如下:

1.3.1 动态启动(运行时)

应用程序可以从ONOS 命令行或者Karaf Web控制台启动。在第一种情况下,只需要在命令行下键入以下命令即可:

图9. 安装应用程序

1.3.2 静态启动(启动时)

应用程序可以通过配置Karaf安装目录/etc文件夹下的org.apache.karaf.features.cfg文件进行加载。这个配置文件包含当启动时候,Karaf加载的features列表。我们可以简单的添加feature onos-app-hello到这个列表中。如下表所示:

图10. 添加onos-app-hello到features列表

加载成功以后,可以通过feature:list命令来查看加载后的结果,如下图所示:

图11. 查看加载后结果

2 命令行手册

2.1 综述

这个手册将会展示如何创建一个CLI命令并打印出由上一章节创建的hello应用所发现的终端节点。完成该手册后,可以理解如下两点:

  • 如何扩展应用的新服务
  • 如何扩展基于Karaf ONOS CLI的新命令

整个应用程序的目录结构如下所示:

图12. 应用程序的目录结构

2.2 提供服务

如果想要自己的组件能够提供服务给其它组件,就应该定义一个服务接口,并且让你的组件类实现它。

2.2.1 定义服务接口

这里定义了ForwardingMapService服务接口,只包含了获取终端信息的getEndPoints( )方法。如下所示:

2.2.2 导入服务接口

接下来,在Hello类中实现我们的服务。这里,我们使用Felix SCR 注解@Service向Karaf指示该应用程序导出了一个服务。

这样的话,我们就可以通过@Reference注解去引用这个服务了。如下图所示:

2.2.3 实现服务接口

最后,就是要实现这个服务了。这里,主要是在Hello类中添加了一个新的Map:endPoints,用于保存由process( )方法找到的终端节点的信息。如下所示:

而在getEndPoints( )方法中则是简单地返回了该Map。如下所示:

接下来,就可以通过一个CLI命令使用这个新的服务了。这个命令将会列出这个map中的内容,并且同时提供了选项接受一个参数( host ID)过滤源主机。

2.3 创建命令

CLI命令主要是定义在${ONOS_ROOT}/cli/目录下。主要是包括两种类型的命令,它们的源文件也放在不同的位置,如下所示:

  • ${ONOS_ROOT}/cli/src/main/java/org/onosproject/cli – 系统配置和监控相关命令
  • ${ONOS_ROOT}/cli/src/main/java/org/onosproject/cli/net –网络配置和监控相关命令

因为我们的命令将会展示网络相关信息,所以将会把我们的命令添加到第二个net目录下。

2.3.1 创建命令类

我们将会创建新命令的类骨架,暂且先命名为ForwardingMapCommand。我们的类是AbstractShellCommand的子类。并且会使用到一些命令相关的注解,如下所示:

  • @Command – 用来设置一个命令的名称、范围以及描述信息
  • @Argument – 用来指示由命令行参数设定的变量

具体代码结构如下所示:

以上注解支持该命令在CLI上以fwdmap或者onos:fwdmap形式调用。除此之外,它还可以接受一个host ID作为参数,例如:fwdmap 00:00:00:00:00:01/-1。

2.3.2 加入新服务

接下来,我们实现该命令。在我们的示例中,它是相当简单的 – 我们通过服务获取终端的map,并且当我们给定一个host ID时,我们可以在map中搜索到它。execute( )方法定义如下所示:

2.3.3 注册新命令

接下来,我们需要编辑shell-config.xml文件告诉Karaf关于我们的新命令,该文件位于${ONOS_ROOT}/cli/src/main/resources/OSGI-INF/blueprint/目录下。

我们在该文件的之间添加如下内容:

2.4 验证命令

一旦我们重构好了ONOS以后,就可以测试我们的命令了。

2.4.1 构建&重启

在以上我们创建好命令以后,现在就可以重新构建ONOS了。如下图所示:

图13. 编译成功

下面就可以重新启动Karaf了。如下所示:

图14. 启动ONOS

此时,从下图可以看到此时onos-app-hello应用程序已经被Karaf查找到,但还没有安装。

图15. onos-app-hello尚未安装

图16 活动列表中同样没有

进行如下的安装操作:

图17. 安装onos-app-hello

安装好以后,显示如下:

图18. 应用安装成功

此时,键入如下命令,可以看到该命令已经可以正常调用了:

图19. 创建命令可以调通

图20. 创建命令帮助文档

图20. 创建命令帮助文档

2.4.2 启动Mininet

启动一个带有四个主机的小型Mininet网络,并且将OVS交换机指向我们的ONOS实例。如下所示:

图21. 创建一个简单的网络拓扑

此时测试ovs-vsctl命令来查看OVS交换机到ONOS实例的连接情况,此时可以看到三个交换机都已经连接上了:

图22. 显示当前的交换机连接状况

并且此时也可以查看6633端口的连接情况:

图23. 查看6633端口连接状况

同时,启动的ONOS实例将会看到四个主机信息:

图24. ONOS实例展示的主机信息

最后的话,可以打开ONOS Web页面查看设备连接情况:

图25. ONOS Web界面展示

2.4.3 测试命令

没有网络流量时,该命令不会返回任何东西:

图26. 测试fwdmap命令

然后,在Mininet上产生流量:

图27. 产生网络流量

并且,此时重新尝试该命令。将会看到四个流表项:

图28. 产生四个流表项

如果我们指定了一个可选参数的话,也可以对源host ID进行过滤操作。

3 Q&A

3.1 Karaf clean VS Karaf?

在Karaf运行的过程中,它的data目录会记载所有的工作文件,保存所有之前安装的应用程序以及变化数据。当运行karaf命令启动Karaf实例的时候,它会加载之前保存的状态数据。而当通过karaf clean 启动Karaf的时候,则是从一个纯净状态启动,它会移除该目录,并且恢复到一个初始状态。

3.2 Karaf加载ONOS报错?

在刚开始部署hello应用的时候,一直无法正确的加载。经过排错以后,发现是因为自己的feature文件配置错了。下面红框圈出部分应该与${ONOS_ROOT}/system/org/onosproject目录下的文件夹保持一致。

1)错误的配置

图29. 错误的配置

2)纠正后的配置

图30. 纠正后的配置

3.3 Karaf只能启动单实例?

在部署应用过程中,发现当我想要重新打开一个新的Karaf实例的时候,控制台一直会报错。如下所示:

图31. 重新打开Karaf实例报错

通过该提示信息,表明4444端口已经被占用,如果需要开启新的实例,可以通过修改相应的配置文件切换到未使用的端口上。

3.4 Karaf加载ONOS流程?

在做实验的过程中,对Karaf如何加载ONOS的流程比较困惑。经过实验以后,发现Karaf加载ONOS相关组件主要是通过如下的配置文件:$KARAF_ROOT/etc/org.apache.karaf.features.cfg完成的。编辑该文件,并且将如下的片段添加到featuresRepositories中。

图32. Karaf默认加载路径

这里,有一点需要注意的是,图中方框圈出的部分不是固定不变的,要根据实际的ONOS目录进行相应的修改。这样的话,Karaf就回到自己的system目录下去查找相应组件了。

4 参考链接

https://wiki.onosproject.org/display/ONOS/Application+tutorial

https://wiki.onosproject.org/display/ONOS/CLI+and+Service+Tutorial

尊重劳动成果,以上转载自:http://www.sdnlab.com/10297.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ONOS应用示例开发 的相关文章

  • 卡通驱动项目ThreeDPoseTracker——模型驱动解析

    前言 之前解析过ThreeDPoseTracker这个项目中的深度学习模型 xff0c 公众号有兄弟私信一些问题 xff0c 我刚好对这个项目实现有兴趣 xff0c 就分析一波源码 xff0c 顺便把问题解答一下 这个源码其实包括很多内容
  • 卡通驱动项目ThreeDPoseTracker——关键点平滑方案解析

    前言 之前对ThreeDPoseTracker的深度学习模型和unity中的驱动方法进行过解析 xff0c 还有一个比较重要的就是从深度学习模型出来的3D关键点数据会有抖动 xff0c 在ThreeDPoseTracker源码中有做两次平滑
  • 卡通角色表情驱动系列一

    前言 分析完ThreeDPoseTracker来做卡通角色的身体驱动 xff0c 接下来在卡通驱动领域还有一个是表情驱动 对这个真的是一窍不通啊 xff0c 只能慢慢看论文了 国际惯例 xff0c 参考博客 论文 xff1a Landmar
  • opencv相机标定和人头姿态估计案例

    前言 头部驱动除了之前关注的表情驱动外 xff0c 还有眼球驱动和头部方向驱动 本博客基于opencv官方文档和部分开源代码来研究如何基于人脸关键点获取头部的朝向 国际惯例 xff0c 参考博客 xff1a opencv Camera Ca
  • 卡通角色表情驱动系列二

    前言 之前介绍了使用传统算法求解BS系数的表情驱动方法 xff0c 其中提到过的三种方法之一是基于网格形变迁移做的 xff0c 那么这篇文章就是对 Deformation Transfer for Triangle Meshes 做表情驱动
  • HDU 1085 Holding Bin-Laden Captive!(母函数)

    HDU 1085 Holding Bin Laden Captive xff08 母函数 xff09 题目地址 题意 xff1a 给你cnt1个一元硬币 xff0c cnt2个两元硬币 xff0c cnt3个五元硬币 xff0c 问不能凑出
  • UE自带重定向原理

    UE自带重定向方法验证 核心源码在VS的解决方案中的位置 xff1a UE4 Source Developer AssetTools Private AssetTypeActions AnimSequence cpp中第3237行Remap
  • matlab之bsxfun函数

    lt span style 61 34 font size 18px color ff0000 34 gt 简单的调用方法 xff1a lt span gt bsxfun 64 plus xff0c A xff0c B xff0c 其中 6
  • 关于协方差矩阵需要注意的一个事项

    协方差矩阵是衡量样本的属性 即维度 之间的关系 xff0c 而不是样本与样本之间的关系 比如有100个样本 xff0c 每个样本10个属性 xff0c 那么计算得到的协方差矩阵一定是10 10的 xff0c 而不是100 100的 xff0
  • 【caffe-Windows】caffe+VS2013+Windows+GPU配置+cifar使用

    前言 国际惯例 xff0c 先来波地址 xff1a CUDA WIN7 xff1a 链接 xff1a http pan baidu com s 1nvyA3Qp 密码 xff1a h0f3 官方网址 xff1a https develope
  • 【caffe-Windows】以mnist为例lmdb格式数据

    前言 前面介绍的案例都是leveldb的格式 xff0c 但是比较流行和实用的格式是lmdb xff0c 原因从此网站摘取 它们都是键 值对 xff08 Key Value Pair xff09 嵌入式数据库管理系统编程库 虽然lmdb的内
  • 【theano-windows】学习笔记十——多层感知机手写数字分类

    前言 上一篇学习了softmax 然后更进一步就是学习一下基本的多层感知机 MLP 了 其实多层感知机同时就是w x 43 b用某个激活函数激活一下 得到的结果作为下一层神经元的输入x 类似于 o u t p u t 61 f 3 f 2
  • 【theano-windows】学习笔记二十——LSTM理论及实现

    前言 上一篇学习了RNN xff0c 也知道了在沿着时间线对上下文权重求梯度的时候 xff0c 可能会导致梯度消失或者梯度爆炸 xff0c 然后我们就得学习一波比较常见的优化方法之LSTM 国际惯例 xff0c 参考网址 xff1a LST
  • 【TensorFlow-windows】keras接口——ImageDataGenerator裁剪

    前言 Keras中有一个图像数据处理器ImageDataGenerator xff0c 能够很方便地进行数据增强 xff0c 并且从文件中批量加载图片 xff0c 避免数据集过大时 xff0c 一下子加载进内存会崩掉 但是从官方文档发现 x
  • 梯度下降法与Logistic Regression 及 Matlab 代码

    梯度下降法与Logistic Regression 及 Matlab 代码 前言Logistic回归梯度下降法例子1 xff0c 固定学习率改进1 xff1a 正则化改进2 xff1a 动态学习率查看分类效果不足完整代码 前言 本质是一个求
  • ONOS 控制器安装和app新建和编译

    1 1 ONOS 控制器编译与安装 ONOS 1 8 版本起强制使用 BUCK 构建工具 xff0c 不再使用 maven xff0c 编译和打包方式与旧版本有所区别 步骤 xff1a 配置环境 gt 下代码 gt 编译 gt 运行 配置环
  • SQLyog(navica)连接docker容器中的mysql8.0.12 报错1251或2003解决办法

    使用SQLyog xff08 navicat xff09 远程连接docker容器中的mysql8 0 12 报以下错误 解决办法 xff1a 一 在docker中启动mysql 定义端口号3306 root 64 localhost do
  • TTY 到底是个什么玩意?

    先来回答一道面试题 xff1a 我们知道在终端中有一些常用的快捷键 xff0c Ctrl 43 E 可以移动到行尾 xff0c Ctrl 43 W 可以删除一个单词 xff0c Ctrl 43 B 可以向前移动一个字母 xff0c 按上键可
  • 如何画好一份架构图

    先说答案 画架构图分四步走 xff1a 第一 xff0c 搞清楚要画的架构图的类型 xff1b 第二 xff0c 确认架构图中的关键要素 xff08 比如产品 技术 服务 xff09 xff1b 第三 xff0c 梳理关键要素之间的关联 x
  • NVIDIA Jetson Xavier NX 深度学习相关组件安装

    一 tensorflow的安装 写在前面的牢骚话 xff08 可选择直接跳过 xff09 在写安装tensorflow的教程之前 xff0c 我一定要放出当时我安装tensorflow时所遇到的那些莫名其妙的错误 xff0c 具体错误如下图

随机推荐

  • Python - Decorator(装饰器) - 带参数的

    我们通过以示例来看看带参数的装饰器到底怎么回事 from time import perf counter from functools import wraps def repeated times def outer fn 64 wra
  • 2020塔式起重机司机考试及塔式起重机司机考试软件

    题库来源 xff1a 安全生产模拟考试一点通公众号小程序 2020塔式起重机司机考试及塔式起重机司机考试软件 xff0c 包含塔式起重机司机考试答案解析及塔式起重机司机考试软件练习 由安全生产模拟考试一点通公众号结合国家塔式起重机司机考试最
  • 2020煤炭生产经营单位(安全生产管理人员)操作证考试及煤炭生产经营单位(安全生产管理人员)模拟考试软件

    题库来源 xff1a 安全生产模拟考试一点通公众号小程序 2020煤炭生产经营单位 xff08 安全生产管理人员 xff09 操作证考试及煤炭生产经营单位 xff08 安全生产管理人员 xff09 模拟考试软件 xff0c 包含煤炭生产经营
  • 嵌入式系统 Boot Loader 技术内幕

    内容 xff1a 1 引言 2 Boot Loader 的概念 3 Boot Loader 的主要任务与典型结构框架 4 关于串口终端 5 结束语 关于作者 对于本文的评价 在 Linux 专区还有 xff1a 教程 工具与产品 代码与组件
  • PADS VX2.8 PCB版本的降低方法

    在PCB设计过程中 xff0c 可能会遇到不同版本的PCB文件 xff0c 高版本软件可以兼容低版本 xff0c 反之则不能 为了提高兼容性 xff0c 可以将拿到的高版本PCB文件降低为低版本 xff0c 以配合使用低版本软件打开 打开P
  • Ubuntu16.04 速腾rslidar-32线激光雷达使用详细记录

    0 rslidar 32线激光雷达参数 线束 xff1a 32线波长 xff1a 905nm激光等级 xff1a class1精度 xff1a 5cm xff08 典型值 xff09 测量距离 xff1a 0 2m 200m xff08 目
  • useradd 与 adduser

    useradd 选项 用户名 参数如下 xff1a c comment 指定一段注释性描述 d 目录 指定用户主目录 xff0c 如果此目录不存在 xff0c 则同时使用 m选项 xff0c 可以创建主目录 g 用户组 指定用户所属的用户组
  • Python——sqlalchemy.exc.ArgumentError

    报错信息 xff1a sqlalchemy exc ArgumentError Mapper mapped class XmjbqZby gt xmjbq zby could not assemble any primary key col
  • VirtualBox虚拟机ping不通主机,但是主机可以ping通虚拟机

    解决VirtualBox虚拟机不能ping通宿主机的问题 问题描述 在VirtualBox虚拟中 xff0c 无法ping通宿主机 xff0c 宿主机可以ping通虚拟机 虚拟机的网络已经设置为 桥接网卡 xff0c 也可以正常上网 解决方
  • RTThread-W25Q128的驱动基于SPI和SFUD

    文章目录 前言一 kconfig的配置1 配置对应的SPI和SFUD 二 SFUD的使用W25Q128的读写操作 三 关于写入的问题 前言 本文是一个初学者的学习记录 xff0c 可能有误 SFUD是针对flash的一种通用的组件 xff0
  • RT-Thread 基于QSPI驱动LY68L6400-SRAM

    前言 使用的是RTThread 标准版 xff0c 主控是STM32H743 xff0c SRAM是LY68L6400 xff0c 使用QSPI QSPI和SPI的区别 个人理解最大的区别就是SPI是串行 xff0c 数据输出 xff0c
  • 关于学习RTThread的随笔

    认识操作系统 关于单片机的学习是从51到ARM xff0c 慢慢的接触到了操作系统 xff0c 开始也不明白是什么 xff0c 就跟着原子哥的例程学 xff0c 也不知道哪个好 xff1f 开始学UCOS xff0c 后来又用学了FreeR
  • RT-Thread 串口的使用

    1 配置选用的串口 在kconfig文件中增加ENV的串口选项 xff0c 这边选择的是uart2 menuconfig BSP USING UART bool span class token string 34 Enable UART
  • 关于驱动中景园LCD和LVGL踩的一些坑

    背景介绍 我使用的是中景园的1 3寸 xff0c 240 240的LCD xff0c 主控是STM32L152系列 https item taobao com item htm spm 61 3688y 1 14 16 1916264bJ5
  • 使用物联网卡无法通讯

    在使用阿里云的物联网卡时 xff0c 遇到一个电信卡无法通讯的问题 xff0c 数据只能发不能收 xff0c 后来客服跟踪调查后发现 xff0c 物联网卡有一个IP地址的白名单 xff0c 需要让客服把通讯平台的IP地址加到这个白名单才行
  • ESP32+PIO+LGVL+gui_guider

    简介 本文基于VScode上安装platform插件 xff08 简称PIO xff09 来开发ESP32 xff0c 屏幕显示使用LVGL 43 gui guider 关于VScode上使用platfrom也是一把辛酸泪 很多朋友会安装不
  • ESP32+PIO+LGVL+gui_guider之【BUTTON实体按键】

    LVGL的Button外部按键 这个Button是没有触摸屏的情况下用外部的按键来对应屏幕上的按键 xff0c 比如屏幕上有个确定键 xff0c 你按下外部某个按键 xff0c 屏幕的确定键也相应显示按下 工作原理其实就是LVGL把外部按键
  • KEIL工程报错问题解决记录

    1 no section to be FIRST LAST 在一次下载了别人的工程后 xff08 来自51黑论坛STm32L低功耗测试的一个工程 xff09 xff0c 由于其他工程用的DPF包有所不同 xff0c 记得是按照提示更新了固件
  • Linux——centos7搭建node + Nginx + vue + mysql 的服务安装详细步骤

    一 安装所需的软件 二 进行具体配置 三 使用 以下配置及安装为已运行实测的笔记整理 xff0c 严格按照该步骤进行配置 xff0c 大概率上不会有问题 不懂linux的小白也可配置使用 当然 xff0c 最好还是了解一些linux基本的命
  • ONOS应用示例开发

    ONOS应用示例开发 风继续吹 15 04 09 9239 人围观 本文主要是提供了有关ONOS的基于意图的流量转发应用如何开发 构建及部署等方面的实战经验 xff0c 并且详细讲解了如何在命令行上调用服务的过程 最后 xff0c 介绍了在