致谢

有些消息代码需要接收者的确认。在此示例中 接收方应发送确认 (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);
}