HarmonyOS Connect原子化服务功能开发(Wi-Fi/Combo)设备控制开发与实现(二)
规设备控制
-
在“device”目录下的“DeviceApplication.java”文件中,在onInitialize函数中初始化应用。示例代码如下:
@Overridepublic void onInitialize() { AiLifeServiceHelper.initApplication(this); DeviceHandlerAbility.register(this, ""); super.onInitialize();}@Overridepublic void onEnd() { super.onEnd(); DeviceHandlerAbility.deregister(); AiLifeServiceHelper.disconnect();}
-
在“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: result0,连接服务成功,进行构建HiLinkDeviceHelper对象、设置数据回调、订阅设备变化事件和获取设备相关信息等操作 hiLinkDeviceHelper = new HiLinkDeviceHelper(deviceId); hiLinkDeviceHelper.setHiLinkDataCallback(hiLinkDataCallback); hiLinkDeviceHelper.subscribeDeviceEvent(); hiLinkDeviceHelper.getHiLinkDevice(); } });}
连接服务返回编码如表1所示。
参数类型 数值 描述 SERVICE_UNAVAILABLE -1 代理注册服务无效。 NO_PERMISSION -2 没有权限。 REGION_NOT_SUPPORT -3 当前地区不支持。 NO_SIGN_INFO -4 无协议签署记录,建议重新拉取协议签署页面。 PRIVACY_UPDATED -5 隐私有更新,建议重新拉取协议签署页面。 SERVICE_HAS_UNBIND -6 服务已断开。 INVALID_PARAMETER -7 参数无效。 SERVICE_OK 0 代理注册成功。 CLIENT_NEED_UPGRADE 1 代理版本需要升级。 SERVICE_NEED_UPGRADE 2 服务版本需要升级。 SERVICE_ALREADY_CONNECT 3 服务已绑定。 -
在“device”目录下的“HiLinkDeviceHelper.java”文件中,构建DeviceManager设备控制对象。示例代码如下:
public class HiLinkDeviceHelper implements DataCallback { private HiLinkDevice mHiLinkDevice; private final String deviceId; private final DeviceManager deviceManager; private HiLinkDataCallback hiLinkDataCallback; /** * 构造方法 * * [url=home.php?mod=space&uid=3142012]@param[/url] 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); } ...}
-
在“device”目录下的“HiLinkDeviceHelper.java”文件中,订阅设备变化事件。
在订阅设备变化事件中可以监听到该设备状态信息返回值,从而可以刷新设备对应状态(如设备开关状态等)。示例代码如下:
/** * 订阅设备变化事件 */public void subscribeDeviceEvent() { List 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());}
-
在“device”目录下的“HiLinkDeviceHelper.java”文件中,获取设备的相关信息。示例代码如下:
import com.huawei.ailife.service.kit.model.ServiceEntity;.public class HiLinkDeviceHelper implements DataCallback { private HiLinkDevice mHiLinkDevice; ... /** * 获取服务下所挂设备 */ public void getHiLinkDevice() { Objects.requireNonNull(deviceManager).getHiLinkDevice(ApiParameter.Source.FROM_CLOUD, deviceId, new DataCallback() { @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>() { @Override public void onSuccess(List serviceEntities) { // TODO: 获取成功之后,进行页面刷新 } @Override public void onFailure(int i, String s) { // TODO: 获取服务数据失败 } }); }}
-
在“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);}
本文主要引用整理自官方文档。