当前位置:首页 > 技术分析 > 正文内容

ONOS编程系列(一)之简单应用开发

ruisui884个月前 (03-06)技术分析13

一个ONOS application是使用maven做管理的OSGi bundle。 因此,ONOS application 可以归结为Java类和POM文件的集合。本教程以基于intent的交互式转发application为例,讨论了如何从零开始建立一个新应用。

本教程假设读者已经具备ONOS的运行经验,能够熟练启动ONOS实例。有关ONOS的启动不做过多描述。如果出现启动上的问题,请移步官方wiki文档自行寻找答案。

本文章结束后,你应该学会:

  • 应用的组织与结构;
  • 如何在多个服务中注册你的应用;
  • 北向API的基本应用;
  • 如何运行一个应用。

一、在Eclipse中导入工程

直接按照maven项目导入就可以,详情请见ONOS环境部署。

1.1 注意

在ONOS项目中,对代码有着格式上的一些要求,不管是正式代码,还是测试用例。请根据要求修改增加代码的格式。 如果想要跳过代码checkstyle,可以在onos项目根目录下的pom。xml文件中,注释掉关于checkstyle的plugin:

不过非常不建议这样做。最好的方法还是按照官方的要求,进行编程。关于代码格式检查,如果使用的是Eclipse,可以配置checkstyle进行检查: 一路点击eclipse-->help-->Eclipse Marketplace,进入界面:

在输入框里输入“checkstyle”,然后选择框住的那个插件进行傻瓜式安装,就是一路next。这个过程很有可能会报错,Eclipse提示找不到下载网址。如果这种情况,可在
http://eclipse-cs.sourceforge.net/update/这个地方下载,在本地安装就可以了。 安装好以后,在window-->preference弹出的界面里就能看到checkstyle的选项了。单击该选项,右面出现相关界面:

然后点击NEW按钮,增加一个checkstyle文件,在本地ONOS工程里找到onos自己的checkstyle文件,别忘记起个名字。

然后就能在checkstyle文件列表里看到刚刚新添加的文件了。我给它的命名是ONOS。接下来选中该项,点击右边的“Set as Default”,再点击OK,就大功告成了。

后面再新加的文件任意处右键,就能在菜单列表里看到checkstyle的选项了。只需要点击“Check Code with Checkstyle”,就能检查本文件的代码格式是否符合onos的要求了。

二、项目骨架

2.1 设置项目的目录结构

应用的根目录设置在apps/之下:

Shell

$ mkdir -p ${ONOS_ROOT}/apps/ifwd

应用的源文件定义在src/main/java/之下:

Shell

$ mkdir -p ${ONOS_ROOT}/apps/ifwd/src/main/java/org/onosproject/ifwd

类似的,测试文件定义在src/test/java/之下:

Shell

$ mkdir -p ${ONOS_ROOT}/apps/ifwd/src/test/java/org/onosproject/ifwd

2.2 添加并编辑pom文件

在应用的根目录/apps/ifwd/下编辑pom文件:

在本例中,应用的名字是onos-app-ifwd。在启动karaf/ONOS命令行界面以后,直接用feature:install加上名字,即可安装此应用。 然后,编辑apps/pom.xml,在文件中以形式包含该项目:

2.3 在karaf中注册该应用

Karaf在运行时若要部署该应用module,需要名为feature.xml的描述性文件,编辑 ${ONOS_ROOT}/features/features.xml:

三、完成项目代码

该应用的核心是名为
IntentReactiveForwarding.java的文件,被定义在${ONOS_ROOT}/apps/
src/main/java/org/onosproject/ifwd/ 里。 为了便于对文档进行注释,在main/java/下需要添加一个package-info.java文件,其包含一下内容:

一般IDE会提供生成这个文件的选项。Eclipse在新建包的时候会提供该选项:

剩下的部分将会描述如何编辑IntentReactiveForwarding类。

3.1 注册Karaf,使其自动加载

karaf的模块加载机制需要几个annotations,即注解,去注册。可用的注解尤其是以下四个尤为重要:

  • @Component(immediate = true) - declares a class as a component to activate, and forces immediate activation;
  • @Activate - marks a method as the method to call during the component startup routine;
  • @Deactivate - marks a method as the method to call during component shutdown;
  • @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) - Marks a service as an application's dependency,and requires one instance of such a service to be loaded before this application's activation.

3.2 注册服务

接下来,我们的应用必须使用CoreService注册一个独一无二的application ID,这样才能够使该应用正常使用ONOS的其他服务。我们的应用接下来还要使用PacketService监听PacketIn和PacketOut事件。而PacketService需要一个事件处理器的类,该类用途单一,通常写在其所属类的内部,成为其私有内部类:

3.3 增加包处理代码

在上一步的私有内部类ReactivePacketProcessor里,要覆写扩展自接口PacketProcessor的方法process。每当有网络包进来的时候,PacketService都会调用一下process函数。这意味着我们可以在这个方法里定义我们自己的包转发行为:

接下来我们要实现上图中用到的三个方法,注意,这些方法定义在私有内部类的外面,是IntentReactiveForwarding的成员:

3.4 编译该应用

进入ONOS根目录,键入“mvn clean install”,等待编译结果。 这个时候通常的结果就是BUILD SUCCESS。

当前最有可能遇到的问题,就是checkstyle的时候出现了错误,实在不想改代码了,可以直接注释掉checkstyle的plugin。

3.5 启动该应用

启动分为动态启动与静态启动:

动态启动就是用karaf clean命令启动onos之后,在onos命令行下键入
feature:installonos-app-ifwd命令安装该应用。

静态启动就是修改karaf的启动配置文件。该文件路径为${KARAF_ROOT}
/etc/org.apache.karaf.features.cfg,直接将onos-app-ifwd字样缀到featuresBoot变量的尾部即可。

启动并加载该应用以后,可已键入:

命令查看是否已安装该应用。 该应用安装以后,并不能对其做什么操作,也无法看到它的运行情况,这时我们就需要将该应用扩展为一种服务,以便于其它服务或者应用与其交互,并且需要新建一条karaf的命令,用于展示当前应用的相关信息与状态。

注:此文章由OpenDaylight[194240432]@北京-石头提供,感谢他的投稿,有任何疑问或建议可以与他共同探讨!

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/2534.html

标签: mvn help:system
分享给朋友:

“ONOS编程系列(一)之简单应用开发” 的相关文章

vue3父子组件传对象,子组件访问修改父组件对象中的属性值

在Vue 3中,父子组件之间的数据传输通常通过props和emit进行。父组件可以通过props向下传递数据给子组件,子组件则可以通过emit向上通知父组件更新数据。如果需要在子组件中修改父组件对象中的属性值,可以使用一个名为ref的Vue 3新特性。以下是一个示例,演示了如何在Vue 3中实现父子...

vue中router常见的三种传参方式

目录:我们在使用vue开发的过程中使用router跳转的时候肯定会遇到传参的情况;一般情况就三种传参是最常见的;那我们就来看看都有那几种传参方式吧!第一种:{ path: '/mall:id', name: 'Mall', component:...

Vue实现动态路由

通常我们在vue项目中都是前端配置好路由的,但在一些项目中我们可能会遇到权限控制,这样我们就涉及到动态路由的设置了。动态路由设置一般有两种:(1)、简单的角色路由设置: 比如只涉及到管理员和普通用户的权限。通常直接在前端进行简单的角色权限设置(2)、复杂的路由权限设置: 比如OA系统、多种角色的权限...

Vue进阶(二十六):详解router.push()

在Vue2.0路由跳转中,除了使用 <router-link> 声明式创建 a 标签来定义导航链接,还可以借助 router 的实例方法,通过编码式编写代码来实现。router.push(location)想要导航到不同的 URL,则使用 router.push 方法。这个方法会向 hi...

千智云低代码平台 v2.0.6发布「平台升级」

【平台简介】千智云低代码应用平台是一款低代码开发+低代码PaaS+SaaS应用中台为一体的应用平台。平台提供了多种应用场景功能及应用组件,满足各种应用的基本实现,可以使用低代码开发的方式,定制化的开发软件项目,并使用平台提供的各种功能,提供了大多数业务场景的支持。也可以将开发的应用发布到平台,成为S...

微信研发新功能,或许有你最期待的

微信在我们日常社交中担任着非常重要的角色,不管是用于学习还是工作,我们越来越离不开微信,微信的任何一个小的变化都会影响到现如今超过12亿的微信用户。就在前一段时间,微信更新了一个“拍一拍”的功能,只要双击好友头像,头像就会有抖动并带有文字提示,一时间众多网友在朋友圈疯狂刷屏,虽然觉得这个功能毫无用处...