剑客
关注科技互联网

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

引言

Bluemix 是 IBM 最新的云服务,是企业和开发人员可以快速轻松地创建,部署和管理应用程序的云平台。Bluemix 提供企业级的服务,可以轻松地与云应用程序集成。它目前提供了 100 多种服务,覆盖了认知、移动、运维、web 和应用程序、网络、集成、数据与分析、安全、存储、业务分析、物联网、及 API 等。

本文就是使用了 Bluemix 上的移动,物联网及存储等相关的服务,基于 Node-RED 快速构建了一个推送消息给手机,并且可以查看历史数据的应用。该应用主要架构如下:

图 1 架构图

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

主要工作流程:

  1. 设备(在这里是从命令行)发消息给 IoT 平台
  2. IoT 平台转发消息给 Node-RED
  3. 当收到消息时,Node-RED 调用 Push 服务
  4. Push 服务发推送消息给手机端
  5. Node-RED 收到消息时将数据也存入 Cloudant 数据库
  6. 手机客户端从 Cloudant 数据库读取历史消息

为实现以下应用程序需要哪些准备:

  • Bluemix 账号
  • 基本的 Java 技能
  • 基本的 Swift 技能

下面我们分步骤详细介绍如何实现这些功能。

第一步:创建应用程序

  1. 用 IBM ID 登录到 Bluemix,选择目录(CATALOG),选择 Internet of Things Platform Starter 模板。

    图 2 Internet of Things Platform Starter 模板位置

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机
  2. 在打开的页面上,左边栏是关于 Internet of Things Platform Starter 的概要信息,比如版本,类型,以及详细文档的链接;中间栏是当前版所包含的服务,当前版本包含 SDK for Node.js, Cloudant NoSQL DB,及 Internet of Things Platform 服务,那么我们在后边就不需要再额外添加这些服务,此外,还列出了其主要功能及如何收费等信息;右边栏是要配置的信息,输入 Name,Host 字段会根据 Name 的值自动生成,保持其他字段不变,点击创建(CREATE)。

    图 3 Internet of Things Platform Starter 模板页面

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

第二步:启用移动应用程序

点击概述(Overview),找到启用移动应用程序(Enable App for Mobile),并点击。启用移动应用程序的对话框会弹出,显示如下:要启用您的移动应用程序,Bluemix 将新增 Mobile Client Access 提供的应用程序安全性功能。要将 Mobile Client Access 服务添加到您的应用程序吗?选择添加(ADD)。在我们的例子中,移动端的安全问题并不是重点,但是这是启用移动应用程序的必要条件,我们必须添加这个服务。随后选择重新编译打包应用程序(Restage Application)。当应用程序重新启动结束,在概述(Overview)页面的右上角,会出现一个移动选项(Mobile Options),点击它,会出现路径(Route)和应用程序 GUID 两个字段,

图 4 查看 Route 和 App GUID

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

这两个字段很重要,在将来我们实现移动端程序时,会有如下字样的代码,需要指定 Route 和 App GUID,才能连上 Bluemix 里的应用程序。

IMFClient.sharedInstance().initializeWithBackendRoute("http://iot-push.mybluemix.net", backendGUID: "27c9eb7b-0df6-43ac-b338-4678c926e936")

第三步:添加推送(Push)服务

推送服务能帮助我们发送推送消息到 Android 或者 iOS 设备,这些设备能作为标记(tag)或者设备唯一标识符的目标,我们使用简单而统一的 REST API 以配置,订阅,发送和监控推送消息到 Android 和 iOS 设备。

  1. 添加推送服务

    仍然是回到概述页面,点击添加服务或者 API(Add a Service Or API),在 Services 的列表中选择 Mobile,然后找到 IBM Push Notification 服务,并点击之。

    图 5 Push Notification 目录

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

    在右边栏找到 Service name 字段输入服务名称,当然,你也可以使用它的默认名称,点击创建(CREATE)按钮。在随后弹出的窗口中,选择重新编译打包(RESTAGE)。因为该应用程序新添加了服务,必须重新编译打包才能使此服务生效。至此,推送服务添加成功。

  2. 配置证书

    在应用程序的概述页面找到 Push Notification 服务,并点击以进入该服务页面。

    图 6 概述页面的 Push Notification 服务

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

    在打开的页面上会有提示:你还没有配置推送!在其下方,有一个按钮配置推送(Setup Push),点击进入配置页面。

    图 7 配置推送证书

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

    因为此例子中,我们是使用的 iOS 客户端,所以我们只配置苹果推送认证(Apple Push Certificate)。选择你的证书所用的类型(请务必跟你的证书的类型相同,如果你的证书是生产环境下的,那么选择 Production,否则选择 Sandbox。如果类型不匹配,可能手机收不到推送消息。),选择文件位置,填写密码,然后点击保存(Save)。证书配置如下,说明已经配置成功。

    图 8 成功配置推送证书

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

第四步:配置 Cloudant 数据库

  1. 创建数据库

回到应用程序的概述页面,找到 Cloudant NoSQL 服务,点击以打开这个服务,在右上角找到 LAUNCH 按钮 使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机 ,并点击。在新打开的 Cloudant 控制台页面中,在右上角找到按钮 – 创建数据库(Create Database),点击之,在弹出的对话框里,填上数据库的名字,在这里我们填上 demodb,并点击创建(Create),随后页面上有数据库创建成功的字样出现,并且自动切入到已创建好的数据库中。至此,我们的数据库创建工作已经完成。

图 9 在 Cloudant 里创建数据库

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

  1. 设置权限

    仍然是在 Cloudant 控制台页面中,在数据库列表中点击刚刚建好的 demodb,进入其子菜单,找到权限(Permissions),为其他用户勾选上_reader 选项。

    图 10 Cloudant 数据库的权限设置

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

  2. 获取 API 连接

    获取数据库里所有数据的 API 为如下格式:https://<host>/<db_name>/_all_docs?include_docs=true

    在应用程序的概述页面(Overview),找到 Cloudant NoSQL DB,点击 Show Credentials,在打开的窗口中找到 host,替换上面的相应字段;在 db_name 中用我们的数据库的名字 demodb 替换;设置 include_docs 为 true,是为返回列表中的数据,如果没有这个参数,或者设为 false,则只会返回数据项的 ID 和 key 信息,没有数据信息。

    图 11 Cloudant 的凭证信息

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

    点击查看 最终该 API 呈现形式 ,在移动端可以使用该 API 获取历史数据。

第五步:配置 IoT 服务

  1. 回到应用程序的概述页面,找到 Internet of Things Platform 服务,点击进入该服务的页面,找到 Launch dashboard 按钮,并点击之。
  2. 在新打开的标签页中,在左侧竖边栏上悬停,在打开的菜单栏上,找到设备 DEVICES,并点击之。

    图 12 IoT 菜单

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

  3. 在新打开的设备列表中,目前还没有设备。点击右上角的 Add Device, 开始添加一个设备。首先要选择设备类型,在下拉列表里,暂时还没有设备类型。所以先点击 Create device type 按钮创建一个设备类型。

    图 13 添加设备

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机
  4. 在弹出的页面上,仍然选择 Create device type.

    图 14 创建设备类型

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机
  5. 接下来,在页面上输入类型名称(Name),这个是必填项,然后点击右下角的下一步(Next),期间有一些信息要填,但都不是必填项,可以留空,一直点击 Next,直到最后点击创建(Create)。
  6. 在选择设备类型(Choose Device Type)里选择刚刚创建的设备类型,点击右下角的下一步。
  7. 在设备信息(Device Info)页面,填写设备 ID,这是唯一必填的信息。点击额外的字段(+Additional fields)会有更多详细的字段可以填写,如序列号,制造商,模型,类别等等,这些字段会根据在设备类型中设置的属性值自动填充,也可以填上这些字段的值以覆盖设备类型中的值,此外设备类型中没有定义的属性,也可以增加。然后点击右下角的下一步。
  8. 元数据(Metadata)这页,可以留空,点击下一步。
  9. 在安全(Security)这页,主要是获取安全口令。有两个选择,一是使用自动生成的口令:会为你自动生成认证口令。该口令是一个 18 位长,包含数字、字母,以及符号的混合体,它将在注册流程的最后返回给你;另一个种是由你为该设备提供认证口令。在这种情况下,该口令是 8 到 36 位长,可以包括大小写字母,数字及符号(连字号,下划线及句点)。如果你要使用自定义的口令,在请提供口令(Provide a token)后边的横线上填写,然后点击下一步。
  10. 在概要信息(Summary)这页,主要是显示之前所填的信息,请核对为该设备所提交信息是否正确。如果无误,请点击添加(Add)。
  11. 在设备凭证(Your Device Credentials)页,这个设备已经被注册到了这个组织。要想连接到这个组织,需要把如下信息添加到你的设备上。请牢记认证口令(Authentication Token),由于安全方面的原因,这个口令一旦被忘记,将没有办法获取。

    图 15 设备凭证信息

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

    使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

12.点击右上角的按钮 使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机 ,关闭当前页面。在设备列表里,即有刚刚创建的设备。至此,设备的创建已经完成。

第六步:在 Node-RED 里创建工作流

点击仪表板(DASHBOARD),在应用程序列表里找到刚刚创建的应用程序,点击图标。

图 16 找到 Node-RED 入口图标

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

在打开的 Node-RED 页面,找到 Go to your Node-RED flow editor 按钮,点击以进入流编辑器。接下来,我们将使用 Node-RED 流编辑器来构建一个工作流。 读者也可以 点击这里 打开 Node-RED 流编辑器。

1.在左侧调色板中,找到 input 区域,拖拽 ibmiot 节点 使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机 拖到画布上,双击以打开编辑页面进行配置。首先要选择认证(Authentication)的方式:此下拉框有 3 个值 Quickstart, API Key, Bluemix Service. Quickstart 是用于快速入门的案例学习用的;API Key 选项需要输入 API Key 和 API token,多用于 IoT Platform 与 Node-RED 不在同一个 app 时;Bluemix Service 是内部的服务调用,并不需要输入参数,主要用于 Node-RED 与 IoT 在同一 App 时。因为我们的 App 里边有 IoT Platform 服务,我们可以选择 Bluemix Service 直接连接。选定认证方式后,需要选择输入类型(Input Type),这里输入类型有 Device Event, Device Command, Device Status, Application Status, 从名称上我们即可知道他们 主要检测的重点。我们在此选择 Device Event。至于设备类型(Device Type),设备标识(Device Id),事件(Event),格式(Format)等选择 All 即可,再填写节点名称(Name),点击 OK。

图 17 ibmiot 节点的编辑页面

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

2.在 function 区域找到 json 节点 使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机 ,并将其拖拽到画布上。我们使用此节点是为了解析 msg.payload,把一个 javascript 对象转化为 json 字符串。

3.在 function 区域找到 function 节点 使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机 ,并将其拖拽到画布上。双击该节点,打开编辑页面。在 Name 字段输入该节点名称(建议填上该字段,否则节点显示名为空),在 Function 区域已有一句 return msg; 在此之前加入如下代码:

var message = JSON.parse(msg.payload).d ;
msg.payload = {  
  "message": {“alert": message.content }
};
return msg;

图 18 function 节点的编辑页面

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

4.在 output 区域找到 ibmpush 节点 使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机 ,将其拖拽至画布。双击该节点,打开编辑页面。因为当前节点所属的应用程序有 Push 服务,所以对该节点初始化时会自动去读取该应用程序 ID 和 push 服务的 appSecret 字段。编辑页面上的可编辑的推送属性只有 2 个:模式(Mode)和类型(Type)。

模式有沙箱(Sandbox)和生产(Production)模式,由于我们的证书是生产模式下的,所以我们选择生产模式。

类型一共有 5 种:

  • 广播(Broadcast):可以向所有设备发送
  • 通过标记(By Tags)
  • 通过设备唯一标识符(By DeviceIds)
  • 仅 Android 设备(Only Android devices)
  • 仅 iOS 设备(Only iOS devices)

由于我们 demo 的移动端程序仅支持 iOS 设备,所以我们选择 Only iOS devices.

图 19 ibmpush 节点编辑页面

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

5.在 storage 区域找到 cloudant 节点 使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机 ,将其拖拽至画布。双击节点,打开编辑页面。Service 字段已经自动定位到当前应用程序里附带的 Cloudant 数据库;Database 字段输入我们前面已经创建好的数据库名;Operation 字段表明要执行的操作是插入(insert)还是删除(remove),因为我们要存查消息进数据库,所以这里选择 insert;勾上 Only store msg.payload object,将只存储 msg.payload 里的数据,否则会存储整个 msg 对象的值。最终,我们配置如下:

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

将各节点用线连接起来,形成如下所示的流:

图 20 最终的工作流

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

在所有节点都修改之后,点击右上角的 Deploy 按钮来部署此工作流。当屏幕中间弹出成功部署(Successfully deployed)时,说明此流已经部署成功。

你也可以通过导入功能导入以上工作流。先找到菜单->导入->剪切板。

图 21 Node-RED 的导入功能

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

然后把以下代码粘贴到剪切板上,点击 Ok 按钮。当鼠标在画布上点击时,工作流即会落到画布上,然后部署即可。

[{"id":"1b156a6f.f4bd96","type":"ibmiot","z":"2282255c.190b3a","name":"my
api key"},{"id":"1007c76.d968b39","type":"ibmiot
in","z":"2282255c.190b3a","authentication":"boundService","apiKey":"1b156a6f.f4bd96","inputType":"evt","deviceId":"","applicationId":"","deviceType":"+","eventType":"+","commandType":"","format":"json","name":"IBM
IoT","service":"registered","allDevices":true,"allApplications":"","allDeviceTypes":true,"allEvents":true,"allCommands":"","allFormats":true,"x":212,"y":139,"wires":[["ba7c7e78.984a9"]]},{"id":"ba7c7e78.984a9","type":"json","z":"2282255c.190b3a","name":"","x":334,"y":139.5,"wires":[["13ed7f07.efa891"]]},{"id":"13ed7f07.efa891","type":"function","z":"2282255c.190b3a","name":"Message","func":"var
message = JSON.parse(msg.payload).d
;/nmsg.payload=message.content;/nreturn
msg;","outputs":"1","noerr":0,"x":466.5,"y":140,"wires":[["1b7a992d.274b47","27c244f9.52993c"]]},{"id":"1b7a992d.274b47","type":"cloudant
out","z":"2282255c.190b3a","name":"","cloudant":"","database":"demodb","service":"iot-push-cloudantNoSQLDB","payonly":true,"operation":"insert","x":613.5,"y":165.5,"wires":[]},{"id":"27c244f9.52993c","type":"ibmpush","z":"2282255c.190b3a","name":"","ApplicationID":"","identifiers":"","notification":"ios","mode":"PRODUCTION","x":612,"y":115,"wires":[]}]

第七步:发送 MQTT 消息

我们用 Java 实现一段程序,以发送 MQTT 消息给 IoT 平台。其中,我们引用了如下包:

com.ibm.iotf.client.2016.4.21.jar, gson-2.2.4.jar,httpclient-4.3.6.jar, httpcore-4.3.3.jar,
org.eclipse.paho.client.mqttv3-1.0.3-20150818.040635-202.jar

核心代码及解析如下:

public class DeviceMessage {
	DeviceClient deviceClient = null;
	public DeviceMessage() {
		//设置连接属性,用我们已经创建好的设备的凭证,连接到我们的 IoT 服务。
		Properties options = new Properties();
		options.setProperty("org", "6bnaci");
		options.setProperty("type", "Type1");
		options.setProperty("id", "Device1");
		options.setProperty("auth-method", "token");
		options.setProperty("auth-token", "12345678");
		try {
			deviceClient = new DeviceClient(options);
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			//连接到 IoT 服务,参数设成 false,如果连接失败,不自动重新连接;如果设置成 true,那么程序会一直重试直到连接成功。
			deviceClient.connect(false);
		} catch (MqttException e) {
			e.printStackTrace();
			System.out.println("network connection error !");
		}
	}
	public void sendMessage(String[] msg) {
		//创建一个对象 event
		JsonObject event = new JsonObject();	
		//如果此类被执行时有一个参数传入,我们即把它作为属性赋给 event,否则即赋值“This is one push message.”
		if(msg!=null & msg.length==1){
			event.addProperty("content", msg[0]);
		}else{
			event.addProperty("content", "This is one push message.");
		}
		//发送消息到 IoT 平台
		deviceClient.publishEvent("status", event);
		//从 IoT 平台断开连接
		deviceClient.disconnect();
	}
		public static void main(String args[])  {
		DeviceMessage dm = new DeviceMessage();
		dm.sendMessage(args);
	}
}

我们通过命令行(当然,也可以引入这个 java 项目,在 IDE 里如 Eclipse 运行该程序)运行,

Java -jar Push.jar "This is the message from the command line."

图 22 在命令行发送 MQTT 消息

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

第八步:手机装上相应的客户端程序

将应用程序发布到苹果的 App Store 或者其他 store(如某些公司内部有自己 App Store 供开发测试用),并用手机安装,打开应用程序,按第七步:发送 MQTT 消息在命令行发送一条命令,手机端即可接收推送消息了,同时也能查看历史记录。详细源代码已经附在后边,请大家自行查看。

下载源代码

结束语

本文就是使用了 Bluemix 上的移动,物联网及存储等相关的服务,基于 Node-RED 快速构建了一个推送手机消息,并且可以用手机查看 Cloudant 数据库中的历史数据的应用,希望对大家学习理解 Bluemix 及移动应用,存储,及物联网等方面有所帮助。如有任何与文章主题相关的问题请与我联系,我会积极与大家交流沟通。谢谢您的阅读!

参考资源

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址