写点什么

玩转 OpenHarmony 智能家居:如何实现树莓派“碰一碰”设备控制

  • 2022-12-27
    上海
  • 本文字数:2290 字

    阅读完需:约 8 分钟

玩转OpenHarmony智能家居:如何实现树莓派“碰一碰”设备控制

一、简介

“碰一碰”设备控制,依托 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/led-contrller-device

https://gitee.com/isrc_ohos/led-controller-application


参考地址

设备端源码https://gitee.com/isrc_ohos/led-contrller-device

应用端源码https://gitee.com/isrc_ohos/led-controller-application

知识体系https://gitee.com/openharmony-sig/knowledge



用户头像

OpenHarmony开发者官方账号 2021-12-15 加入

OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展

评论

发布
暂无评论
玩转OpenHarmony智能家居:如何实现树莓派“碰一碰”设备控制_OpenHarmony_OpenHarmony开发者_InfoQ写作社区