# 开发指导 - [概述](#section117101122133917) - [工程项目结构](#section163058534218) - [定义设备配网原子化服务的UI界面](#section129531555424) ## 概述 碰一碰设备控制模板(OneHop Device Ability\(JS\) )用于帮助开发者实现**“碰一碰-设备配网-设备控制”**完整流程。默认工程运行后为智能电风扇的样例效果,开发者可以参考[定义设备配网原子化服务的UI界面](#section129531555424)章节修改成其他自定义设备。 该模板工程主要分为两部分: **设备配网原子化服务 (entry模块)** **设备控制原子化服务 (control模块)** 本指导书用于指导开发者如何开发**设备配网原子化服务 (entry模块)**,关于**设备控制原子化服务(control模块)**的开发指导请参考[设备控制原子化服务开发指导书](guide-atomic-service-device-ctrl-overview.md)。 ## 工程项目结构 OneHop Device Ability\(JS\)碰一碰设备配网模板的工程目录结构如下所示。 ![](figures/project-structure.png) 源码目录中各个类的说明如下表所示。

Class

Description

Java

MyApplication

应用的入口类

MainAbility

拉起JS的入口类,处理NFC标签读取到的信息

JS

default/pages/device/device.js

设备简介页,碰一碰拉起后跳转的页面

default/pages/netconfig/netconfig.js

设备配网页,负责配网相关逻辑,在设备简介页点击配网后显示

## 定义设备配网原子化服务的UI界面 1. 在MainAbility onStart里处理NFC标签读取到的product id信息, **开发者可以根据自己的productId映射成不同的设备类型,将productName修改成具体的设备名**,默认为智能电风扇。 ``` @Override public void onStart(Intent intent) { intent.setParam("window_modal", 3); setInstanceName(JS_MODULE); Object productInfo = Objects.requireNonNull(intent.getParams()).getParam("productInfo"); if (productInfo != null) { productId = (String) productInfo; // Modify your product name according to your product ID in the NFC tag. productName = "FAN"; } } ``` 2. 在资源目录下放置您的产品图, 用于界面显示,**注意文件命名为<设备名\>.png, 设备名保持与productName一致**。 ![](figures/place-product-diagram.png) 设备简介页和设备配网页会显示该产品图。 3. 在项目的entry\\src\\main\\js\\default\\pages\\netconfig\\netconfig.js的goToControl方法中添加deviceType:1,用于提高设备配网的稳定性。 ``` goToControl() { let target = { bundleName: 'com.example.middleplatform.deviceoperate', abilityName: 'com.example.middleplatform.ControlMainAbility', deviceType: 1, data: { session_id: getApp(this).ConfigParams.deviceInfo.sessionId, product_id: getApp(this).Product.productId, product_name: getApp(this).Product.productName } } FeatureAbility.startAbility(target); app.terminate(); } ```