> 文档中心 > OpenHarmony成长计划#校园极客秀#碰一碰智能NFC打卡机

OpenHarmony成长计划#校园极客秀#碰一碰智能NFC打卡机


作品创意

NFC——近距离无线通讯技术目前已成为我们生活中随处可见、随手可用的技术,它可以提供轻松、安全、迅速的通信无线连接,被广泛地应用于各种场合,如公交一卡通、学生校园卡等。现在越来越多的智能手机都有NFC的功能,在这一强大的近场通讯技术的支持下,只需要一部手机轻轻一碰,就可以满足在购物、吃饭、交通等多场景下的便捷操作。
华为碰一碰能力(OneHop Engine)是多终端业务协同的解决方案技术,依托NFC短距通信协议,向手机端应用和三方设备开放多设备触碰交互能力,将手机和全场景设备连接起来,致力为用户提供手机到周边设备多种业务无缝切换的高效体验,解决了App跨设备接续难、设备配网难、传输难的问题。
我们基于BearPi-HM Nano开发套件和华为碰一碰功能开发了一款智能打卡机,支持NFC打卡和打卡结果上报到智能终端功能,拜托了传统的打卡方式,集成鸿蒙“碰一碰”功能,使打卡更加便捷。

作品技术方案

作品构思

对业务场景流程进行规划,最终确定通过碰一碰拉起打卡应用,登录实现打卡,然后通过日历展示提示打卡记录的方式进行打卡的操作。

实现过程

碰一碰拉起应用需要给标签进行信息配置与录入

①首先下载一个应用调测助手
OpenHarmony成长计划#校园极客秀#碰一碰智能NFC打卡机
②切换到NFC栏
OpenHarmony成长计划#校园极客秀#碰一碰智能NFC打卡机
③点击选择按钮
OpenHarmony成长计划#校园极客秀#碰一碰智能NFC打卡机
④然后点申请,这样就可以了。
OpenHarmony成长计划#校园极客秀#碰一碰智能NFC打卡机

登录华为开发者联盟

①登陆后点击右上角管理中心:
管理中心
②点击左边栏智慧服务,选择HarmonyOS服务开发平台:
在这里插入图片描述
③创建服务,详细步骤请参考:https://gitee.com/openharmony-sig/knowledge_demo_smart_home/blob/master/dev/docs/NFC_label_definition/README.md
此时申请的Product ID可以录入碰一碰标签,并且碰一碰的时候可以根据配置的标签信息拉起应用。
在这里插入图片描述
④首先要把华为云上的硬件数据通过数据转发给应用服务器,转发方式为进入华为云控制台:
在这里插入图片描述
⑤点击数据转发进行转发信息配置:
在这里插入图片描述
在这里插入图片描述
OpenHarmony成长计划#校园极客秀#碰一碰智能NFC打卡机
OpenHarmony成长计划#校园极客秀#碰一碰智能NFC打卡机
配置完信息后,启动就可以在应用服务器端收到华为云转来的数据了,对数据进行存储即可通过应用端访问。
应用服务器端接收转发数据并存储代码如下:

1.exports.i***ta2=function(req,res){      2.    console.log("iot数据:",req)      3.    const url = new URL("http://**********"+req.url) //转发目标里边配置的地址      4.    let properties = JSON.stringify(req.body.notify_data.body.services)      5.    console.log("存储数据:",properties)      6.    let addArr = [properties]      7.    var addSql = 'INSERT INTO sesnor_Record(properties) VALUES (?)'      8.    var callBack = function(err,data){      9. console.log("错误:"+err)      10. console.log("属性插入结果::"+JSON.stringify(data))      11. res.send(data)      12.    }      13.    sqlUtil.sqlContent(addSql,addArr,callBack)      14.}  

应用服务端改变设备状态代码如下:其中参数project_id查询方式连接(https://support.huaweicloud.com/api-iothub/iot_06_v5_1001.html)。deviceId在主仓设备时由物联网平台分配。

1.exports.iot***and=function(req,res){  2.    console.log("进入请求")  3.    var resData = {}  4.    const core = require('@huaweicloud/huaweicloud-sdk-core');  5.const iotda = require("@huaweicloud/huaweicloud-sdk-iotda");  6.  7.const ak = "L9HKGF4ZVS&&********O";  8.const sk = "JU0Q2********ZynWc51pxbNdlW3CuKygcSJ8";  9.const endpoint = "https://iotda.cn-north-4.myhuaweicloud.com";  10.const project_id = "0d5a*******14a6878dd1";  11.const securityToken = process.env.HWCLOUD_SECURITY_TOKEN;  12.const credentials = new core.BasicCredentials()  13..withAk(ak)  14..withSk(sk)  15..withSecurityToken(securityToken) // 在临时aksk场景下使用  16..withProjectId(project_id)  17.const client = iotda.IoTDAClient.newBuilder()  18..withCredential(credentials)  19..withEndpoint(endpoint)  20..build();  21.const request = new iotda.CreateCommandRequest();  22.request.deviceId = "61e62*******78_19950118";  23.const body = new iotda.DeviceCommandRequest();  24.// body.withParas("{\"Light\":\"OFF\"}");  25.body.withParas({"Light":"OFF"});  26.body.withCommandName("Agriculture_Control_light");  27.body.withServiceId("Agriculture");  28.request.withBody(body);  29.const result = client.createCommand(request);  30.result.then(result => {  31.    console.log("JSON.stringify(result)::" + JSON.stringify(result));  32.    resData = {  33. result:"success",  34. message:result  35.    }  36.    res.send(resData)  37.}).catch(ex => {  38.    console.log("exception:" + JSON.stringify(ex));  39.     resData = {  40. result:"fail",  41. message:ex  42.    }  43.    res.send(resData)  44.});  45.} 

这样就可以通过应用端给IoT云平台下发一条命令从而控制硬件状态的改变。

作品效果展示

碰一碰拉起打卡程序界面

在这里插入图片描述

用户在软件中进行打卡操作

在这里插入图片描述

作者:北京工业大学-李京京 西南科技大学-王林超
2022年4月18日