致谢
有些消息代码需要接收者的确认。在此示例中 接收方应发送确认 (ACK) 或 在收到消息后的 1 秒内发出负面确认 (NAK)。
邮件群组名称 | 值 |
---|---|
确认 | 0xFF |
确认代码名称 | 值 |
---|---|
ACK | 0x01 |
NAK | 0x02 |
确认应在收到消息后直接发送,以便
以便发送者采取相应行动确认应包含消息组
、其所引用消息的代码和当前状态。例如,如果
提供程序收到包含响铃操作 (0x04010002013C
) 的消息,
它应通过发回 0xFF0100040401013C
来确认操作,其中:
- 0xFF:ACK 事件
- 0x01:ACK 代码
- 0x0004:其他数据长度
- 0x0401:操作消息组和代码
- 0x013C:操作消息组和代码的当前状态,正确响铃和 60 秒超时
对于 NAK,还应将原因作为额外 数据。原因包括:
- 0x00:不支持
- 0x01:设备忙
- 0x02:由于当前状态而不允许
- 0x03:不允许,因为消息身份验证代码不正确
- 0x04:冗余设备操作
在上一个示例中,如果环会因
提供程序正忙于另一项任务,返回的数据包应设置为
0xFF02000401040100
,其中
- 0xFF:ACK 事件
- 0x02:NAK 代码
- 0x0004:其他数据长度
- 0x01:NAK 原因,设备忙
- 0x0401:操作消息组和代码
- 0x00:操作消息组和代码的当前状态,所有组件 停止响铃
示例:
#define FP_MSG_ACK 0x01
#define FP_MSG_NAK 0x02
#define FP_MSG_GROUP_ACK 0xFF
static void fp_msg_send_ack(uint8_t msgGroup, uint8_t msgCode)
{
FP_MESSAGE_STREAM req = {FP_MSG_GROUP_ACK, FP_MSG_ACK, 0, 2};
req.data[0] = msgGroup;
req.data[1] = msgCode;
fp_send((uint8_t *)&req);
}
static void fp_msg_send_nak(uint8_t reason, uint8_t msgGroup, uint8_t msgCode)
{
//reason= 0x00: Not supported, 0x01: Device busy, or 0x02: Not allowed due to current state
FP_MESSAGE_STREAM req = {FP_MSG_GROUP_ACK, FP_MSG_NAK, 0, 3};
req.data[0] = reason;
req.data[1] = msgGroup;
req.data[2] = msgCode;
fp_send((uint8_t *)&req);
}