Kii BLOG

借助 AllJoyn 和 Kii 让智能设备连系起来

借助 AllJoyn 和 Kii 让智能设备连系起来

AllJoyn 开源你的物开底络协议和硬件。

作为 AllSeen Alliance 成员,我们对 AllJoyn™物联网项目框架非常感兴趣。AllJoyn 使用面向对象的方式,将各种传输更加点对点化从而降低开发的复杂度。其核心是使用 C++ 编写,提供多语言捆绑(如Java、JavaScript、C#、ObjC),并支持跨操作系统和芯片组开发。

以下是(在 nodejs )使用 JavaScript 借助 AllJoyn 快速实现信息交流。这里也包括如何通过在 Kii 上记录所接收的消息并用于后续处理从而让项目启用云计算。本教程中,我们将发送文本消息,但是 Kii 可以使用更丰富的数据,例如音乐、照片、视频等。你可以借助云存储和分析发送歌曲给智能音箱或发送照片给智能电视。

AllJoyn 框架总览 

在讲解代码前,你需要了解一些 AllJoyn 的基础知识。一个 AllJoyn 会话中的所有节点(peer)都必须通过一个(相对较底层的)总线(bus)来“交流”,可以把它看成是用于传输所有 AllJoyn 消息的高速公路。首先,创建一个总线附件并将你的 App 连接到总线上。通过一个总线节点可以参与 AllJoyn 会话中,但它必须通过一个具体的接口(interface)来完成。该接口是在总线上被创建的,其目的是处理共享对象和发送到对象的信号(signal)的。在我们的例子中,节点将在总线中共享一个聊天对象且发送给它的信号将被作为消息中继到其它节点。

接下来,你必须决定你的 App 是否加入并使用现有的服务器或公告一个服务器给其他节点加入。假设你要公告一个服务器,给它起一个方便识别的名称。其他节点将尝试使用这个名称找到你的服务器。然后,绑定一个端口(例如:27)从而在总线上创建一个会话(session)。步骤如下:

  1. 创建一个 BusAttachment 并连接到 AllJoyn 框架从而与其他 AllJoyn App 通讯
  2. 在总线(Bus)中创建一个接口(Interface)并定义将要处理的信号(Signal)
  3. 创建一个 BusObject 并与接口配对(启动总线后)
  4. 定义一个 SignalHandler 用于发送信号到 BusObject
  5. 使用总线(Bus)注册 BusObject 并连接
  6. 如果公告服务器 :
  •   选择一个唯一的标识符,创建一个唯一的名称
  •   创建一个其他 App 可以进入的会话(Session)
  •   通过公告该服务器名称告诉其他 App

  7. 如果加入服务器:

  •   通过一个名称前缀查找附近其他 App
  •   在找到一个服务器名称后,定义一个 BusListener 从而能够加入到一个会话中
  •   加入到一个已找到的会话

  8. 在你的群组中与其他 App 通信

不必惊慌!我们将在下文中遍历所有步骤所需的代码。

安装和编译 AllJoyn

在使用 AllJoyn 前需要先安装它。你可以下载源码并编译它(例如用于 Raspberry Pi),但最简单的方法是使用 npm 包(这里要感谢 Octoblu!)并通过 JavaScript(需要 nodejs)来测试框架。安装过程如下:

  1. 安装 npm 和 nodejs(备选安装请点击这里
  2. 安装 AllJoyn npm 包
  3. 安装 node-jquery-xhr npm 包(Kii js SDK 会用到)
  4. 下载 Kii js SDK 并将其放入到欲运行的脚本所在的目录中
  5. 测试 Octublu 提供的 example-host.js 和 example-client.js 确保正常运行

i)     Mac 上的脚本位于 /opt/local/lib/node_modules/alljoyn(如果使用 -g 全局安装的话)并可以借助 node 命令运行

公告聊天服

接下来看看我们的 nodejs 脚本。它可以在主机模式运行,以公告一个聊天服务器让其他节点加入;也可以作为客户端运行,根据主机在网络上公告的名称查找服务器,然后连接到该服务器。这里可以有多个客户端,但是主机只能有一个。主机和客户端使用一个脚本的原因是95%的代码都可共享(见下文)。

一旦连接完成,所有节点(主机和客户端)的行为都相同,即监听和显示发来的消息并可以发送消息给其他节点。另外,将主机和客户端所有发来的消息记录在 Kii Cloud 用于后续的分析。

Kii 的初始化和认证 

developer.kii.com 中创建一个 Kii App 后,写下 App ID 和 Key 从而初始化 Kii:

代码1

Kii 初始化后,通过命令行尝试使用节点名和密码登录。如果失败了,则第一时间尝试在 Kii 服务器上注册:

代码2

需要注意,Kii API 在它的方法中提供了异步调用方法(使用 callbacks),这些方法控制起来更加简便,且在用户登录或注册的同时脚本可以继续运行。

置 AllJoyn 总线

所有想使用 AllJoyn 参加会话的节点都需要做一些总线设置:

代码3

一个聊天对象被当作节点间的公共结构用于接收信号。信号处理器将信号解释为消息。

在主机上公告服

挂接到某一 AllJoyn 总线后,主机将公告服务器名称,以及一个会话、端口和端口监听回调:

代码4

主机将在端口 27 上有效地监听客户端连接,并为每个连接执行端口监听回调。

在客端上找服

客户端完成与主机相同的总线设置并遍历该总线。与主机不同的是客户端不公告服务器而是查找服务器(使用相同的服务器名):

代码5

对于客户端来说,总线监听回调是关键,因为它定义了当一个服务名被找到后需要做些什么。下例中,当服务器被找到时,我们告诉客户端加入一个会话:

代码6

送、接收以及记录消息

主机和客户端对发送和接收消息的处理方式是相同的。首先,一个共享的总线对象在总线上被创建,然后每个节点订阅通过一个信号处理器发送到该总线对象的信号。

图片7

为了发送消息,节点需要从标准输入输出(stdin)输入并发送信号给共享的聊天对象:

代码8

为了接收消息,每个节点都有一个信号处理器,该信号处理器会将信号解释为收到的消息。将消息发送给控制台并将其记录到 Kii 上:

代码9

请注意:为了储存 Kii 数据,你需要在一个 App 级 Bucket 中创建一个 KiiObject 并同 Key/Value 存储一样设置收到消息的所有信息。之后,你可以节省 Kii 对象与异步调用,并用 Kii Data Browser 在 developer.kii.com看到存储的消息:

图片10

就是这样。请记住,节点将消息解释为文本从而显示在屏幕上,但是这些交换的信息可以拥有更加复杂的结构、命令等等从而使用于所有类型的物联网方案。甚至二进制格式的文件也可以作为信息交换并作为文件保存到 Kii 上。当然,除了可以将数据保存到 Kii Cloud 上,你还可以通过其提供的强力查询系统检索数据。

使用 AllJoyn 十分容易,在此感谢 js npm 包。由于 Kii 提供的 JavaScript SDK 集成了该包,你不但可以创建一个 AllJoyn 聊天服务还可以拥有云记录并在任何时候运行它。请记住,节点可以是简单的物联网设备,将消息解释为命令从而做一些有意义的事情或是交换更丰富的数据例如流媒体音乐(更多关于这部分的信息将在 Kii 的微博、微信、博客上发布)。

主机和客户端的完整源码在这里。使用方法很简单:

> node peer.js [MODE] [YOUR_APP_ID] [YOUR_APP_KEY] [USERNAME] [PASSWORD]

MODE 可以是 “host” 或 “client”。先使用主机(host)模式运行,然后打开另一个程序并使用客户端(client)模式运行(由于嵌入的 AllJoyn 后台程序会使用相同的地址,所以如果提示地址已经被使用的错误,请尝试从网络上的另一台机器上运行)。请注意,你只能运行一个主机,但是可以有任意多客户端。参数 YOUR_APP_ID 和 YOUR_APP_KEY 可以在 developer.kii.com 上创建 App 后获得。你还可以随意设置你的用户名和密码,如果凭据在 Kii 上不存在,则将在第一时间被创建。我们建议每个运行的脚本使用不同的用户名(否则,无论客户端还是主机都会在同一个用户下记录数据)。

祝编码愉快!!!!!

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注