# WMPF Client 与 Service 通信

WMPF Client Demo 中,你需要集成最新的 wmpf-cli.aar,才能顺利的和 WMPF Service 进行交互,wmpf-cli.aar 中集成了交互的数据类,序列化工具以及 IPC 调用能力。

# 交互模型

  • Task:在 WMPF Service 中定义了一组 Task ,一个 Task 可以理解为一个 API ,定义了某种服务,比如用于激活设备的 ActivateDevice ,用于启动小程序的 LaunchWxaApp
  • WMPFRequest:Task 的请求参数
  • WMPFResponse:Task 请求的响应

注意:这里的协议都是强类型的,所以只能用我们定义好的数据类来发起请求和获取应答。同样,也只能用我们封装好的 WMPFIPCInvoker.class 来发起请求。

# 示例代码

findViewById<Button>(R.id.btn_init_wmpf_activate_device).setOnClickListener {
  Api.activateDevice(Constants.PRODUCTID, Constants.KEYVERSION,
                     Constants.DEVICEID, Constants.SIGNATURE, Constants.APP_ID)
  .subscribe({
    Log.i(TAG, "success: $it")
    InvokeTokenHelper.initInvokeToken(this, it.invokeToken)
    postToMainThread(Runnable {
      Toast.makeText(this, String.format("init finish, err %d",
                                         it?.baseResponse?.ret), Toast.LENGTH_SHORT).show()
    })
  }, {
    Log.e(TAG, "error: $it")
  })
}

以激活设备为例,用户点击到激活设备的按钮后,代码将请求的参数传入了 Api.activateDevice() 并且订阅了结果。

object Api {

  fun activateDevice(productId: Int, keyVerion: Int,
                     deviceId: String, signature: String, hostAppId: String): Single<WMPFActivateDeviceResponse> {
    return Single.create {
      val request = WMPFActivateDeviceRequest().apply {
        this.baseRequest = WMPFBaseRequestHelper.checked()
        this.productId = productId
        this.keyVersion = keyVerion
        this.deviceId = deviceId
        this.signature = signature
        this.hostAppId = hostAppId
      }

      var result = WMPFIPCInvoker.invokeAsync<IPCInvokerTask_ActivateDevice, WMPFActivateDeviceRequest, WMPFActivateDeviceResponse>(
        request,
        IPCInvokerTask_ActivateDevice::class.java,
        object : IPCInvokeCallbackEx<WMPFActivateDeviceResponse> {
          override fun onBridgeNotFound() {
            it.onError(Exception("bridge not found"))
          }

          override fun onCallback(response: WMPFActivateDeviceResponse) {
            it.onSuccess(response)
          }
        })

      if (!result) {
        it.onError(Exception("invoke activateDevice fail"))
      }
    }
  }
}

activateDevice 方法中,发起了真正的请求。这里先组装 WMPFActivateDeviceRequest ,然后调用 WMPFBaseRequestHelper.checked() 对基本的字段进行检查,最后调用 WMPFIPCInvoker.invokeAsync<IPCInvokerTask_ActivateDevice, WMPFActivateDeviceRequest, WMPFActivateDeviceResponse>(task,request,response) 发起请求,请求的响应将在第三个参数中 callback 回来。

# 备注