当操作设备时,一次性将所有云食谱的操作指令从云端发送到设备端的协议方式,称为全指令协议方式。请您根据以下操作来开发云食谱全指令协议。

前提条件

该品类支持全指令协议的物模型。相关介绍,请参见协议开发概述

背景信息

全指令协议开发流程如下。
以全指令协议开发 - 图1
请您根据App端的实现方式,来开发全指令协议的流程。

  • 如果您的App端集成小程序,则只需处理设备端的相关操作即可(对应以下操作的步骤3、步骤4、步骤6、步骤7)。
    说明 如果您希望最大程度节省开发工作量,或最短时间内上线云食谱应用,推荐您App端选择快速集成小程序的方式、设备端选择开发全指令协议的方式。
  • 如果您使用H5方式自行开发App端,除了处理设备端的相关操作外,您还需要处理App端的相关操作。

    操作步骤

  1. 天猫精灵App端调用行业设备控制接口,向服务端发送启动云食谱的指令。接口的请求参数payload配置如下。

    1. payload: JSON.stringify({"businessRecipeId": 100,"command":"deviceStart"})
    2. //deviceStart表示开始指令或继续指令
  2. 服务端向设备端下发云食谱所有步骤的物模型指令。例如:完整云食谱操作分三个操作步骤,则服务端连续向设备端下发三次指令,每次为一个完整操作步骤的指令。物模型示例代码如下。

    1. //云食谱第一步操作
    2. {
    3. "cloudRecipeStatus":1, //云食谱状态
    4. "cloudRecipeStepSequence":1, //云食谱顺序序号
    5. "cloudRecipeIntegrityCheck":"e", //云食谱完整性校验码
    6. "runTime":30
    7. ...
    8. }
    9. //云食谱第二步操作
    10. {
    11. "cloudRecipeStepSequence":2, //云食谱顺序序号
    12. "cloudRecipeIntegrityCheck":"e", //云食谱完整性校验码
    13. "runTime":30
    14. ...
    15. }
    16. //云食谱第三步操作
    17. {
    18. "cloudRecipeStepSequence":3, //云食谱顺序序号
    19. "cloudRecipeIntegrityCheck":"e", //云食谱完整性校验码
    20. "runTime":30
    21. ...
    22. }
  3. 设备端校验验证码的完整性。设备端需对接收到的物模型指令进行完整性校验码,由此来物模型指令是否全部接收。完整性校验的方法如下。

    1. 向左移项二进制数000001,移动位数为cloudRecipeStepSequence的值。例如:食谱A拥有3个智能食谱步骤,即cloudRecipeStepSequence的值分别为1、2、3。则将二进制数000001分别向左移项1位、2位、3位。移项后得到的新二进制数为000010000100001000
    2. 将所有步骤移项后的二进制转化数相加,并转换为十六进制。以上示例000010000100001000相加的结果为001110。转换成十六进制表示为:e
  4. 设备端向服务端上报指令接收结果。
    • 设备端在3分钟内收到的指令完整设备端向服务端上报物模型属性cloudRecipeStatus=1,表示开始运行云食谱。
    • 设备端在3分钟内收到的指令不完整设备端向服务端上报workstatus=0,表示云食谱停止或未启动。
  5. 服务端通过长连接消息向App端推送消息,更新App端显示的设备状态。

    1. App端向服务端推送消息。示例代码如下。

      1. // 在store/modules/public.js 找到deviceStatusChange方法,加上recipe逻辑
      2. AI.deviceStatusChange({
      3. callback: resp => {
      4. console.log('长链接返回的设备状态:', Object.assign({}, resp.model));
      5. if (resp.recipe) {
      6. console.error('recipe', resp) // 云食谱返回数据
      7. // 当云食谱的长链接推送过来,返回的数据在resp.recipe中
      8. return
      9. }
      10. // 返回的设备状态,在resp.model中
      11. },
      12. errorCallback: (error) => { console.log('stateChange ERROR:', error) }
      13. });
    2. App端收到消息后向服务端返回响应消息。示例代码如下。

      1. {
      2. \"traceId\": \"1234567890abcdefghijkl0123456789\", // 追踪ID
      3. \"timestamp\": 1547714598977, // 时间戳
      4. \"deviceId\": \"456A23FBE******094FD92AB0B\", // 设备ID
      5. \"domain\": 1, // 领域:1食谱
      6. \"payload\": { // 领域参数
      7. \"contentRecipeId\": 100, // 内容食谱ID
      8. \"currentContentRecipeStepId\": 9000, // 当前内容食谱步骤ID
      9. \"runStatus\": 2, // 运行状态,0表示停止、1表示运行、2表示暂停、3表示食谱完成、4表示中断暂停
      10. \"timeLeftTotal\": 10, // 剩余时间总时间,单位秒
      11. \"totalTime\": 180, // 总时间,单位秒
      12. \"productName\": "破壁机", // 产品名称
      13. \"productKey\": \"6001\", // 产品key
      14. \"controlApiName\": \"alibaba.ailabs.iot.saas.devicecontrol\", // 控制接口名
      15. \"deviceStatusApiName\": \"alibaba.ailabs.iot.saas.deviceStatus\" // 设备状态接口名
      16. \"businessRecipeId\": 100, // 行业食谱id
      17. \"deviceStatus\": {\"name\":\"start/开始\",\"value\":1}, // 设备状态
      18. \"interruptErrorInfo\": {\"code\": 302007,\"message\":\"设备处于离线状态\"} // 中断错误码
      19. }
      20. }
  6. (可选)在设备制作云食谱过程中,如果App端或设备端收到其他操作指令时,需主动向服务端上报物模型指令。

    • 设备端向服务端上报指令

      • 设备端上报属性设备端向服务端上报当前云食谱的信息。示例代码如下。

        1. {
        2. "workstatus":1, //工作状态,0表示停止、1表示开始、2表示暂停、3表示待机状态,其余状态统称为运行中状态
        3. "cloudRecipeStepSequence":1, //云食谱步骤顺序号
        4. "lefttime":80 //剩余时间
        5. ...
        6. }
      • 设备端上报事件在云食谱运行过程中,如果发生互斥操作,设备端需主动向服务端上报相关事件。例如:终端用户在设备端增加了火力、时间等。示例代码如下。

        1. {
        2. "eventName":"deviceSideOperationEvent",
        3. "params":"{\"opreationName\":\"updateTime\"}"
        4. }
      • 云食谱暂停消息事件当终端用户暂时云食谱操作添加食材时,设备端需向服务端告知云食谱暂停消息事件。示例代码如下。

        1. {
        2. "eventName":"cloudRecipeSuspendMsgEvent"
        3. }
    • App端向服务端上报指令在云食谱操作过程中,如果终端用户通过App端发起变更云食谱的操作,此时App端调用行业设备控制接口向服务端上报消息。

      • 查询设备制作状态行业设备控制接口的请求参数payload配置示例如下。

        1. payload: JSON.stringify({"businessRecipeId": 2})
      • 暂停云食谱制作行业设备控制接口的请求参数payload配置示例如下。

        1. payload: JSON.stringify({"businessRecipeId": 100,"command":"deviceSuspend"})
        2. //deviceSuspend表示暂停指令
      • 服务端收到该指令后,向设备端下发"workSwitch":2的物模型指令。

      • 继续云食谱制作行业设备控制接口的请求参数payload配置示例如下。

        1. payload: JSON.stringify({"businessRecipeId": 100,"command":"deviceStart"})
        2. //deviceStart表示开始指令或继续指令
      • 停止云食谱制作行业设备控制接口的请求参数payload配置示例如下。

        1. payload: JSON.stringify({"businessRecipeId": 100,"command":"deviceStop"})
        2. //deviceStop表示暂停指令
      • 服务端收到该指令后,向设备端下发"workSwitch":0, "cloudRecipeStatus":0的物模型指令。

  7. 设备完成云食谱制作后,设备端向服务端上报完成事件。物模型的示例代码如下。

    1. {
    2. "eventName":"cloudRecipeDoneEvent"
    3. }
  8. 服务端通过长连接消息向App端推送消息,更新App端显示的设备状态。