新闻中心

EEPW首页 > 嵌入式系统 > 专题 > 使用 IBM Bluemix 上的 IoT 及 Push 服务发送推送消息到手机

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

作者:时间:2016-11-24来源:网络

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

本文引用地址:http://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.  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 服务,那么我们在后边就不需要再额外添加这些服务,此外,还列出了其主要功能及如何收费等信息;右边栏是要配置的信息,输入 NameHost 字段会根据 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.my.net", backendGUID:"27c9eb7b-0df6-43ac-b338-4678c926e936")

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

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

1.添加推送服务

仍然是回到概述页面,点击添加服务或者 APIAdd a Service Or API),在 Services 的列表中选择 Mobile,然后找到  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 位长,包含数字、字母,以及符号的混合体,它将在注册流程的最后返回给你;另一个种是由你为该设备提供认证口令。在这种情况下,该口令是 到 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)的方式:此下拉框有 个值 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).;

msg.payload ={

"message":{“alert": message.content }

};

return msg;

 18 function 节点的编辑页面

4.在 output 区域找到 ibmpush 节点 ,将其拖拽至画布。双击该节点,打开编辑页面。因为当前节点所属的应用程序有 Push 服务,所以对该节点初始化时会自动去读取该应用程序 ID 和 push 服务的 appSecret 字段。编辑页面上的可编辑的推送属性只有 个:模式(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.jarhttpclient-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 消息在命令行发送一条命令,手机端即可接收推送消息了,同时也能查看历史记录。详细源代码已经附在后边,请大家自行查看。 

 



关键词: bluemix IBM

评论

技术专区

关闭