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所示。
HarmonyOS Connect原子化服务功能开发设备控制开发与实现(二)-鸿蒙开发者社区
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次下载
收藏
回复
举报
回复
    相关推荐