回复
HarmonyOS Connect原子化服务功能开发设备控制开发与实现(二) 原创
鸿蒙时代
发布于 2023-2-14 16:11
浏览
0收藏
常规设备控制
1.在“device”目录下的“DeviceApplication.java”文件中,在onInitialize函数中初始化应用。示例代码如下:
@Override
public void onInitialize() {
AiLifeServiceHelper.initApplication(this);
DeviceHandlerAbility.register(this, "");
super.onInitialize();
}
@Override
public void onEnd() {
super.onEnd();
DeviceHandlerAbility.deregister();
AiLifeServiceHelper.disconnect();
}
2.在“device”目录下的“DeviceHandlerAbility.java”文件中,连接智慧生活基础服务。
进入到控制界面后,在onStart函数里解析传递过来的参数,并且添加连接设备管理服务的操作。连接服务成功之后,进行构建HiLinkDeviceHelper对象、设置数据回调、订阅设备变化事件和获取设备相关信息等操作。示例代码如下
private AbilityContext abilityContext;
/**
* 连接智慧生活基础服务,并订阅设备事件,获取设备信息
*/
private void connectAiLifeService() {
abilityContext.getGlobalTaskDispatcher(TaskPriority.DEFAULT).asyncDispatch(() -> {
int result = AiLifeServiceHelper.connect(abilityContext);
if (result < ConnectResult.SERVICE_OK) {
// TODO: result<0,连接服务失败,直接退出应用
} else {
// TODO: result>0,连接服务成功,进行构建HiLinkDeviceHelper对象、设置数据回调、订阅设备变化事件和获取设备相关信息等操作
hiLinkDeviceHelper = new HiLinkDeviceHelper(deviceId);
hiLinkDeviceHelper.setHiLinkDataCallback(hiLinkDataCallback);
hiLinkDeviceHelper.subscribeDeviceEvent();
hiLinkDeviceHelper.getHiLinkDevice();
}
});
}
连接服务返回编码如表1所示。
3.在“device”目录下的“HiLinkDeviceHelper.java”文件中,构建DeviceManager设备控制对象。示例代码如下:
public class HiLinkDeviceHelper implements DataCallback<String> {
private HiLinkDevice mHiLinkDevice;
private final String deviceId;
private final DeviceManager deviceManager;
private HiLinkDataCallback hiLinkDataCallback;
/**
* 构造方法
*
* @param deviceId 设备deviceId
*/
public HiLinkDeviceHelper(String deviceId) {
this.deviceId = deviceId;
AiLifeServiceParamBuilder builder = new AiLifeServiceParamBuilder();
builder.addScope(ApiParameter.Scope.FEATURE_REQUEST_CLOUD)
.addScope(ApiParameter.Scope.FEATURE_CLOUD_CONTROL);
PacMapEx parameters = builder.createParameters();
deviceManager = (DeviceManager) AiLifeServiceHelper.getService(AiLifeServiceHelper.DEVICE_MANAGER_SERVICE, parameters);
}
...
}
4.在“device”目录下的“HiLinkDeviceHelper.java”文件中,订阅设备变化事件。
在订阅设备变化事件中可以监听到该设备状态信息返回值,从而可以刷新设备对应状态(如设备开关状态等)。示例代码如下:
/**
* 订阅设备变化事件
*/
public void subscribeDeviceEvent() {
List<String> listParam = new ArrayList<>();
listParam.add(deviceId);
Objects.requireNonNull(deviceManager).subscribeDeviceEvent(new DeviceListener.Builder()
.addDeviceAddListener(hiLinkDevice -> {
// TODO: 有新设备添加,进行页面刷新
})
.addDeviceDeleteListener(s -> {
// TODO: 监听设备删除变化,进行页面刷新
})
.addDeviceAttachListener(list -> {
// TODO: 设备关联状态发生变化,进行页面刷新
})
.addDeviceInfoListener(listParam, (s, hiLinkDevice) -> {
// TODO: 监听设备基本信息变化,比如在线/离线等改变,进行页面刷新
})
.addProfileDataListener(deviceId, profileDataChangeEntity -> {
// TODO: 监听设备属性变化,如开关等,进行页面刷新
})
.build());
}
5.在“device”目录下的“HiLinkDeviceHelper.java”文件中,获取设备的相关信息。示例代码如下:
import com.huawei.ailife.service.kit.model.ServiceEntity;
.
public class HiLinkDeviceHelper implements DataCallback<String> {
private HiLinkDevice mHiLinkDevice;
...
/**
* 获取服务下所挂设备
*/
public void getHiLinkDevice() {
Objects.requireNonNull(deviceManager).getHiLinkDevice(ApiParameter.Source.FROM_CLOUD, deviceId, new DataCallback<HiLinkDevice>() {
@Override
public void onSuccess(HiLinkDevice hiLinkDevice) {
Objects.requireNonNull(hiLinkDataCallback).onSuccess(DataType.GET_DEVICE, ZSONObject.toZSONString(hiLinkDevice));
mHiLinkDevice = hiLinkDevice;
getProfileData();
}
@Override
public void onFailure(int i, String s) {
// TODO: 获取获取服务下所挂设备失败
}
});
}
/**
* 获取服务的数据
*/
private void getProfileData() {
Objects.requireNonNull(mHiLinkDevice).getProfileData(ApiParameter.Source.FROM_CLOUD, new ArrayList<>(), new DataCallback<List<ServiceEntity>>() {
@Override
public void onSuccess(List<ServiceEntity> serviceEntities) {
// TODO: 获取成功之后,进行页面刷新
}
@Override
public void onFailure(int i, String s) {
// TODO: 获取服务数据失败
}
});
}
}
6.在“device”目录下的“HiLinkDeviceHelper.java”文件中,给设备下发命令,示例代码如下:
/**
* 给设备下发命令
*
* @param serviceId 要控制的设备服务的ID
* @param params 控制的参数
*/
public void sendCommand(String serviceId, String params) {
CommandParam.Builder builder = new CommandParam.Builder()
.type(ApiParameter.CommandType.SERVICE_ID) // 要控制的设备服务的类型
.serviceId(serviceId) // 要控制的设备服务的ID(例如:设备的开关按钮的服务ID是:"switch")
.mode(ApiParameter.CommandMode.MODE_AUTO); // 控制方式
if (!TextUtils.isEmpty(params)) {
ZSONObject zsonObject = ZSONObject.stringToZSON(params);
for (String key : zsonObject.keySet()) {
builder.addCharastic(key, zsonObject.get(key)); // 控制的参数(例如:设备的开关按钮,开的控制参数是:{on:1})
}
}
CommandParam commandParam = builder.build();
mHiLinkDevice.sendCommand(commandParam, this);
}
本文主要引用整理自官方文档。
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
HarmonyOS Connect原子化服务功能开发(Wi-.doc 96K 14次下载
赞
收藏
回复
相关推荐