<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 專(zhuān)題 > 使用 IBM Bluemix 上的 IoT 及 Push 服務(wù)發(fā)送推送消息到手機

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

作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò ) 收藏

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

本文引用地址:http://dyxdggzs.com/article/201611/340672.htm

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

 1 架構圖

 

主要工作流程:

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

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

3.當收到消息時(shí),Node-RED 調用 Push 服務(wù)

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

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

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

為實(shí)現以下應用程序需要哪些準備:

·Bluemix 賬號

·基本的 Java 技能

·基本的 Swift 技能

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

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

1.  ID 登錄到 Bluemix,選擇目錄(CATALOG),選擇 Internet of Things Platform Starter 模板。

 2 Internet of Things Platform Starter 模板位置

 

2.在打開(kāi)的頁(yè)面上,左邊欄是關(guān)于 Internet of Things Platform Starter 的概要信息,比如版本,類(lèi)型,以及詳細文檔的鏈接;中間欄是當前版所包含的服務(wù),當前版本包含 SDK for Node.js, Cloudant NoSQL DB,及 Internet of Things Platform 服務(wù),那么我們在后邊就不需要再額外添加這些服務(wù),此外,還列出了其主要功能及如何收費等信息;右邊欄是要配置的信息,輸入 Name,Host 字段會(huì )根據 Name 的值自動(dòng)生成,保持其他字段不變,點(diǎn)擊創(chuàng )建(CREATE)。

 3 Internet of Things Platform Starter 模板頁(yè)面

 

第二步:?jiǎn)⒂靡苿?dòng)應用程序

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

 4 查看 Route 和 App GUID

這兩個(gè)字段很重要,在將來(lái)我們實(shí)現移動(dòng)端程序時(shí),會(huì )有如下字樣的代碼,需要指定 Route 和 App GUID,才能連上 Bluemix 里的應用程序。

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

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

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

1.添加推送服務(wù)

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

 5 Push Notification 目錄

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

2.配置證書(shū)

在應用程序的概述頁(yè)面找到 Push Notification 服務(wù),并點(diǎn)擊以進(jìn)入該服務(wù)頁(yè)面。

 6 概述頁(yè)面的 Push Notification 服務(wù)

在打開(kāi)的頁(yè)面上會(huì )有提示:你還沒(méi)有配置推送!在其下方,有一個(gè)按鈕配置推送(Setup Push),點(diǎn)擊進(jìn)入配置頁(yè)面。

 7 配置推送證書(shū)

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

 8 成功配置推送證書(shū)

第四步:配置 Cloudant 數據庫

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

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

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

2.設置權限

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

 10 Cloudant 數據庫的權限設置

3.獲取 API 連接

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

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

 11 Cloudant 的憑證信息

點(diǎn)擊查看最終該 API 呈現形式,在移動(dòng)端可以使用該 API 獲取歷史數據。 

第五步:配置 IoT 服務(wù)

1.回到應用程序的概述頁(yè)面,找到 Internet of Things Platform 服務(wù),點(diǎn)擊進(jìn)入該服務(wù)的頁(yè)面,找到 Launch dashboard 按鈕,并點(diǎn)擊之。

2.在新打開(kāi)的標簽頁(yè)中,在左側豎邊欄上懸停,在打開(kāi)的菜單欄上,找到設備 DEVICES,并點(diǎn)擊之。

 12 IoT 菜單

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

 13 添加設備

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

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

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

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

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

8.元數據(Metadata)這頁(yè),可以留空,點(diǎn)擊下一步。

9.在安全(Security)這頁(yè),主要是獲取安全口令。有兩個(gè)選擇,一是使用自動(dòng)生成的口令:會(huì )為你自動(dòng)生成認證口令。該口令是一個(gè) 18 位長(cháng),包含數字、字母,以及符號的混合體,它將在注冊流程的最后返回給你;另一個(gè)種是由你為該設備提供認證口令。在這種情況下,該口令是 到 36 位長(cháng),可以包括大小寫(xiě)字母,數字及符號(連字號,下劃線(xiàn)及句點(diǎn))。如果你要使用自定義的口令,在請提供口令(Provide a token)后邊的橫線(xiàn)上填寫(xiě),然后點(diǎn)擊下一步。

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

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

 15 設備憑證信息

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

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

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

 16 找到 Node-RED 入口圖標

在打開(kāi)的 Node-RED 頁(yè)面,找到 Go to your Node-RED flow editor 按鈕,點(diǎn)擊以進(jìn)入流編輯器。接下來(lái),我們將使用 Node-RED 流編輯器來(lái)構建一個(gè)工作流。 讀者也可以 點(diǎn)擊這里打開(kāi) Node-RED 流編輯器。 

1.在左側調色板中,找到 input 區域,拖拽 ibmiot 節點(diǎn) 拖到畫(huà)布上,雙擊以打開(kāi)編輯頁(yè)面進(jìn)行配置。首先要選擇認證(Authentication)的方式:此下拉框有 個(gè)值 Quickstart, API Key, Bluemix Service. Quickstart 是用于快速入門(mén)的案例學(xué)習用的;API Key 選項需要輸入 API Key 和 API token,多用于 IoT Platform 與 Node-RED 不在同一個(gè) app 時(shí);Bluemix Service 是內部的服務(wù)調用,并不需要輸入參數,主要用于 Node-RED 與 IoT 在同一 App 時(shí)。因為我們的 App 里邊有 IoT Platform 服務(wù),我們可以選擇 Bluemix Service 直接連接。選定認證方式后,需要選擇輸入類(lèi)型(Input Type),這里輸入類(lèi)型有 Device Event, Device Command, Device Status, Application Status, 從名稱(chēng)上我們即可知道他們 主要檢測的重點(diǎn)。我們在此選擇 Device Event。至于設備類(lèi)型(Device Type),設備標識(Device Id),事件(Event),格式(Format)等選擇 All 即可,再填寫(xiě)節點(diǎn)名稱(chēng)(Name),點(diǎn)擊 OK。 

 17 ibmiot 節點(diǎn)的編輯頁(yè)面

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

3.在 function 區域找到 function 節點(diǎn) ,并將其拖拽到畫(huà)布上。雙擊該節點(diǎn),打開(kāi)編輯頁(yè)面。在 Name 字段輸入該節點(diǎn)名稱(chēng)(建議填上該字段,否則節點(diǎn)顯示名為空),在 Function 區域已有一句 return msg; 在此之前加入如下代碼: 

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

msg.payload ={

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

};

return msg;

 18 function 節點(diǎn)的編輯頁(yè)面

4.在 output 區域找到 ibmpush 節點(diǎn) ,將其拖拽至畫(huà)布。雙擊該節點(diǎn),打開(kāi)編輯頁(yè)面。因為當前節點(diǎn)所屬的應用程序有 Push 服務(wù),所以對該節點(diǎn)初始化時(shí)會(huì )自動(dòng)去讀取該應用程序 ID 和 push 服務(wù)的 appSecret 字段。編輯頁(yè)面上的可編輯的推送屬性只有 個(gè):模式(Mode)和類(lèi)型(Type)。 

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

類(lèi)型一共有 5 種:

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

·通過(guò)標記(By Tags

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

· Android 設備(Only Android devices

· iOS 設備(Only iOS devices

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

 19 ibmpush 節點(diǎn)編輯頁(yè)面

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

將各節點(diǎn)用線(xiàn)連接起來(lái),形成如下所示的流:

 20 最終的工作流

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

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

 21 Node-RED 的導入功能

 

然后把以下代碼粘貼到剪切板上,點(diǎn)擊 Ok 按鈕。當鼠標在畫(huà)布上點(diǎn)擊時(shí),工作流即會(huì )落到畫(huà)布上,然后部署即可。

[{"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 實(shí)現一段程序,以發(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 服務(wù)。

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 服務(wù),參數設成 false,如果連接失敗,不自動(dòng)重新連接;如果設置成 true,那么程序會(huì )一直重試直到連接成功。

deviceClient.connect(false);

}catch(MqttException e){

e.printStackTrace();

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

}

}

publicvoid sendMessage(String[] msg){

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

JsonObjectevent=newJsonObject();

//如果此類(lèi)被執行時(shí)有一個(gè)參數傳入,我們即把它作為屬性賦給 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 平臺斷開(kāi)連接

deviceClient.disconnect();

}

publicstaticvoid main(String args[]){

DeviceMessage dm =newDeviceMessage();

dm.sendMessage(args);

}

}

我們通過(guò)命令行(當然,也可以引入這個(gè) java 項目,在 IDE 里如 Eclipse 運行該程序)運行,

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

 22 在命令行發(fā)送 MQTT 消息

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

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

 



關(guān)鍵詞: bluemix IBM

評論


相關(guān)推薦

技術(shù)專(zhuān)區

国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>