diff --git a/docs/clockin/.keep b/docs/clockin/.keep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/docs/clockin/README.md b/docs/clockin/README.md new file mode 100644 index 0000000000000000000000000000000000000000..ce4172d2f66fd61a45c60c072ca27988d61b3b83 --- /dev/null +++ b/docs/clockin/README.md @@ -0,0 +1,136 @@ +# 作品创意 +NFC——近距离无线通讯技术目前已成为我们生活中随处可见、随手可用的技术,它可以提供轻松、安全、迅速的通信无线连接,被广泛地应用于各种场合,如公交一卡通、学生校园卡等。现在越来越多的智能手机都有NFC的功能,在这一强大的近场通讯技术的支持下,只需要一部手机轻轻一碰,就可以满足在购物、吃饭、交通等多场景下的便捷操作。 +华为碰一碰能力(OneHop Engine)是多终端业务协同的解决方案技术,依托NFC短距通信协议,向手机端应用和三方设备开放多设备触碰交互能力,将手机和全场景设备连接起来,致力为用户提供手机到周边设备多种业务无缝切换的高效体验,解决了App跨设备接续难、设备配网难、传输难的问题。 +我们基于BearPi-HM Nano开发套件和华为碰一碰功能开发了一款智能打卡机,支持NFC打卡和打卡结果上报到智能终端功能,拜托了传统的打卡方式,集成鸿蒙“碰一碰”功能,使打卡更加便捷。 +# 作品技术方案 +## 作品构思 +对业务场景流程进行规划,最终确定通过碰一碰拉起打卡应用,登录实现打卡,然后通过日历展示提示打卡记录的方式进行打卡的操作。 +## 实现过程 +### 碰一碰拉起应用需要给标签进行信息配置与录入 +①首先下载一个应用调测助手 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/1ab5633ac155473aace2b319795f2fd3.png) + +②切换到NFC栏 + +![NFC栏](https://img-blog.csdnimg.cn/824e72cf319a4818b55c3f99ac4a5d4e.png) + +③点击选择按钮 + +![点击选择按钮](https://img-blog.csdnimg.cn/5f3ddaa92232456cb702513c573ac189.png) + +④然后点申请,这样就可以了。 + +![点击申请](https://img-blog.csdnimg.cn/02b0ab2420b349ba8a2c9b0dde07e892.png) + +### 登录华为开发者联盟 +①登陆后点击右上角管理中心: + +![管理中心](https://img-blog.csdnimg.cn/cc04d771ab11461fa0084c100f5448b2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASGVzcGVy,size_18,color_FFFFFF,t_70,g_se,x_16) + +②点击左边栏智慧服务,选择HarmonyOS服务开发平台: + +![在这里插入图片描述](https://img-blog.csdnimg.cn/6127328c127643a59b64924d61a82498.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASGVzcGVy,size_18,color_FFFFFF,t_70,g_se,x_16) + +③创建服务,详细步骤请参考:https://gitee.com/openharmony-sig/knowledge_demo_smart_home/blob/master/dev/docs/NFC_label_definition/README.md + 此时申请的Product ID可以录入碰一碰标签,并且碰一碰的时候可以根据配置的标签信息拉起应用。 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/66f5e14b77ba470aa1f7a1ed8694694a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASGVzcGVy,size_18,color_FFFFFF,t_70,g_se,x_16) + +④首先要把华为云上的硬件数据通过数据转发给应用服务器,转发方式为进入华为云控制台: + +![在这里插入图片描述](https://img-blog.csdnimg.cn/555b43d94c0a47cbb4601c6377c41e5c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASGVzcGVy,size_18,color_FFFFFF,t_70,g_se,x_16) + +⑤点击数据转发进行转发信息配置: + +![在这里插入图片描述](https://img-blog.csdnimg.cn/23a07625901b42aba9fe18f673c680d4.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASGVzcGVy,size_18,color_FFFFFF,t_70,g_se,x_16) + +![在这里插入图片描述](https://img-blog.csdnimg.cn/37b00cbc043f4ed883eb34f2676c6f16.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASGVzcGVy,size_18,color_FFFFFF,t_70,g_se,x_16) + +![在这里插入图片描述](https://img-blog.csdnimg.cn/3f00e2b1bcd54e18bce85b567559fc00.png) + +![在这里插入图片描述](https://img-blog.csdnimg.cn/663a5d583c5b49a996217825f1454c22.png) + +配置完信息后,启动就可以在应用服务器端收到华为云转来的数据了,对数据进行存储即可通过应用端访问。 +应用服务器端接收转发数据并存储代码如下: + +```c +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在主仓设备时由物联网平台分配。 +```c +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云平台下发一条命令从而控制硬件状态的改变。 + + +# 作品效果展示 +## 碰一碰拉起打卡程序界面 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/bfa8c5265c754ac18d92c670dbcb23bb.gif#pic_center) + +## 用户在软件中进行打卡操作 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/09e2b82eb4824f45805d4c259295deb3.gif#pic_center) + + +作者:北京工业大学-李京京 西南科技大学-王林超 + 2022年4月18日 +