玩轉OpenHarmony智慧家居:如何實現樹莓派“碰一碰”裝置控制

OpenHarmony開發者發表於2022-12-27

一、簡介

“碰一碰”裝置控制,依託NFC短距通訊協議,透過碰一碰的互動方式,將OpenAtom OpenHarmony(簡稱“OpenHarmony”)標準系統裝置和全場景裝置連線起來,解決了應用與裝置之間接續慢、傳輸難的問題,實現一碰拉起應用,為使用者帶來無縫切換的流暢體驗。

圖片

二、“碰一碰”裝置控制場景

圖片

(1)使用效果
當樹莓派開發板靠近小熊派開發板,樹莓派中應用程式被拉起,進入LED小燈控制介面。然後,控制端和裝置端完成配網通訊連線,點選開啟小熊派LED小燈點亮,點選關閉LED小燈熄滅。

(2)操作流程
• 在小熊派的NFC被動貼片中寫入控制端應用資訊
• 將樹莓派的PN532主動板靠近小熊派NFC貼片,讀取貼片中的應用資訊,拉起對應的小燈控制應用
• 控制端和裝置端完成配網通訊連線
• 點選開啟小熊派LED小燈點亮,點選關閉LED小燈熄滅

三、NFC拉起應用功能實現

近場通訊(Near Field Communication,簡稱NFC),是一種新興的技術,使用了NFC技術的裝置可以在彼此靠近的情況下進行資料交換,是由非接觸式射頻識別(RFID)演變而來。

NFC技術在現實場景中被廣泛使用,透過在單一晶片上整合感應式讀卡器、感應式卡片和點對點通訊的功能,利用移動終端實現移動支付、門禁、移動身份識別、防偽等應用。NFC的點對點模式需要主動板和被動板兩個模組,該案例中樹莓派的PN532模組是主動板用於讀取資訊,小熊派開發板的NFC貼片是被動板用於儲存資訊。

int main(int argc, char **argv) {
    uint8_t buff[255];
    uint8_t uid[MIFARE_UID_MAX_LENGTH];
    int32_t uid_len = 0;
    PN532 pn532;
    PN532_I2C_Init(&pn532);
    if (PN532_GetFirmwareVersion(&pn532, buff) == PN532_STATUS_ERROR) {
        return -1;
    }
    PN532_SamConfiguration(&pn532);
    while (1) {
        while (1) {
            // 判斷NFC模組是否靠近
            if (PN532_ReadPassiveTarget(&pn532, uid, PN532_MIFARE_ISO14443A, 1000) != PN532_STATUS_ERROR) {
                break;
            }
            usleep(100);
        }

        HILOGI("開始調起應用\r\n");
        pthread_t id1;
        int ret = pthread_create(&id1, NULL, (void *)mythread1, NULL);
        if (ret) {
            HILOGE("建立執行緒失敗\r\n");
        }

        sleep(4);
    }
}
/*
 *拉起裝置控制應用的執行緒
*/
void *mythread1(void) {
    char arg[500] = "aa start -d 1 -a com.huawei.ohos_car_controller.default -b ohos.samples.jshelloworld";
    system(arg);
    return NULL;
}

上述程式碼中,NFC功能的實現需要呼叫驅動檔案中相應的介面函式。I2C_Init函式實現樹莓派PN532模組的初始化。PN532_ReadPassiveTarget函式用於實現迴圈讀取NFC貼片的UID資訊,當讀到小熊派NFC貼片資訊時,建立新的執行緒拉起對應的LED燈應用。

四、LED小燈應用功能實現

該案例中LED小燈應用,主要基於TCP通訊協議實現對小熊派LED小燈的開啟和關閉控制。

圖片

import led_controller from '@ohos.led_controller';
export default {
    onShow() {
        this.tcpConnect();
    },
    onDestroy() {
        this.tcpDistroy();
    },
    tcpConnect() {
        let promise_connect = led_controller.Connect();
        promise_connect.then((results) => {
            setTimeout(this.changeText(), 9000);
        }).catch(err => {
            console.log('[led Controller]' + err)
        })
    },
    tcpSend(message) {
        let promise_send = led_controller.Send({
            data: message
        })
        promise_send.then((results) => {
            if (results.send_status == 1) {
                console.log("[led Controller] send success")
            }
        }).catch(err => {
            console.log("[led Controller]" + err)
        })
    },
    tcpDistroy() {
        let promise_disconnect = led_controller.Close()
        promise_disconnect.then((results) => {
            if (results.close_status == 1) {
                ConnectionStatus = 0
                prompt.showToast({
                    message: "網路斷開",
                });
            }
        }).catch(err => {
            console.log("[led Controller]" + err)
        })
    },
    ledOpen() {
       this.tcpSend("1")
    },
    changeText() {
        prompt.showToast({
            message: "配網成功",
        });
    },
    ledClose() {
        this.tcpSend("0")
    }
}

上述程式碼中,透過import led_controller from '@ohos.led_controller'引入NAPI動態庫,led_controller動態庫中封裝TCP通訊相關的介面函式。

五、總結

本文介紹瞭如何使用NFC實現OpenHarmony“碰一碰”裝置控制。首先,需要基於樹莓派PN532模組驅動開發NFC智慧感知的應用,實現裝置間碰一碰發現的功能。然後,基於NAPI開發裝置間的TCP通訊業務,並在應用層呼叫介面函式實現LED小燈的開閉。除了文中分享的樣例,開發者還可以透過擴充其他相關的屬性和方法,實現更多好玩的、高效能的樣例。

程式碼地址:
https://gitee.com/isrc_ohos/l...
https://gitee.com/isrc_ohos/l...

參考地址

裝置端原始碼https://gitee.com/isrc_ohos/l...
應用端原始碼https://gitee.com/isrc_ohos/l...
知識體系https://gitee.com/openharmony...

圖片

相關文章