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