Kura 如何在 bundle 之间进行通信?

Kura How to communicate between bundles?

我正在尝试做一个 IoT 项目,我需要在其中实现一些 OSGi 服务。问题是这些服务需要在它们之间发送信息。我已经看到这可以通过 "bnd" 等工具来实现,但目前我正在使用 Kura。所以,我想知道用 Kura 做这件事的方法是什么。

非常感谢您的帮助。

I have seen that this is possible to do with some tools like "bnd", but currently I am working with Kura.

bnd 项目是一个主要在构建时用于帮助您 assemble OSGi 包的元数据的工具。使用 bnd 来帮助制作您的包,然后在运行时在像 Kura 这样的平台上使用它完全没有问题。

I am trying to do an IoT project where I need to implement some OSGi services.

实现 OSGi 服务的最简单方法是使用名为 Declarative Services 的注入框架。这允许您编写将在 OSGi 服务注册表中注册的简单 POJO。这就像将 @Component 添加到 class:

一样简单
@Component
public class MyComponent implements SomeService {

    @Override
    public void someServiceMethod() { }

}

以上组件将自动注册为 SomeService 因为它实现了接口。 Kura 平台包括一个声明式服务实施,因此您不需要安装任何其他东西。但是,您应该根据 Kura 支持的版本检查您使用的注释版本(3.x of Kura 使用 DS 1.2,4.x 使用 DS 1.3)。

The problem is these services need to send information between them.

使用 DS 实现的 OSGi 服务能够使用 @Reference 注释以一种非常干净和简单的方式相互引用。

@Component
public class MyComponent implements SomeService {

    SomeOtherService someOtherService;

    @Reference
    void setSomeOtherService(SomeOtherService sos) {
        someOtherService = sos;
    }

    @Override
    public void someServiceMethod() { 
        someOtherService.doSomethingElse();
    }
}

如果您能够使用 DS 1.3,则可以将 @Reference 注释直接应用于字段:

@Component
public class MyComponent implements SomeService {

    @Reference
    SomeOtherService someOtherService;

    @Override
    public void someServiceMethod() { 
        someOtherService.doSomethingElse();
    }
}

OSGi enRoute project

中有更多使用声明式服务和其他 OSGi 规范的示例