使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机
Bluemix是 IBM 最新的云服务,是企业和开发人员可以快速轻松地创建,部署和管理应用程序的云平台。Bluemix 提供企业级的服务,可以轻松地与云应用程序集成。它目前提供了 100 多种服务,覆盖了认知、移动、运维、web 和应用程序、网络、集成、数据与分析、安全、存储、业务分析、物联网、及 API 等。
本文引用地址:https://www.eepw.com.cn/article/201611/340672.htm本文就是使用了 Bluemix 上的移动,物联网及存储等相关的服务,基于 Node-RED 快速构建了一个推送消息给手机,并且可以查看历史数据的应用。该应用主要架构如下:
图 1 架构图
主要工作流程:
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 模板位置
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 模板页面
第二步:启用移动应用程序
点击概述(Overview),找到启用移动应用程序(Enable App for Mobile),并点击。启用移动应用程序的对话框会弹出,显示如下:要启用您的移动应用程序,Bluemix 将新增 Mobile Client Access 提供的应用程序安全性功能。要将 Mobile Client Access 服务添加到您的应用程序吗?选择添加(ADD)。在我们的例子中,移动端的安全问题并不是重点,但是这是启用移动应用程序的必要条件,我们必须添加这个服务。随后选择重新编译打包应用程序(Restage Application)。当应用程序重新启动结束,在概述(Overview)页面的右上角,会出现一个移动选项(Mobile Options),点击它,会出现路径(Route)和应用程序 GUID 两个字段,
图 4 查看 Route 和 App GUID
这两个字段很重要,在将来我们实现移动端程序时,会有如下字样的代码,需要指定 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 目录
在右边栏找到 Service name 字段输入服务名称,当然,你也可以使用它的默认名称,点击创建(CREATE)按钮。在随后弹出的窗口中,选择重新编译打包(RESTAGE)。因为该应用程序新添加了服务,必须重新编译打包才能使此服务生效。至此,推送服务添加成功。
2.配置证书
在应用程序的概述页面找到 Push Notification 服务,并点击以进入该服务页面。
图 6 概述页面的 Push Notification 服务
在打开的页面上会有提示:你还没有配置推送!在其下方,有一个按钮配置推送(Setup Push),点击进入配置页面。
图 7 配置推送证书
因为此例子中,我们是使用的 iOS 客户端,所以我们只配置苹果推送认证(Apple Push Certificate)。选择你的证书所用的类型(请务必跟你的证书的类型相同,如果你的证书是生产环境下的,那么选择 Production,否则选择 Sandbox。如果类型不匹配,可能手机收不到推送消息。),选择文件位置,填写密码,然后点击保存(Save)。证书配置如下,说明已经配置成功。
图 8 成功配置推送证书
第四步:配置 Cloudant 数据库
1.创建数据库
回到应用程序的概述页面,找到 Cloudant NoSQL 服务,点击以打开这个服务,在右上角找到 LAUNCH 按钮 ,并点击。在新打开的 Cloudant 控制台页面中,在右上角找到按钮 – 创建数据库(Create Database),点击之,在弹出的对话框里,填上数据库的名字,在这里我们填上 demodb,并点击创建(Create),随后页面上有数据库创建成功的字样出现,并且自动切入到已创建好的数据库中。至此,我们的数据库创建工作已经完成。
图 9 在 Cloudant 里创建数据库
2.设置权限
仍然是在 Cloudant 控制台页面中,在数据库列表中点击刚刚建好的 demodb,进入其子菜单,找到权限(Permissions),为其他用户勾选上_reader 选项。
图 10 Cloudant 数据库的权限设置
3.获取 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 的凭证信息
点击查看最终该 API 呈现形式,在移动端可以使用该 API 获取历史数据。
第五步:配置 IoT 服务
1.回到应用程序的概述页面,找到 Internet of Things Platform 服务,点击进入该服务的页面,找到 Launch dashboard 按钮,并点击之。
2.在新打开的标签页中,在左侧竖边栏上悬停,在打开的菜单栏上,找到设备 DEVICES,并点击之。
图 12 IoT 菜单
3.在新打开的设备列表中,目前还没有设备。点击右上角的 Add Device, 开始添加一个设备。首先要选择设备类型,在下拉列表里,暂时还没有设备类型。所以先点击 Create device type 按钮创建一个设备类型。
图 13 添加设备
4.在弹出的页面上,仍然选择 Create device type.
图 14 创建设备类型
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 设备凭证信息
12.点击右上角的按钮 ,关闭当前页面。在设备列表里,即有刚刚创建的设备。至此,设备的创建已经完成。
第六步:在 Node-RED 里创建工作流
点击仪表板(DASHBOARD),在应用程序列表里找到刚刚创建的应用程序,点击图标。
图 16 找到 Node-RED 入口图标
在打开的 Node-RED 页面,找到 Go to your Node-RED flow editor 按钮,点击以进入流编辑器。接下来,我们将使用 Node-RED 流编辑器来构建一个工作流。 读者也可以 点击这里打开 Node-RED 流编辑器。
1.在左侧调色板中,找到 input 区域,拖拽 ibmiot 节点 拖到画布上,双击以打开编辑页面进行配置。首先要选择认证(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 节点的编辑页面
2.在 function 区域找到 json 节点 ,并将其拖拽到画布上。我们使用此节点是为了解析 msg.payload,把一个 javascript 对象转化为 json 字符串。
3.在 function 区域找到 function 节点 ,并将其拖拽到画布上。双击该节点,打开编辑页面。在 Name 字段输入该节点名称(建议填上该字段,否则节点显示名为空),在 Function 区域已有一句 return msg; 在此之前加入如下代码:
var message = JSON.parse(msg.payload).d ;
msg.payload ={
"message":{“alert": message.content }
};
return msg;
图 18 function 节点的编辑页面
4.在 output 区域找到 ibmpush 节点 ,将其拖拽至画布。双击该节点,打开编辑页面。因为当前节点所属的应用程序有 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 节点编辑页面
5.在 storage 区域找到 cloudant 节点 ,将其拖拽至画布。双击节点,打开编辑页面。Service 字段已经自动定位到当前应用程序里附带的 Cloudant 数据库;Database 字段输入我们前面已经创建好的数据库名;Operation 字段表明要执行的操作是插入(insert)还是删除(remove),因为我们要存查消息进数据库,所以这里选择 insert;勾上 Only store msg.payload object,将只存储 msg.payload 里的数据,否则会存储整个 msg 对象的值。最终,我们配置如下:
将各节点用线连接起来,形成如下所示的流:
图 20 最终的工作流
在所有节点都修改之后,点击右上角的 Deploy 按钮来部署此工作流。当屏幕中间弹出成功部署(Successfully deployed)时,说明此流已经部署成功。
你也可以通过导入功能导入以上工作流。先找到菜单->导入->剪切板。
图 21 Node-RED 的导入功能
然后把以下代码粘贴到剪切板上,点击 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
核心代码及解析如下:
publicclassDeviceMessage{
DeviceClient deviceClient =null;
publicDeviceMessage(){
//设置连接属性,用我们已经创建好的设备的凭证,连接到我们的 IoT 服务。
Properties options =newProperties();
options.setProperty("org","6bnaci");
options.setProperty("type","Type1");
options.setProperty("id","Device1");
options.setProperty("auth-method","token");
options.setProperty("auth-token","12345678");
try{
deviceClient =newDeviceClient(options);
}catch(Exception e){
e.printStackTrace();
}
try{
//连接到 IoT 服务,参数设成 false,如果连接失败,不自动重新连接;如果设置成 true,那么程序会一直重试直到连接成功。
deviceClient.connect(false);
}catch(MqttException e){
e.printStackTrace();
System.out.println("network connection error !");
}
}
publicvoid sendMessage(String[] msg){
//创建一个对象 event
JsonObjectevent=newJsonObject();
//如果此类被执行时有一个参数传入,我们即把它作为属性赋给 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();
}
publicstaticvoid main(String args[]){
DeviceMessage dm =newDeviceMessage();
dm.sendMessage(args);
}
}
我们通过命令行(当然,也可以引入这个 java 项目,在 IDE 里如 Eclipse 运行该程序)运行,
Java-jar Push.jar "This is the message from the command line."
图 22 在命令行发送 MQTT 消息
第八步:手机装上相应的客户端程序
将应用程序发布到苹果的 App Store 或者其他 store(如某些公司内部有自己 App Store 供开发测试用),并用手机安装,打开应用程序,按第七步:发送 MQTT 消息在命令行发送一条命令,手机端即可接收推送消息了,同时也能查看历史记录。详细源代码已经附在后边,请大家自行查看。
评论