使用 IBM Bluemix 上的 IoT 及 Push 服務發(fā)送推送消息到手機
Bluemix是 IBM 最新的云服務,是企業(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.用 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 字段會根據(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.mybluemix.net", backendGUID:"27c9eb7b-0df6-43ac-b338-4678c926e936")
第三步:添加推送(Push)服務
推送服務能幫助我們發(fā)送推送消息到 Android 或者 iOS 設備,這些設備能作為標記(tag)或者設備唯一標識符的目標,我們使用簡單而統(tǒng)一的 REST API 以配置,訂閱,發(fā)送和監(jiān)控推送消息到 Android 和 iOS 設備。
1.添加推送服務
仍然是回到概述頁面,點擊添加服務或者 API(Add a Service Or API),在 Services 的列表中選擇 Mobile,然后找到 IBM 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ù)字、字母,以及符號的混合體,它將在注冊流程的最后返回給你;另一個種是由你為該設備提供認證口令。在這種情況下,該口令是 8 到 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)的方式:此下拉框有 3 個值 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).d ;
msg.payload ={
"message":{“alert": message.content }
};
return msg;
圖 18 function 節(jié)點的編輯頁面
4.在 output 區(qū)域找到 ibmpush 節(jié)點 ,將其拖拽至畫布。雙擊該節(jié)點,打開編輯頁面。因為當前節(jié)點所屬的應用程序有 Push 服務,所以對該節(jié)點初始化時會自動去讀取該應用程序 ID 和 push 服務的 appSecret 字段。編輯頁面上的可編輯的推送屬性只有 2 個:模式(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)附在后邊,請大家自行查看。
評論