新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 專題 > 使用 IBM Bluemix 上的 IoT 及 Push 服務發(fā)送推送消息到手機

使用 IBM Bluemix 上的 IoT 及 Push 服務發(fā)送推送消息到手機

作者: 時間:2016-11-24 來源:網(wǎng)絡 收藏

Bluemix  最新的云服務,是企業(yè)和開發(fā)人員可以快速輕松地創(chuàng)建,部署和管理應用程序的云平臺。Bluemix 提供企業(yè)級的服務,可以輕松地與云應用程序集成。它目前提供了 100 多種服務,覆蓋了認知、移動、運維、web 和應用程序、網(wǎng)絡、集成、數(shù)據(jù)與分析、安全、存儲、業(yè)務分析、物聯(lián)網(wǎng)、及 API 等。 

本文引用地址:http://butianyuan.cn/article/201611/340672.htm

本文就是使用了 Bluemix 上的移動,物聯(lián)網(wǎng)及存儲等相關的服務,基于 Node-RED 快速構建了一個推送消息給手機,并且可以查看歷史數(shù)據(jù)的應用。該應用主要架構如下:

 1 架構圖

 

主要工作流程:

1.設備(在這里是從命令行)發(fā)消息給 IoT 平臺

2.IoT 平臺轉(zhuǎn)發(fā)消息給 Node-RED

3.當收到消息時,Node-RED 調(diào)用 Push 服務

4.Push 服務發(fā)推送消息給手機端

5.Node-RED 收到消息時將數(shù)據(jù)也存入 Cloudant 數(shù)據(jù)庫

6.手機客戶端從 Cloudant 數(shù)據(jù)庫讀取歷史消息

為實現(xiàn)以下應用程序需要哪些準備:

·Bluemix 賬號

·基本的 Java 技能

·基本的 Swift 技能

下面我們分步驟詳細介紹如何實現(xiàn)這些功能。

第一步:創(chuàng)建應用程序

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 服務,那么我們在后邊就不需要再額外添加這些服務,此外,還列出了其主要功能及如何收費等信息;右邊欄是要配置的信息,輸入 Name,Host 字段會根據(jù) Name 的值自動生成,保持其他字段不變,點擊創(chuàng)建(CREATE)。

 3 Internet of Things Platform Starter 模板頁面

 

第二步:啟用移動應用程序

點擊概述(Overview),找到啟用移動應用程序(Enable App for Mobile),并點擊。啟用移動應用程序的對話框會彈出,顯示如下:要啟用您的移動應用程序,Bluemix 將新增 Mobile Client Access 提供的應用程序安全性功能。要將 Mobile Client Access 服務添加到您的應用程序嗎?選擇添加(ADD)。在我們的例子中,移動端的安全問題并不是重點,但是這是啟用移動應用程序的必要條件,我們必須添加這個服務。隨后選擇重新編譯打包應用程序(Restage Application)。當應用程序重新啟動結束,在概述(Overview)頁面的右上角,會出現(xiàn)一個移動選項(Mobile Options),點擊它,會出現(xiàn)路徑(Route)和應用程序 GUID 兩個字段,

 4 查看 Route 和 App GUID

這兩個字段很重要,在將來我們實現(xiàn)移動端程序時,會有如下字樣的代碼,需要指定 Route 和 App GUID,才能連上 Bluemix 里的應用程序。

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

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

推送服務能幫助我們發(fā)送推送消息到 Android 或者 iOS 設備,這些設備能作為標記(tag)或者設備唯一標識符的目標,我們使用簡單而統(tǒng)一的 REST API 以配置,訂閱,發(fā)送和監(jiān)控推送消息到 Android 和 iOS 設備。

1.添加推送服務

仍然是回到概述頁面,點擊添加服務或者 APIAdd a Service Or API),在 Services 的列表中選擇 Mobile,然后找到  Push Notification 服務,并點擊之。

 5 Push Notification 目錄

在右邊欄找到 Service name 字段輸入服務名稱,當然,你也可以使用它的默認名稱,點擊創(chuàng)建(CREATE)按鈕。在隨后彈出的窗口中,選擇重新編譯打包(RESTAGE)。因為該應用程序新添加了服務,必須重新編譯打包才能使此服務生效。至此,推送服務添加成功。

2.配置證書

在應用程序的概述頁面找到 Push Notification 服務,并點擊以進入該服務頁面。

 6 概述頁面的 Push Notification 服務

在打開的頁面上會有提示:你還沒有配置推送!在其下方,有一個按鈕配置推送(Setup Push),點擊進入配置頁面。

 7 配置推送證書

因為此例子中,我們是使用的 iOS 客戶端,所以我們只配置蘋果推送認證(Apple Push Certificate)。選擇你的證書所用的類型(請務必跟你的證書的類型相同,如果你的證書是生產(chǎn)環(huán)境下的,那么選擇 Production,否則選擇 Sandbox。如果類型不匹配,可能手機收不到推送消息。),選擇文件位置,填寫密碼,然后點擊保存(Save)。證書配置如下,說明已經(jīng)配置成功。

 8 成功配置推送證書

第四步:配置 Cloudant 數(shù)據(jù)庫

1.創(chuàng)建數(shù)據(jù)庫

回到應用程序的概述頁面,找到 Cloudant NoSQL 服務,點擊以打開這個服務,在右上角找到 LAUNCH 按鈕 ,并點擊。在新打開的 Cloudant 控制臺頁面中,在右上角找到按鈕 – 創(chuàng)建數(shù)據(jù)庫(Create Database),點擊之,在彈出的對話框里,填上數(shù)據(jù)庫的名字,在這里我們填上 demodb,并點擊創(chuàng)建(Create),隨后頁面上有數(shù)據(jù)庫創(chuàng)建成功的字樣出現(xiàn),并且自動切入到已創(chuàng)建好的數(shù)據(jù)庫中。至此,我們的數(shù)據(jù)庫創(chuàng)建工作已經(jīng)完成。 

 9 在 Cloudant 里創(chuàng)建數(shù)據(jù)庫

2.設置權限

仍然是在 Cloudant 控制臺頁面中,在數(shù)據(jù)庫列表中點擊剛剛建好的 demodb,進入其子菜單,找到權限(Permissions),為其他用戶勾選上_reader 選項。

 10 Cloudant 數(shù)據(jù)庫的權限設置

3.獲取 API 連接

獲取數(shù)據(jù)庫里所有數(shù)據(jù)的 API 為如下格式:https://<host>/<db_name>/_all_docs?include_docs=true

在應用程序的概述頁面(Overview),找到 Cloudant NoSQL DB,點擊 Show Credentials,在打開的窗口中找到 host,替換上面的相應字段;在 db_name 中用我們的數(shù)據(jù)庫的名字 demodb 替換;設置 include_docs 為 true,是為返回列表中的數(shù)據(jù),如果沒有這個參數(shù),或者設為 false,則只會返回數(shù)據(jù)項的 ID 和 key 信息,沒有數(shù)據(jù)信息。

 11 Cloudant 的憑證信息

點擊查看最終該 API 呈現(xiàn)形式,在移動端可以使用該 API 獲取歷史數(shù)據(jù)。 

第五步:配置 IoT 服務

1.回到應用程序的概述頁面,找到 Internet of Things Platform 服務,點擊進入該服務的頁面,找到 Launch dashboard 按鈕,并點擊之。

2.在新打開的標簽頁中,在左側豎邊欄上懸停,在打開的菜單欄上,找到設備 DEVICES,并點擊之。

 12 IoT 菜單

3.在新打開的設備列表中,目前還沒有設備。點擊右上角的 Add Device, 開始添加一個設備。首先要選擇設備類型,在下拉列表里,暫時還沒有設備類型。所以先點擊 Create device type 按鈕創(chuàng)建一個設備類型。

 13 添加設備

4.在彈出的頁面上,仍然選擇 Create device type.

 14 創(chuàng)建設備類型

5.接下來,在頁面上輸入類型名稱(Name),這個是必填項,然后點擊右下角的下一步(Next),期間有一些信息要填,但都不是必填項,可以留空,一直點擊 Next,直到最后點擊創(chuàng)建(Create)。

6.在選擇設備類型(Choose Device Type)里選擇剛剛創(chuàng)建的設備類型,點擊右下角的下一步。

7.在設備信息(Device Info)頁面,填寫設備 ID,這是唯一必填的信息。點擊額外的字段(+Additional fields)會有更多詳細的字段可以填寫,如序列號,制造商,模型,類別等等,這些字段會根據(jù)在設備類型中設置的屬性值自動填充,也可以填上這些字段的值以覆蓋設備類型中的值,此外設備類型中沒有定義的屬性,也可以增加。然后點擊右下角的下一步。

8.元數(shù)據(jù)(Metadata)這頁,可以留空,點擊下一步。

9.在安全(Security)這頁,主要是獲取安全口令。有兩個選擇,一是使用自動生成的口令:會為你自動生成認證口令。該口令是一個 18 位長,包含數(shù)字、字母,以及符號的混合體,它將在注冊流程的最后返回給你;另一個種是由你為該設備提供認證口令。在這種情況下,該口令是 到 36 位長,可以包括大小寫字母,數(shù)字及符號(連字號,下劃線及句點)。如果你要使用自定義的口令,在請?zhí)峁┛诹睿?/span>Provide a token)后邊的橫線上填寫,然后點擊下一步。

10.在概要信息(Summary)這頁,主要是顯示之前所填的信息,請核對為該設備所提交信息是否正確。如果無誤,請點擊添加(Add)。

11.在設備憑證(Your Device Credentials)頁,這個設備已經(jīng)被注冊到了這個組織。要想連接到這個組織,需要把如下信息添加到你的設備上。請牢記認證口令(Authentication Token),由于安全方面的原因,這個口令一旦被忘記,將沒有辦法獲取。

 15 設備憑證信息

12.點擊右上角的按鈕 ,關閉當前頁面。在設備列表里,即有剛剛創(chuàng)建的設備。至此,設備的創(chuàng)建已經(jīng)完成。

第六步:在 Node-RED 里創(chuàng)建工作流

點擊儀表板(DASHBOARD),在應用程序列表里找到剛剛創(chuàng)建的應用程序,點擊圖標。

 16 找到 Node-RED 入口圖標

在打開的 Node-RED 頁面,找到 Go to your Node-RED flow editor 按鈕,點擊以進入流編輯器。接下來,我們將使用 Node-RED 流編輯器來構建一個工作流。 讀者也可以 點擊這里打開 Node-RED 流編輯器。 

1.在左側調(diào)色板中,找到 input 區(qū)域,拖拽 ibmiot 節(jié)點 拖到畫布上,雙擊以打開編輯頁面進行配置。首先要選擇認證(Authentication)的方式:此下拉框有 個值 Quickstart, API Key, Bluemix Service. Quickstart 是用于快速入門的案例學習用的;API Key 選項需要輸入 API Key 和 API token,多用于 IoT Platform 與 Node-RED 不在同一個 app 時;Bluemix Service 是內(nèi)部的服務調(diào)用,并不需要輸入?yún)?shù),主要用于 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 即可,再填寫節(jié)點名稱(Name),點擊 OK。 

 17 ibmiot 節(jié)點的編輯頁面

2.在 function 區(qū)域找到 json 節(jié)點 ,并將其拖拽到畫布上。我們使用此節(jié)點是為了解析 msg.payload,把一個 javascript 對象轉(zhuǎn)化為 json 字符串。 

3.在 function 區(qū)域找到 function 節(jié)點 ,并將其拖拽到畫布上。雙擊該節(jié)點,打開編輯頁面。在 Name 字段輸入該節(jié)點名稱(建議填上該字段,否則節(jié)點顯示名為空),在 Function 區(qū)域已有一句 return msg; 在此之前加入如下代碼: 

var message = JSON.parse(msg.payload).;

msg.payload ={

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

};

return msg;

 18 function 節(jié)點的編輯頁面

4.在 output 區(qū)域找到 ibmpush 節(jié)點 ,將其拖拽至畫布。雙擊該節(jié)點,打開編輯頁面。因為當前節(jié)點所屬的應用程序有 Push 服務,所以對該節(jié)點初始化時會自動去讀取該應用程序 ID 和 push 服務的 appSecret 字段。編輯頁面上的可編輯的推送屬性只有 個:模式(Mode)和類型(Type)。 

模式有沙箱(Sandbox)和生產(chǎn)(Production)模式,由于我們的證書是生產(chǎn)模式下的,所以我們選擇生產(chǎn)模式。

類型一共有 5 種:

·廣播(Broadcast):可以向所有設備發(fā)送

·通過標記(By Tags

·通過設備唯一標識符(By DeviceIds

· Android 設備(Only Android devices

· iOS 設備(Only iOS devices

由于我們 demo 的移動端程序僅支持 iOS 設備,所以我們選擇 Only iOS devices.

 19 ibmpush 節(jié)點編輯頁面

5.在 storage 區(qū)域找到 cloudant 節(jié)點 ,將其拖拽至畫布。雙擊節(jié)點,打開編輯頁面。Service 字段已經(jīng)自動定位到當前應用程序里附帶的 Cloudant 數(shù)據(jù)庫;Database 字段輸入我們前面已經(jīng)創(chuàng)建好的數(shù)據(jù)庫名;Operation 字段表明要執(zhí)行的操作是插入(insert)還是刪除(remove),因為我們要存查消息進數(shù)據(jù)庫,所以這里選擇 insert;勾上 Only store msg.payload object,將只存儲 msg.payload 里的數(shù)據(jù),否則會存儲整個 msg 對象的值。最終,我們配置如下: 

將各節(jié)點用線連接起來,形成如下所示的流:

 20 最終的工作流

在所有節(jié)點都修改之后,點擊右上角的 Deploy 按鈕來部署此工作流。當屏幕中間彈出成功部署(Successfully deployed)時,說明此流已經(jīng)部署成功。

你也可以通過導入功能導入以上工作流。先找到菜單->導入->剪切板。

 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":[]}]

第七步:發(fā)送 MQTT 消息

我們用 Java 實現(xiàn)一段程序,以發(fā)送 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(){

//設置連接屬性,用我們已經(jīng)創(chuàng)建好的設備的憑證,連接到我們的 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 服務,參數(shù)設成 false,如果連接失敗,不自動重新連接;如果設置成 true,那么程序會一直重試直到連接成功。

deviceClient.connect(false);

}catch(MqttException e){

e.printStackTrace();

System.out.println("network connection error !");

}

}

publicvoid sendMessage(String[] msg){

//創(chuàng)建一個對象 event

JsonObjectevent=newJsonObject();

//如果此類被執(zhí)行時有一個參數(shù)傳入,我們即把它作為屬性賦給 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.");

}

//發(fā)送消息到 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 在命令行發(fā)送 MQTT 消息

第八步:手機裝上相應的客戶端程序

將應用程序發(fā)布到蘋果的 App Store 或者其他 store(如某些公司內(nèi)部有自己 App Store 供開發(fā)測試用),并用手機安裝,打開應用程序,按第七步:發(fā)送 MQTT 消息在命令行發(fā)送一條命令,手機端即可接收推送消息了,同時也能查看歷史記錄。詳細源代碼已經(jīng)附在后邊,請大家自行查看。 

 



關鍵詞: bluemix IBM

評論


相關推薦

技術專區(qū)