> 文档中心 > HarmonyOS Connect原子化服务功能开发(Wi-Fi/Combo)设备控制开发与实现(二)

HarmonyOS Connect原子化服务功能开发(Wi-Fi/Combo)设备控制开发与实现(二)

设备控制

  1. 在“device”目录下的“DeviceApplication.java”文件中,在onInitialize函数中初始化应用。示例代码如下:

    @Overridepublic void onInitialize() {    AiLifeServiceHelper.initApplication(this);    DeviceHandlerAbility.register(this, "");    super.onInitialize();}@Overridepublic 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: 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 服务已绑定。
  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);    }    ...}

  4. 在“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());}

  5. 在“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: 获取服务数据失败     } });    }}

  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);}

    本文主要引用整理自官方文档。