操作云食谱时,服务端分步骤向设备端发送指令,待设备端执行完一个子步骤指令后再下发下一子步骤指令的协议方式,称为分步骤协议方式。请您根据以下操作来开发云食谱分步骤协议。
前提条件
该品类支持分步骤协议的物模型。相关介绍,请参见协议开发概述。
背景信息
分步骤协议开发流程如下。
请您根据App端的实现方式,来开发分步骤协议的流程。
- 如果您的App端集成小程序,则只需处理设备端的相关操作即可(对应以下操作的步骤2、步骤3、步骤4)。
说明 如果您希望最大程度节省开发工作量,或最短时间内上线云食谱应用,推荐您App端选择快速集成小程序的方式、设备端选择开发全指令协议的方式。 - 如果您使用H5方式自行开发App端,除了处理设备端的相关操作外,您还需要处理App端的相关操作。
操作步骤
天猫精灵App调用行业设备控制接口,向服务端发送启动云食谱的指令。接口的请求参数payload配置如下。
payload: JSON.stringify({"businessRecipeId": 100,"command":"deviceStart"})
//deviceStart表示启动指令
开发云食谱第一步操作的协议指令。
服务端向设备端下发食谱开始的协议指令。示例代码如下。
{
"cloudRecipeStatus":1, //云食谱状态
"cloudRecipeStepSequence":1, //云食谱顺序序号
"runTime":30
...
}
设备端开始制作云食谱,并向服务端上报工作状态。示例代码如下。
{
"workstatus":1,
//工作状态,0表示停止、1表示开始、2表示暂停、3表示待机状态,其余状态均视为运行中状态
"lefttime":20
...
}
服务端通过长连接消息向App端推送消息,更新App端显示的设备状态。
App端向服务端推送消息。示例代码如下。
// 在store/modules/public.js 找到deviceStatusChange方法,加上recipe逻辑
AI.deviceStatusChange({
callback: resp => {
console.log('长链接返回的设备状态:', Object.assign({}, resp.model));
if (resp.recipe) {
console.error('recipe', resp) // 云食谱返回数据
// 当云食谱的长链接推送过来,返回的数据在resp.recipe中
return
}
// 返回的设备状态,在resp.model中
},
errorCallback: (error) => { console.log('stateChange ERROR:', error) }
});
App端收到消息后向服务端返回响应消息。示例代码如下。
{
\"traceId\": \"1234567890abcdefghijkl0123456789\", // 追踪ID
\"timestamp\": 1547714598977, // 时间戳
\"deviceId\": \"456A23FBE******094FD92AB0B\", // 设备ID
\"domain\": 1, // 领域:1食谱
\"payload\": { // 领域参数
\"contentRecipeId\": 100, // 内容食谱ID
\"currentContentRecipeStepId\": 9000, // 当前内容食谱步骤ID
\"runStatus\": 2, // 运行状态,0表示停止、1表示运行、2表示暂停、3表示食谱完成、4表示中断暂停
\"timeLeftTotal\": 10, // 剩余时间总时间,单位秒
\"totalTime\": 180, // 总时间,单位秒
\"productName\": "破壁机", // 产品名称
\"productKey\": \"6001\", // 产品key
\"controlApiName\": \"alibaba.ailabs.iot.saas.devicecontrol\", // 控制接口名
\"deviceStatusApiName\": \"alibaba.ailabs.iot.saas.deviceStatus\" // 设备状态接口名
\"businessRecipeId\": 100, // 行业食谱id
\"deviceStatus\": {\"name\":\"start/开始\",\"value\":1}, // 设备状态
\"interruptErrorInfo\": {\"code\": 302007,\"message\":\"设备处于离线状态\"} // 中断错误码
}
}
设备端完成云食谱第一步的操作后,向服务端上报完成事件。物模型的示例代码如下。
{
"eventName":"cloudRecipeStepDoneEvent"
}
服务端通过长连接消息向App端推送消息,更新App端显示的设备状态。
- 服务端向设备端下发云食谱第二步操作的协议指令。请您参照云食谱第一步操作的开发步骤,来依次完成剩余步骤的开发,直至所有步骤都开发完成。
说明 设备端在等待服务端下一步操作指令时,如果等待时间超过3分钟,设备端向服务端服务上报消息。该消息中需包含中断事件和当前步骤顺序序号。示例代码如下。
{
"eventName": "cloudRecipeStepInterruptEvent",
"params": {"cloudRecipeStepSequence": 2}
}
(可选)在设备制作云食谱过程中,如果App端或设备端收到其他操作指令时,需主动向服务端上报物模型指令。
设备端向服务端上报指令
设备端上报属性设备端向服务端上报当前云食谱的信息。示例代码如下。
{
"workstatus":1, //工作状态,0表示停止、1表示开始、2表示暂停、3表示待机状态,其余状态统称为运行中状态
"cloudRecipeStepSequence":1, //云食谱步骤顺序号
"lefttime":80 //剩余时间
...
}
设备端上报事件在云食谱运行过程中,如果发生互斥操作,设备端需主动向服务端上报相关事件。例如:终端用户在设备端增加了火力、时间等。示例代码如下。
{
"eventName":"deviceSideOperationEvent",
"params":"{\"opreationName\":\"updateTime\"}"
}
云食谱暂停消息事件当终端用户暂时云食谱操作添加食材时,设备端需向服务端告知云食谱暂停消息事件。示例代码如下。
{
"eventName":"cloudRecipeSuspendMsgEvent"
}
App端向服务端上报指令在云食谱操作过程中,如果终端用户通过App端发起变更云食谱的操作,此时App端调用行业设备控制接口向服务端上报消息。
查询设备制作状态行业设备控制接口的请求参数payload配置示例如下。
payload: JSON.stringify({"businessRecipeId": 2})
暂停云食谱制作行业设备控制接口的请求参数payload配置示例如下。
payload: JSON.stringify({"businessRecipeId": 100,"command":"deviceSuspend"})
//deviceSuspend表示暂停指令
服务端收到该指令后,向设备端下发
"workSwitch":2
的物模型指令。继续云食谱制作行业设备控制接口的请求参数payload配置示例如下。
payload: JSON.stringify({"businessRecipeId": 100,"command":"deviceStart"})
//deviceStart表示开始指令或继续指令
停止云食谱制作行业设备控制接口的请求参数payload配置示例如下。
payload: JSON.stringify({"businessRecipeId": 100,"command":"deviceStop"})
//deviceStop表示暂停指令
服务端收到该指令后,向设备端下发
"workSwitch":0, "cloudRecipeStatus":0
的物模型指令。
- 当整个云食谱操作完成时,服务端向设备端下发食谱完成的指令
cloudRecipeStatus=0
。