Alljoyn 概述(2)

AllJoyn 基本概念

• 总线(Bus)
– 实现P2P通信的基础
– AllJoyn 的底层协议类似于D-Bus,相当于是跨设备分布式的 D-Bus

• 总线附件(Bus Attachment)
– 每一个连接到总线上的Alljoyn应用程序被称为总线附件,可用C++或Java编写
– 每个总线附件有独一的名称(unique name),当每次连接到总线时自动分配
– 每个总线附件可以有一个易读的名称(well-known name),用于标识服务,例如“org.alljoyn.bus.addressbook”

• 总线接口(Bus Interfaces)
– 类似于Java中的接口,定义了方法、信号处理函数和属性
– 所有总线方法(Bus Methods)可使用简单或复杂的数据类型(数组、结构等)作为参数 和返回值

• 总线对象(Bus Objects)
– 用于实现总线接口,每个总线对象实现一个或多个总线接口
– 处理远程方法调用(Remote Method Calls)和发出信号(signals)、消息(messages) – 总线对象通过总线附件注册到总线上
– 每个总线对象有一个类似于文件路径的路径名,例如/org/AllJoyn/Games/chess,用于远程方法调用

• 代理总线对象(Proxy Bus Object)
– 一旦总线附件之间建立连接,应用程序创建一个代理总线对象,实现远程方法调用(Remote Method Calls)并准备好从总线上接收信号(signals)
– 远程方法调用是同步的,信号则是异步的且可以一对多(广播)或一对一

• service 和 client
– P2P 应用中提供服务的一方称为 service,使用服务的一方称为 client
– 一个应用程序可以同时是 service 和 client(例如chat)

• session
– 在宣告服务后,service 需创建一个或多个 session,client 发现服务后加入 session
– 每个 session 有一个 session port,类似于 socket 通信中的 port
– session 的两种情形:
point-to-point session:两个 peer 之间交互
multipoint session:多个 peer 加入同一个 session,组成一个 group

• AllJoyn daemon——实现P2P通信的核心
– daemon通过进程间通信(IPC)与应用程序通信,应用程序只与 daemon打交道
– daemon提供一个抽象层处理所有的网络传输、消息路由、命名空间管理等
– 整个AllJoyn系统相当于一个虚拟总线,连接多个AllJoyn daemons和总线附件
– daemon是用 C++编写的 native程序,运行在不同操作系统上的 daemons可实现互联
– 在应用程序启动之前必须先启动daemon

• AllJoyn daemon 在 Android 上的三种实现形式
– 第一种:Android app(AllJoyn.apk)
只支持 WiFi/TCP 传输
无需 root 权限
– 第二种:纯C++编写的可执行程序,在 adb shell 下运行(alljoyn-daemon)
若使用 WiFi 传输无需 root 权限
若使用 Bluetooth 传输需 root 权限,且蓝牙协议栈限定用 bluez
可在 init.rc 中自动加载
– 第三种:与应用程序捆绑在一起(bundle),不需要单独启动daemon
适用于发布基于AllJoyn开发的应用程序

• 设备发现和建立连接的过程
– 注册(Register): 连接在总线上的对象为自身进行注册
– 宣告(Advertise): 连接在总线上的对象通过IP组播(multicast)宣告自身的存在
– 发现(Discover): 发现其他对象的存在

• 在使用蓝牙时借助蓝牙本身的 SDP 进行发现

• 设备连接过程示意图:

设备连接过程示意图

• 设备之间通信的方式
– 远程方法调用(同步)
– Signal(异步)
– Raw session(直接 socket 通信,应用程序可选择基于 TCP 或 UDP )

设备之间通信的方式

简单应用程序代码示例——echo

总线接口定义:

import org.alljoyn.bus.BusException;
import org.alljoyn.bus.annotation.BusInterface; 
import org.alljoyn.bus.annotation.BusMethod;
/*
* This interface implements a simple echo method that returns the same string * that is receives.
*/
@BusInterface
public interface EchoInterface {
    /*
    * Echo a string.
    *
    * inStr is the string to be echoed by the service, returns the echoed string. */
    @BusMethod(signature="s", replySignature="s")
    public String Echo(String inStr) throws BusException; 
}

Service端:

public class Service implements SimpleInterface, BusObject {
    public static void main(String[] args) {
        /* Create a bus connection and connect to the bus */
        BusAttachment bus = new BusAttachment(Service.class.getName()); 
        bus.connect();
        /* Register the service */
        Service service = new Service();
        bus.registerBusObject(service, "/myobject");
        /* Request a well-known name */
        try {
            bus.RequestName("org.alljoyn.echo", REQUEST_NAME_NO_FLAGS); 
        } catch (BusException ex) {
            return;
        }
        /* Echo until told to stop */
        while (!stop) { Thread.sleep(10000); } 
    }
    /* Implementation of the echo method */ 
    public String Echo(String inStr) {
        return inStr; 
    }
}

Client端:

public class Client {
    public static void main(String[] args) {
        /* Create a bus connection and connect to the bus */
        BusAttachment bus = new BusAttachment(Client.class.getName());
        bus.connect();
        /* Get a remote object */
        Class[] ifaces = { EchoInterface.class };
        ProxyBusObject proxyObj = bus.getProxyBusObject("org.alljoyn.echo", "/myobject", ifaces);
        SimpleInterface proxy = proxyObj.getInterface(EchoInterface.class);
        /* Call the ping method on the remote object */ 
        try {
            String ret = proxy.Echo("Hello World");
            System.out.println("Echo returned: " + ret); 
        } catch (BusException ex) {
            return; 
        }
    } 
}

AllJoyn应用程序典型API调用流程示意

API调用流程示意

AllJoyn的安全机制

• AllJoyn的安全模型——认证和加密(Authentication and encryption)
• 认证和加解密是基于应用程序实现的,总线只负责传输和路由而并 不参与认证和加解密
• 每个应用程序维护各自的 key store并采用密码保护
• AllJoyn支持 3种安全机制,基于Transport Layer Security (TLS) 协议,应用开发者根据应用程序的类型和所传输数据的种类来选择 3种机制之一:
– PIN-code
– logon
– certificate-based
• 安全和非安全应用程序的差别:
– 前者在定义总线接口时需使用@Secure注释符,后者无
– 前者需定义一个class实现AuthListener 接口,在该类中实现两个方法:requested 和completed

安全机制工作原理:
安全机制工作原理

加入安全机制的应用程序代码示例

总线接口定义:

import org.alljoyn.bus.BusException;
import org.alljoyn.bus.annotation.BusInterface;
import org.alljoyn.bus.annotation.BusMethod;
import org.alljoyn.bus.annotation.Secure; @BusInterface(name = "org.alljoyn.bus.samples.secure.SecureInterface")/*


 * The @Secure annotation marks requests any method calls on this interface to first authenticate


 * then encrypt the data between the AllJoyn peers.

@Secure
public interface SecureInterface {
    @BusMethod

    String Ping(String inStr) throws BusException;

}

Service端:

...... 

/*

 * The main differences between a secure application and a plain application, besides the

 * @Secure annotations of the interfaces, are encapsulated in the AuthListener. The

 * BusAttachment calls the listener with various authentication requests in the process of

 * authenticating a peer. The requests made are dependent on the specific authentication

 * mechanism negotiated between the peers.

 *

 * mechanisms.

 */

class AuthListeners implements AuthListener {

/*

 * Authentication requests are being made. Contained in this call are the mechanism in use,

 * the number of attempts made so far, the desired user name for the requests, and the

 * specific credentials being requested in the form of AuthRequests.

 *

 * A true return value tells the BusAttachment that the requests have been handled.

 *

 */

 public boolean requested(String mechanism, String peer, int count, String userName, AuthRequest[] requests) {

     ....

     ....

 }
 /*

  * An authentication attempt has completed, either successfully or unsuccessfully.

  * This simply defers to the specific listener based on the mechanism in use.

  */

  public void completed(String mechanism, String authPeer, boolean authenticated) {
      ....

      ....

    }

}


......
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值