版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
7.4鴻蒙APP端開(kāi)發(fā)本章主要講述分布式倉(cāng)庫(kù)環(huán)境監(jiān)測(cè)項(xiàng)目鴻蒙APP端開(kāi)發(fā)。通過(guò)學(xué)習(xí)本節(jié)將能夠了解分布式倉(cāng)庫(kù)環(huán)境監(jiān)測(cè)項(xiàng)目鴻蒙APP端開(kāi)發(fā)。通過(guò)本節(jié)學(xué)習(xí)可以熟悉:鴻蒙APP端TCP編程鴻蒙APP端UDP編程鴻蒙APP端主程序編程鴻蒙APP端TCP編程鴻蒙APP端UDP編程鴻蒙APP端主程序編程鴻蒙APP端開(kāi)發(fā)(1/8)
首先在DevEcoStudio基于EmptyAbility模板創(chuàng)建IoTFactoryApp工程,并將資源圖片文件復(fù)制至工程資源目錄下的media子文件夾中,然后為工程增加網(wǎng)絡(luò)訪問(wèn)權(quán)限。修改工程configuration目錄下的module.json5配置文件,在第15行插入以下內(nèi)容:
"requestPermissions":[{
"name":"ohos.permission.INTERNET"
}],鴻蒙APP端TCP編程(2/8)
在工程的pages源碼目錄下創(chuàng)建socketComponent文件夾,并在該文件夾內(nèi)創(chuàng)建IoTTcpClient.ets源文件。將TCP客戶(hù)端通信功能封裝為IoTTcpClient類(lèi),并實(shí)現(xiàn)將ArrayBuffer類(lèi)型的TCP數(shù)據(jù)轉(zhuǎn)換成字符串的函數(shù)。源文件關(guān)鍵函數(shù)代碼:exportclassIoTTcpClient{//1.創(chuàng)建TCP通信對(duì)象,與網(wǎng)絡(luò)協(xié)議棧建立聯(lián)系privatetcp:socket.TCPSocket=socket.constructTCPSocketInstance();//當(dāng)創(chuàng)建對(duì)象需傳入?yún)?shù):
服務(wù)器IP地址、端口號(hào)、接收數(shù)據(jù)的回調(diào)函數(shù)、TCP連接的回調(diào)函數(shù)、TCP斷開(kāi)的回調(diào)函數(shù)constructor(serverIP:string,serverPort:number,tcpRcvCb:Callback<socket.SocketMessageInfo>,tcpConnectCb:AsyncCallback<void>,tcpCloseCb:Callback<void>){//2.綁定使用端口號(hào)this.tcp.bind(addr,(err:BusinessError)=>{//設(shè)置當(dāng)接收到TCP數(shù)據(jù)時(shí),觸發(fā)調(diào)用的回調(diào)函數(shù)鴻蒙APP端TCP編程(3/8)//設(shè)置當(dāng)接收到TCP數(shù)據(jù)時(shí),觸發(fā)調(diào)用的回調(diào)函數(shù)this.tcp.on('message',tcpRcvCb);//設(shè)置當(dāng)TCP通信斷開(kāi)時(shí),觸發(fā)調(diào)用的回調(diào)函數(shù)this.tcp.on('close',tcpCloseCb);//3.連接服務(wù)器端,并設(shè)置當(dāng)連接成功時(shí)觸發(fā)調(diào)用的回調(diào)函數(shù)this.tcp.connect(connOpts,tcpConnectCb);//4.發(fā)送數(shù)據(jù)asyncsendData(s:string){letopts:socket.TCPSendOptions={data:s};this.tcp.send(opts);}//5.關(guān)閉TCP通信close(){this.tcp.close();
鴻蒙APP端TCP編程(4/8)//ArrayBuffer轉(zhuǎn)換成字符串exportfunctionarrayBufToString(buffer:ArrayBuffer):string{letdataView:DataView=newDataView(buffer);letstr="";for(leti=0;i<dataView.byteLength;++i){str+=String.fromCharCode(dataView.getUint8(i));}returnstr;}鴻蒙APP端TCP編程(5/8)在Index頁(yè)面上進(jìn)行簡(jiǎn)單的測(cè)試。在Index頁(yè)面上實(shí)現(xiàn)在頁(yè)面初始化時(shí)連接TCP服務(wù)器以設(shè)置回調(diào)函數(shù),點(diǎn)擊按鈕時(shí)發(fā)出TCP數(shù)據(jù),并在Text組件上顯示接收到的數(shù)據(jù)。關(guān)鍵函數(shù)代碼:structIndex{@Statemessage:string='HelloWorld';privatetcp?:IoTTcpClient;//接收處理的回調(diào)函數(shù)privatetcpRcvCb=async(sInfo:socket.SocketMessageInfo)=>{lets=arrayBufToString(sInfo.message);//將ArrayBuffer轉(zhuǎn)成字符串//連接成功后的回調(diào)函數(shù)privatetcpConnectCb=async()=>{this.tcp?.sendData("hellofromclient");//連接成功后發(fā)出數(shù)據(jù)}
鴻蒙APP端TCP編程(6/8)aboutToAppear():void{//創(chuàng)建TCP通信對(duì)象,并指定服務(wù)器的IP地址、端口號(hào)、接收數(shù)據(jù)的回調(diào)函數(shù)、連接的回調(diào)函數(shù)、連接斷開(kāi)的回調(diào)函數(shù)this.tcp=newIoTTcpClient("",10086,this.tcpRcvCb,this.tcpConnectCb,this.tcpCloseCb);}build(){Column(){Text(this.message)Button('Send').onClick(()=>{//點(diǎn)擊按鈕時(shí)發(fā)出數(shù)據(jù)this.tcp?.sendData("hellotcpClient");})
鴻蒙APP端TCP編程(7/8)在PC上通過(guò)Socket調(diào)試工具設(shè)立TCPServer,然后進(jìn)行通信測(cè)試。Socket調(diào)試工具測(cè)試輸出:鴻蒙APP端TCP編程(8/8)App端程序測(cè)試效果:鴻蒙APP端TCP編程鴻蒙APP端UDP編程鴻蒙APP端主程序編程鴻蒙APP端UDP編程(1/2)
將此第5章IoTUdp.ets源文件復(fù)制至項(xiàng)目工程的socketComponent文件夾中,然后修改Index.ets源文件,實(shí)現(xiàn)當(dāng)頁(yè)面初始化時(shí)創(chuàng)建IoTUdp對(duì)象與指定UDP接收處理的回調(diào)函數(shù),然后發(fā)出掃描設(shè)備的命令,在接收回調(diào)函數(shù)中由數(shù)組記錄回復(fù)的設(shè)備端IP地址,然后在Index頁(yè)面中由List組件顯示在線設(shè)備端的IP地址。Index.ets源文件關(guān)鍵代碼:structIndex{
privateboradcastIP:string="55";//設(shè)備端的UDP廣播地址
privateport:number=10086;//設(shè)備端的UDP端口號(hào)
@StatedevIPList:Array<string>=[];//由動(dòng)態(tài)數(shù)組記錄所有設(shè)備端的IP地址、端口號(hào)信息
privateudp?:IoTUdp;//用于掃描設(shè)備的UDP通信對(duì)象
//UDP接收的回調(diào)函數(shù)
private
udpRcvCallback=async(sInfo:socket.SocketMessageInfo)=>{
letstr=
arrayBufToString(sInfo.message);
//當(dāng)設(shè)備端回"iamDev"則表示成功掃描到一個(gè)設(shè)備端
//在動(dòng)態(tài)數(shù)組中記錄設(shè)備端IP地址鴻蒙APP端UDP編程(2/2)aboutToAppear():void{//創(chuàng)建UDP通信對(duì)象,并設(shè)置接收處理的回調(diào)函數(shù)this.udp=newIoTUdp(0,this.udpRcvCallback);//頁(yè)面初始化時(shí)發(fā)出掃描設(shè)備端的命令this.udp.sendData("scanningDev",this.boradcastIP,this.port);}build(){Column(){List(){ForEach(this.devIPList,(ip:string)=>{ListItem(){Text(ip).fontSize(25)}鴻蒙APP端TCP編程鴻蒙APP端UDP編程鴻蒙APP端主程序編程鴻蒙APP端主程序編程(1/8)
主要實(shí)現(xiàn):當(dāng)App打開(kāi)時(shí)通過(guò)UDP廣播發(fā)出掃描設(shè)備的命令,獲取在線的所有設(shè)備端,并記錄它們的IP地址與端口號(hào)。然后,在List列表中展示每個(gè)設(shè)備端的頁(yè)面組件。在設(shè)備頁(yè)面組件內(nèi)部,通過(guò)TCP協(xié)議與設(shè)備端的TCP服務(wù)器建立連接,并定期向設(shè)備發(fā)送傳感器數(shù)據(jù)更新的指令,將接收到的傳感器數(shù)據(jù)實(shí)時(shí)展示在對(duì)應(yīng)的組件上,同時(shí)提供控制按鈕以打開(kāi)或關(guān)閉設(shè)備端的布防狀態(tài)。
鴻蒙APP端主程序編程(2/8)
在工程的pages目錄下創(chuàng)建customeUIComponent文件夾,并在此文件夾中創(chuàng)建IoTDeviceUI.ets源文件,在此源文件中設(shè)計(jì)每個(gè)傳感器通用的IoTDeviceSensorUI組件,組件的關(guān)鍵代碼:exportstructIoTDeviceSensorUI{
privateimgSrc:ResourceStr='';//記錄傳感器圖像
privatesName:string='';//記錄傳感器名稱(chēng)
@Propval:string='';//綁定一個(gè)狀態(tài)變量,val的值跟隨此狀態(tài)變量變化
build(){
Row({space:10}){
Image(this.imgSrc)//圖像組件描述
Text(this.sName).fontSize(18)//傳感器名稱(chēng)組件描述
//傳感器值組件描述
Text(this.val).fontSize(18).fontWeight(FontWeight.Bold)鴻蒙APP端主程序編程(3/8)
接著customUIComponent文件夾中創(chuàng)建操作每個(gè)設(shè)備端的IoTDeviceUI.ets頁(yè)面組件源文件。源文件中實(shí)現(xiàn)在組件初始化時(shí)TCP連接設(shè)備端,在組件退出時(shí)斷開(kāi)TCP連接,并通過(guò)定時(shí)器定時(shí)向設(shè)備端發(fā)出傳感器數(shù)據(jù)更新命令,根據(jù)設(shè)備端返回的傳感器數(shù)據(jù)更新組件與實(shí)現(xiàn)布防開(kāi)關(guān)的控制功能。IoTDeviceUI.ets關(guān)鍵代碼:exportstructIoTDeviceUI{//屬性成員:記錄設(shè)備端的IP地址
設(shè)備端的端口號(hào)TCP通信對(duì)象//State變量:人體感應(yīng)數(shù)據(jù)
煙霧數(shù)據(jù)
濕度數(shù)據(jù)
溫度數(shù)據(jù)
記錄TCP客戶(hù)端是否在線//tcp接收的回調(diào)函數(shù)privatetcpRcvFunc=async(sInfo:socket.SocketMessageInfo)=>{//根據(jù)通信協(xié)議獲取傳感器數(shù)據(jù)并更新State變量值}//TCP連接成功后觸發(fā)的回調(diào)函數(shù)privatetcpConnectFunc=async()=>{//創(chuàng)建定時(shí)器,每隔3秒向設(shè)備端發(fā)出傳感器數(shù)據(jù)的更新命令}鴻蒙APP端主程序編程(4/8)/TCP斷開(kāi)連接后觸發(fā)的回調(diào)函數(shù)privatetcpCloseFunc=()=>{//關(guān)閉定時(shí)器}aboutToAppear():void{//當(dāng)頁(yè)面組件將要出現(xiàn)時(shí)觸發(fā)執(zhí)行的函數(shù)//創(chuàng)建TCP通信對(duì)象this.tcpClient=newIoTTcpClient(this.sIP,this.port,this.tcpRcvFunc,this.tcpConnectFunc,this.tcpCloseFunc);}//當(dāng)頁(yè)面將要銷(xiāo)毀或隱藏時(shí)觸發(fā)執(zhí)行的函數(shù)aboutToDisappear():void{
關(guān)閉TCP通信}鴻蒙APP端主程序編程(5/8)build(){Column({space:10}){...//分別以四個(gè)傳感器組件呈現(xiàn)濕度、溫度、煙霧、人體傳感器的數(shù)據(jù)IoTDeviceSensorUI({imgSrc:$r('app.media.humidity'),sName:'相對(duì)濕度:',val:this.humidity})IoTDeviceSensorUI({imgSrc:$r('app.media.temperature'),sName:'相對(duì)溫度:',val:this.temperature})IoTDeviceSensorUI({imgSrc:$r('app.media.smoke'),sName:'煙霧濃度:',val:this.smoke})IoTDeviceSensorUI({imgSrc:$r('app.media.user2'),sName:'人體感應(yīng):',val:this.human})鴻蒙APP端主程序編程(5/8)//照明燈器控制Row({space:10}){Image($r('app.media.alarm')).width(40).height(40)//按鈕圖像組件描述Text('布防開(kāi)關(guān)').fontSize(18)//按鈕文字組件描述Toggle({type:ToggleType.Switch})//按鈕開(kāi)關(guān)組件描述.onChange((isOn:boolean)=>{/*手機(jī)端發(fā):"cmdDev:guardOn",設(shè)備端回復(fù)"dataDev:guardOn"
手機(jī)端發(fā):"cmdDev:guardOff",設(shè)備端回復(fù)"dataDev:guardOff"*/
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年齊齊哈爾市富裕縣社會(huì)保險(xiǎn)事業(yè)中心公開(kāi)招聘公益性崗位人員1人備考題庫(kù)附答案
- 2025年威海市總工會(huì)招聘(3人)(公共基礎(chǔ)知識(shí))綜合能力測(cè)試題附答案
- 2025年沛縣衛(wèi)生健康委員會(huì)公開(kāi)招聘編制衛(wèi)生專(zhuān)業(yè)技術(shù)人員26人(公共基礎(chǔ)知識(shí))綜合能力測(cè)試題附答案
- 2025廣東深圳市龍華區(qū)招聘社區(qū)網(wǎng)格員72人(公共基礎(chǔ)知識(shí))測(cè)試題附答案
- 2025江西省省直機(jī)關(guān)選調(diào)公務(wù)員備考題庫(kù)附答案
- 2025年11月重慶市萬(wàn)州區(qū)孫家鎮(zhèn)人民政府招聘非全日制公益性崗位2人(公共基礎(chǔ)知識(shí))測(cè)試題附答案
- “夢(mèng)想靠岸”招商銀行溫州分行2026校園招聘筆試備考試題及答案解析
- 2026年泉州海洋職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能考試參考題庫(kù)帶答案解析
- 2026江西省徳緣堂中醫(yī)館有限公司簽行政助理崗招聘筆試模擬試題及答案解析
- 2026江西九江市八里湖新區(qū)招聘醫(yī)務(wù)人員14人筆試參考題庫(kù)及答案解析
- (高清版)DBJ∕T 13-91-2025 《福建省房屋市政工程安全風(fēng)險(xiǎn)分級(jí)管控與隱患排查治理標(biāo)準(zhǔn)》
- 2023年西藏中考數(shù)學(xué)真題試卷及答案
- 1春《寒假新啟航五年級(jí)》參考答案
- 豬肉配送投標(biāo)方案(完整技術(shù)標(biāo))
- GM公司過(guò)程控制計(jì)劃審核表
- MSA-測(cè)量系統(tǒng)分析模板
- 《國(guó)共合作與北伐戰(zhàn)爭(zhēng)》優(yōu)課一等獎(jiǎng)?wù)n件
- YY/T 0729.3-2009組織粘合劑粘接性能試驗(yàn)方法第3部分:拉伸強(qiáng)度
- GB/T 5187-2008銅及銅合金箔材
- GB/T 26218.1-2010污穢條件下使用的高壓絕緣子的選擇和尺寸確定第1部分:定義、信息和一般原則
- 農(nóng)民工討薪突發(fā)事件應(yīng)急預(yù)案
評(píng)論
0/150
提交評(píng)論