Xác nhận
Một số mã thông báo yêu cầu người nhận xác nhận. Trong trường hợp này, thiết bị nhận phải gửi thông tin xác nhận (ACK) hoặc xác nhận tiêu cực (NAK) trong vòng 1 giây kể từ khi nhận được thông báo.
Tên nhóm thông báo | Giá trị |
---|---|
Xác nhận | 0xFF |
Tên mã xác nhận | Giá trị |
---|---|
ACK | 0x01 |
NAK | 0x02 |
Bạn cần gửi xác nhận trực tiếp sau khi nhận được thư để người gửi có thể hành động phù hợp. Lời xác nhận phải chứa nhóm thông báo, mã và trạng thái hiện tại của thông báo mà đối tượng đang tham chiếu. Ví dụ: nếu Nhà cung cấp nhận được một thông báo chứa hành động đổ chuông (0x04010002013C
), thì nhà cung cấp phải xác nhận hành động bằng cách gửi lại 0xFF0100040401013C
khi:
- 0xFF: Sự kiện ACK
- 0x01: Mã ACK
- 0x0004: Độ dài dữ liệu bổ sung
- 0x0401: Nhóm và mã thông báo hành động
- 0x013C: Trạng thái hiện tại của nhóm và mã thông báo hành động, đổ chuông bên phải và hết thời gian chờ 60 giây
Đối với NAK, lý do cũng phải được đưa vào dưới dạng byte đầu tiên của dữ liệu bổ sung. Các lý do bao gồm:
- 0x00: Không được hỗ trợ
- 0x01: Thiết bị bận
- 0x02: Không được phép do trạng thái hiện tại
- 0x03: Không được phép do mã xác thực thư không chính xác
- 0x04: Hành động thừa trên thiết bị
Trong ví dụ trước, nếu vòng tròn được đặt là NAK (DoAK) do
Nhà cung cấp đang bận thực hiện một nhiệm vụ khác, thì bạn nên đặt gói được trả về thành
0xFF02000401040100
- 0xFF: Sự kiện ACK
- 0x02: Mã NAK
- 0x0004: Độ dài dữ liệu bổ sung
- 0x01: Lý do NAK, Thiết bị bận
- 0x0401: Nhóm và mã thông báo hành động
- 0x00: Trạng thái hiện tại của nhóm thông báo và mã hành động, tất cả các thành phần ngừng đổ chuông
Ví dụ:
#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);
}