# 开发指导
- [概述](#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\)碰一碰设备配网模板的工程目录结构如下所示。

源码目录中各个类的说明如下表所示。
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一致**。

设备简介页和设备配网页会显示该产品图。
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();
}
```