鴻蒙FA智能家居NFC碰一碰應(yīng)用
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
隨著物聯(lián)網(wǎng)時(shí)代的到來,鴻蒙發(fā)展越來越好,萬物互聯(lián)的時(shí)代即將到來。接下來將會講講我接觸鴻蒙FA開發(fā)。
鴻蒙FA“NFC碰一碰”主要是利用NFC“碰一碰”喚起鴻蒙FA應(yīng)用,根據(jù)NFC通信拿到的設(shè)備信息,然后登錄關(guān)聯(lián)華為賬號,進(jìn)行配網(wǎng),配網(wǎng)成功后就可以實(shí)現(xiàn)遠(yuǎn)程控制。
1、首先我們創(chuàng)建一個(gè)js的Ability,如圖顯示。

2、在entry的main->java包里的MainAbility的onStart和onNewIntent獲取碰一碰的設(shè)備信息。代碼如下:
- @Override
- public void onStart(Intent intent) {
- intent.setParam("window_modal",3);
- HmsBridge.getInstance().initBridge(this);
- // 獲取sn和sessionId
- String nanSessionId = intent.getStringParam("nanSessionId");
- // 注冊配網(wǎng)har包
- NetConfigAbility.register(this, nanSessionId);
- Object businessInfo = intent.getParams().getParam("businessInfo");
- String sn = "";
- if (businessInfo != null) {
- ZSONObject businessInfoZson = ZSONObject.classToZSON(businessInfo);
- sn = businessInfoZson.getZSONObject("params").getString("");
- }
- super.onStart(intent);
- }
- @Override
- // Fa正在運(yùn)行,又重新掃一次
- public void onNewIntent(Intent intent) {
- // 獲取sn和sessionId
- String nanSessionId = intent.getStringParam("nanSessionId");
- Object businessInfo = intent.getParams().getParam("businessInfo");
- String sn = "";
- if (businessInfo != null) {
- ZSONObject businessInfoZson = ZSONObject.classToZSON(businessInfo);
- sn = businessInfoZson.getZSONObject("params").getString("");
- }
- }
3、關(guān)聯(lián)華為賬號,華為授權(quán)登錄流程圖如下。

- 下面是華為的登錄授權(quán)接口和退出接口。
- // -------------------華為授權(quán)登錄----------------------
- 引入鴻蒙sdk
- import {HuaweiIdAuthParamsHelper, HuaweiIdAuthManager, OPENID, PROFILE, GAMES, Scope} from '@hmscore/hms-js-account'
- signIn: function () {
- var that = this
- // 新增scopeList
- var scopeList = new Array();
- scopeList.push(OPENID);
- scopeList.push(PROFILE);
- var healthbehavior = new Scope("https://www.huawei.com/healthkit/extend/healthbehavior.read");
- var hearthealthsleep = new Scope("https://www.huawei.com/healthkit/extend/hearthealthsleep.read");
- var fatreduction = new Scope("https://www.huawei.com/healthkit/extend/fatreduction.read");
- var sport = new Scope("https://www.huawei.com/healthkit/extend/sport.read");
- scopeList.push(healthbehavior);
- scopeList.push(hearthealthsleep);
- scopeList.push(fatreduction);
- scopeList.push(sport);
- var opencloud = new Scope("https://www.huawei.com/auth/smarthome/opencloud");
- scopeList.push(opencloud);
- var signInOption = new HuaweiIdAuthParamsHelper().setId().setProfile().setMobileNumber().setAuthorizationCode().setScopeList(scopeList).build();
- console.error(JSON.stringify(signInOption));
- HuaweiIdAuthManager.getAuthApi().getSignInIntent(signInOption).then((result)=>{
- var authCode = result.serverAuthCode;
- var accessToken = result.accessToken;
- var unionId = result.unionId;
- }).catch((error)=>{
- });
- },
- signOut: function () {
- HuaweiIdAuthManager.getAuthApi().signOut().then((result)=>{
- }).catch((error) => {
- console.error("signout fail");
- });
- },
4、關(guān)聯(lián)華為賬號后,開始配網(wǎng)了,主要是NAN和AP配網(wǎng):
在第二步驟獲取的nanSessionId,如果不是NAN_DEVICE_NOT_FOUND,那么可以走NAN配網(wǎng)流程,否則走Ap配網(wǎng)。具體配網(wǎng)步驟如下:
引入華為的配網(wǎng)模塊。
NAN配網(wǎng)
- 操作設(shè)備上配網(wǎng)鍵讓設(shè)備進(jìn)入配網(wǎng)模式
- 手機(jī)碰一碰設(shè)備上的NFC標(biāo)簽,拉起輕應(yīng)用
- 選擇配網(wǎng)wifi
- 調(diào)用 discoveryByNAN接口 code為0
- 調(diào)用 connectDevice接口 連接設(shè)備
- 調(diào)用 configDeviceNet接口 開始配網(wǎng)
- 調(diào)用 disconnectDevice接口 斷開網(wǎng)絡(luò)
- 調(diào)用檢測設(shè)備是否上線接口
- 檢測到設(shè)備上線,調(diào)用綁定設(shè)備接口
AP配網(wǎng)
- 操作設(shè)備上配網(wǎng)鍵讓設(shè)備進(jìn)入配網(wǎng)模式
- 手機(jī)碰一碰設(shè)備上的NFC標(biāo)簽,拉起輕應(yīng)用
- 選擇配網(wǎng)wifi
- 調(diào)用 discoveryByNAN接口 code不為0
- 調(diào)用 discoveryBySoftAp接口 搜索當(dāng)前設(shè)備的ap,搜索不到的話嘗試直接去連接ap
- 調(diào)用 connectDevice接口 連接設(shè)備
- 調(diào)用 configDeviceNet接口 開始配網(wǎng)
- 調(diào)用 disconnectDevice接口 斷開網(wǎng)絡(luò)
- 調(diào)用檢測設(shè)備是否上線接口
- 檢測到設(shè)備上線,調(diào)用綁定設(shè)備接口
5、配完成功后就可以跳到設(shè)備控制頁進(jìn)行一些列的設(shè)備操控了。
6、過程運(yùn)到的一些問題如下以及解決方案:
EMUI的版本下,如果串行顯示多個(gè)彈窗的操作或者別的渲染時(shí),會白屏?
- 解決方法是讓某個(gè)視圖稍微延時(shí)渲染。
EMUI的版本下,有時(shí)如果界面渲染情況復(fù)雜,會出現(xiàn)某個(gè)div顯示與否,在使用if來控制顯示的時(shí)候,可能會出現(xiàn)白屏。
- 這種情況使用div的屬性show會解決這個(gè)問題,用if的時(shí)候會改變渲染樹的結(jié)構(gòu),使用show避免這個(gè)問題。
在使用畫布的時(shí)候,如果數(shù)據(jù)發(fā)生改變重繪制時(shí),會出數(shù)據(jù)重繪錯(cuò)亂。
- 需要先清除繪制,然后在進(jìn)行繪制
在Ide升級到 Build Version: 2.1.0.501以上,在適配compileSdkVersion和compatibleSdkVersion版本時(shí),不需要在config.js里設(shè)置了,config.js設(shè)置無效,得在build.grade里設(shè)置適配的版本好了。
以上主要是我們團(tuán)隊(duì)在開發(fā)鴻蒙FA智能家居NFC碰一碰應(yīng)用時(shí)的一些問題和見解。
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)