blob: ebcae93efe8304c30d8ee8987f4db707d92edab7 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package nmble
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"strconv"
"strings"
. "mynewt.apache.org/newtmgr/nmxact/bledefs"
)
type MsgOp int
type MsgType int
type BleSeq uint32
type BleBytes struct {
Bytes []byte
}
const BLE_CONN_HANDLE_NONE uint16 = 0xffff
const BLE_SEQ_MIN BleSeq = 0
const BLE_SEQ_EVT_MIN BleSeq = 0xffffff00
const BLE_SEQ_NONE BleSeq = 0xffffffff
const ERR_CODE_ATT_BASE = 0x100
const ERR_CODE_HCI_BASE = 0x200
const ERR_CODE_L2C_BASE = 0x300
const ERR_CODE_SM_US_BASE = 0x400
const ERR_CODE_SM_PEER_BASE = 0x500
const (
ERR_CODE_EAGAIN int = 1
ERR_CODE_EALREADY = 2
ERR_CODE_EINVAL = 3
ERR_CODE_EMSGSIZE = 4
ERR_CODE_ENOENT = 5
ERR_CODE_ENOMEM = 6
ERR_CODE_ENOTCONN = 7
ERR_CODE_ENOTSUP = 8
ERR_CODE_EAPP = 9
ERR_CODE_EBADDATA = 10
ERR_CODE_EOS = 11
ERR_CODE_ECONTROLLER = 12
ERR_CODE_ETIMEOUT = 13
ERR_CODE_EDONE = 14
ERR_CODE_EBUSY = 15
ERR_CODE_EREJECT = 16
ERR_CODE_EUNKNOWN = 17
ERR_CODE_EROLE = 18
ERR_CODE_ETIMEOUT_HCI = 19
ERR_CODE_ENOMEM_EVT = 20
ERR_CODE_ENOADDR = 21
ERR_CODE_ENOTSYNCED = 22
ERR_CODE_EAUTHEN = 23
ERR_CODE_EAUTHOR = 24
ERR_CODE_EENCRYPT = 25
ERR_CODE_EENCRYPT_KEY_SZ = 26
ERR_CODE_ESTORE_CAP = 27
ERR_CODE_ESTORE_FAIL = 28
ERR_CODE_EPREEMPTED = 29
)
var ErrCodeStringMap = map[int]string{
ERR_CODE_EAGAIN: "eagain",
ERR_CODE_EALREADY: "ealready",
ERR_CODE_EINVAL: "einval",
ERR_CODE_EMSGSIZE: "emsgsize",
ERR_CODE_ENOENT: "enoent",
ERR_CODE_ENOMEM: "enomem",
ERR_CODE_ENOTCONN: "enotconn",
ERR_CODE_ENOTSUP: "enotsup",
ERR_CODE_EAPP: "eapp",
ERR_CODE_EBADDATA: "ebaddata",
ERR_CODE_EOS: "eos",
ERR_CODE_ECONTROLLER: "econtroller",
ERR_CODE_ETIMEOUT: "etimeout",
ERR_CODE_EDONE: "edone",
ERR_CODE_EBUSY: "ebusy",
ERR_CODE_EREJECT: "ereject",
ERR_CODE_EUNKNOWN: "eunknown",
ERR_CODE_EROLE: "erole",
ERR_CODE_ETIMEOUT_HCI: "etimeout_hci",
ERR_CODE_ENOMEM_EVT: "enomem_evt",
ERR_CODE_ENOADDR: "enoaddr",
ERR_CODE_ENOTSYNCED: "enotsynced",
}
const (
ERR_CODE_HCI_UNKNOWN_HCI_CMD int = 1
ERR_CODE_HCI_UNK_CONN_ID = 2
ERR_CODE_HCI_HW_FAIL = 3
ERR_CODE_HCI_PAGE_TMO = 4
ERR_CODE_HCI_AUTH_FAIL = 5
ERR_CODE_HCI_PINKEY_MISSING = 6
ERR_CODE_HCI_MEM_CAPACITY = 7
ERR_CODE_HCI_CONN_SPVN_TMO = 8
ERR_CODE_HCI_CONN_LIMIT = 9
ERR_CODE_HCI_SYNCH_CONN_LIMIT = 10
ERR_CODE_HCI_ACL_CONN_EXISTS = 11
ERR_CODE_HCI_CMD_DISALLOWED = 12
ERR_CODE_HCI_CONN_REJ_RESOURCES = 13
ERR_CODE_HCI_CONN_REJ_ENC = 14
ERR_CODE_HCI_CONN_REJ_BD_ADDR = 15
ERR_CODE_HCI_CONN_ACCEPT_TMO = 16
ERR_CODE_HCI_UNSUPPORTED = 17
ERR_CODE_HCI_INV_HCI_CMD_PARMS = 18
ERR_CODE_HCI_REM_USER_CONN_TERM = 19
ERR_CODE_HCI_RD_CONN_TERM_RESRCS = 20
ERR_CODE_HCI_RD_CONN_TERM_PWROFF = 21
ERR_CODE_HCI_CONN_TERM_LOCAL = 22
ERR_CODE_HCI_REPEATED_ATTEMPTS = 23
ERR_CODE_HCI_NO_PAIRING = 24
ERR_CODE_HCI_UNK_LMP = 25
ERR_CODE_HCI_UNSUPP_REM_FEATURE = 26
ERR_CODE_HCI_SCO_OFFSET = 27
ERR_CODE_HCI_SCO_ITVL = 28
ERR_CODE_HCI_SCO_AIR_MODE = 29
ERR_CODE_HCI_INV_LMP_LL_PARM = 30
ERR_CODE_HCI_UNSPECIFIED = 31
ERR_CODE_HCI_UNSUPP_LMP_LL_PARM = 32
ERR_CODE_HCI_NO_ROLE_CHANGE = 33
ERR_CODE_HCI_LMP_LL_RSP_TMO = 34
ERR_CODE_HCI_LMP_COLLISION = 35
ERR_CODE_HCI_LMP_PDU = 36
ERR_CODE_HCI_ENCRYPTION_MODE = 37
ERR_CODE_HCI_LINK_KEY_CHANGE = 38
ERR_CODE_HCI_UNSUPP_QOS = 39
ERR_CODE_HCI_INSTANT_PASSED = 40
ERR_CODE_HCI_UNIT_KEY_PAIRING = 41
ERR_CODE_HCI_DIFF_TRANS_COLL = 42
ERR_CODE_HCI_QOS_PARM = 44
ERR_CODE_HCI_QOS_REJECTED = 45
ERR_CODE_HCI_CHAN_CLASS = 46
ERR_CODE_HCI_INSUFFICIENT_SEC = 47
ERR_CODE_HCI_PARM_OUT_OF_RANGE = 48
ERR_CODE_HCI_PENDING_ROLE_SW = 50
ERR_CODE_HCI_RESERVED_SLOT = 52
ERR_CODE_HCI_ROLE_SW_FAIL = 53
ERR_CODE_HCI_INQ_RSP_TOO_BIG = 54
ERR_CODE_HCI_SEC_SIMPLE_PAIR = 55
ERR_CODE_HCI_HOST_BUSY_PAIR = 56
ERR_CODE_HCI_CONN_REJ_CHANNEL = 57
ERR_CODE_HCI_CTLR_BUSY = 58
ERR_CODE_HCI_CONN_PARMS = 59
ERR_CODE_HCI_DIR_ADV_TMO = 60
ERR_CODE_HCI_CONN_TERM_MIC = 61
ERR_CODE_HCI_CONN_ESTABLISHMENT = 62
ERR_CODE_HCI_MAC_CONN_FAIL = 63
ERR_CODE_HCI_COARSE_CLK_ADJ = 64
)
var HciErrCodeStringMap = map[int]string{
ERR_CODE_HCI_UNKNOWN_HCI_CMD: "unknown hci cmd",
ERR_CODE_HCI_UNK_CONN_ID: "unknown connection id",
ERR_CODE_HCI_HW_FAIL: "hw fail",
ERR_CODE_HCI_PAGE_TMO: "page tmo",
ERR_CODE_HCI_AUTH_FAIL: "auth fail",
ERR_CODE_HCI_PINKEY_MISSING: "pinkey missing",
ERR_CODE_HCI_MEM_CAPACITY: "mem capacity",
ERR_CODE_HCI_CONN_SPVN_TMO: "connection supervision timeout",
ERR_CODE_HCI_CONN_LIMIT: "conn limit",
ERR_CODE_HCI_SYNCH_CONN_LIMIT: "synch conn limit",
ERR_CODE_HCI_ACL_CONN_EXISTS: "acl conn exists",
ERR_CODE_HCI_CMD_DISALLOWED: "cmd disallowed",
ERR_CODE_HCI_CONN_REJ_RESOURCES: "conn rej resources",
ERR_CODE_HCI_CONN_REJ_ENC: "conn rej security",
ERR_CODE_HCI_CONN_REJ_BD_ADDR: "conn rej bd addr",
ERR_CODE_HCI_CONN_ACCEPT_TMO: "conn accept tmo",
ERR_CODE_HCI_UNSUPPORTED: "unsupported",
ERR_CODE_HCI_INV_HCI_CMD_PARMS: "inv hci cmd parms",
ERR_CODE_HCI_REM_USER_CONN_TERM: "rem user conn term",
ERR_CODE_HCI_RD_CONN_TERM_RESRCS: "rd conn term resrcs",
ERR_CODE_HCI_RD_CONN_TERM_PWROFF: "rd conn term pwroff",
ERR_CODE_HCI_CONN_TERM_LOCAL: "conn term local",
ERR_CODE_HCI_REPEATED_ATTEMPTS: "repeated attempts",
ERR_CODE_HCI_NO_PAIRING: "no pairing",
ERR_CODE_HCI_UNK_LMP: "unk lmp",
ERR_CODE_HCI_UNSUPP_REM_FEATURE: "unsupp rem feature",
ERR_CODE_HCI_SCO_OFFSET: "sco offset",
ERR_CODE_HCI_SCO_ITVL: "sco itvl",
ERR_CODE_HCI_SCO_AIR_MODE: "sco air mode",
ERR_CODE_HCI_INV_LMP_LL_PARM: "inv lmp ll parm",
ERR_CODE_HCI_UNSPECIFIED: "unspecified",
ERR_CODE_HCI_UNSUPP_LMP_LL_PARM: "unsupp lmp ll parm",
ERR_CODE_HCI_NO_ROLE_CHANGE: "no role change",
ERR_CODE_HCI_LMP_LL_RSP_TMO: "lmp ll rsp tmo",
ERR_CODE_HCI_LMP_COLLISION: "lmp collision",
ERR_CODE_HCI_LMP_PDU: "lmp pdu",
ERR_CODE_HCI_ENCRYPTION_MODE: "encryption mode",
ERR_CODE_HCI_LINK_KEY_CHANGE: "link key change",
ERR_CODE_HCI_UNSUPP_QOS: "unsupp qos",
ERR_CODE_HCI_INSTANT_PASSED: "instant passed",
ERR_CODE_HCI_UNIT_KEY_PAIRING: "unit key pairing",
ERR_CODE_HCI_DIFF_TRANS_COLL: "diff trans coll",
ERR_CODE_HCI_QOS_PARM: "qos parm",
ERR_CODE_HCI_QOS_REJECTED: "qos rejected",
ERR_CODE_HCI_CHAN_CLASS: "chan class",
ERR_CODE_HCI_INSUFFICIENT_SEC: "insufficient sec",
ERR_CODE_HCI_PARM_OUT_OF_RANGE: "parm out of range",
ERR_CODE_HCI_PENDING_ROLE_SW: "pending role sw",
ERR_CODE_HCI_RESERVED_SLOT: "reserved slot",
ERR_CODE_HCI_ROLE_SW_FAIL: "role sw fail",
ERR_CODE_HCI_INQ_RSP_TOO_BIG: "inq rsp too big",
ERR_CODE_HCI_SEC_SIMPLE_PAIR: "sec simple pair",
ERR_CODE_HCI_HOST_BUSY_PAIR: "host busy pair",
ERR_CODE_HCI_CONN_REJ_CHANNEL: "conn rej channel",
ERR_CODE_HCI_CTLR_BUSY: "ctlr busy",
ERR_CODE_HCI_CONN_PARMS: "conn parms",
ERR_CODE_HCI_DIR_ADV_TMO: "dir adv tmo",
ERR_CODE_HCI_CONN_TERM_MIC: "conn term mic",
ERR_CODE_HCI_CONN_ESTABLISHMENT: "conn establishment",
ERR_CODE_HCI_MAC_CONN_FAIL: "mac conn fail",
ERR_CODE_HCI_COARSE_CLK_ADJ: "coarse clk adj",
}
const (
ERR_CODE_ATT_INVALID_HANDLE int = 0x01
ERR_CODE_ATT_READ_NOT_PERMITTED = 0x02
ERR_CODE_ATT_WRITE_NOT_PERMITTED = 0x03
ERR_CODE_ATT_INVALID_PDU = 0x04
ERR_CODE_ATT_INSUFFICIENT_AUTHEN = 0x05
ERR_CODE_ATT_REQ_NOT_SUPPORTED = 0x06
ERR_CODE_ATT_INVALID_OFFSET = 0x07
ERR_CODE_ATT_INSUFFICIENT_AUTHOR = 0x08
ERR_CODE_ATT_PREPARE_QUEUE_FULL = 0x09
ERR_CODE_ATT_ATTR_NOT_FOUND = 0x0a
ERR_CODE_ATT_ATTR_NOT_LONG = 0x0b
ERR_CODE_ATT_INSUFFICIENT_KEY_SZ = 0x0c
ERR_CODE_ATT_INVALID_ATTR_VALUE_LEN = 0x0d
ERR_CODE_ATT_UNLIKELY = 0x0e
ERR_CODE_ATT_INSUFFICIENT_ENC = 0x0f
ERR_CODE_ATT_UNSUPPORTED_GROUP = 0x10
ERR_CODE_ATT_INSUFFICIENT_RES = 0x11
)
var AttErrCodeStringMap = map[int]string{
ERR_CODE_ATT_INVALID_HANDLE: "invalid handle",
ERR_CODE_ATT_READ_NOT_PERMITTED: "read not permitted",
ERR_CODE_ATT_WRITE_NOT_PERMITTED: "write not permitted",
ERR_CODE_ATT_INVALID_PDU: "invalid pdu",
ERR_CODE_ATT_INSUFFICIENT_AUTHEN: "insufficient authentication",
ERR_CODE_ATT_REQ_NOT_SUPPORTED: "request not supported",
ERR_CODE_ATT_INVALID_OFFSET: "invalid offset",
ERR_CODE_ATT_INSUFFICIENT_AUTHOR: "insufficient authorization",
ERR_CODE_ATT_PREPARE_QUEUE_FULL: "prepare queue full",
ERR_CODE_ATT_ATTR_NOT_FOUND: "attribute not found",
ERR_CODE_ATT_ATTR_NOT_LONG: "attribute not long",
ERR_CODE_ATT_INSUFFICIENT_KEY_SZ: "insufficient key size",
ERR_CODE_ATT_INVALID_ATTR_VALUE_LEN: "invalid attribute value length",
ERR_CODE_ATT_UNLIKELY: "unlikely error",
ERR_CODE_ATT_INSUFFICIENT_ENC: "insufficient encryption",
ERR_CODE_ATT_UNSUPPORTED_GROUP: "unsupported group",
ERR_CODE_ATT_INSUFFICIENT_RES: "insufficient resources",
}
const (
ERR_CODE_SM_ERR_PASSKEY int = 0x01
ERR_CODE_SM_ERR_OOB = 0x02
ERR_CODE_SM_ERR_AUTHREQ = 0x03
ERR_CODE_SM_ERR_CONFIRM_MISMATCH = 0x04
ERR_CODE_SM_ERR_PAIR_NOT_SUPP = 0x05
ERR_CODE_SM_ERR_ENC_KEY_SZ = 0x06
ERR_CODE_SM_ERR_CMD_NOT_SUPP = 0x07
ERR_CODE_SM_ERR_UNSPECIFIED = 0x08
ERR_CODE_SM_ERR_REPEATED = 0x09
ERR_CODE_SM_ERR_INVAL = 0x0a
ERR_CODE_SM_ERR_DHKEY = 0x0b
ERR_CODE_SM_ERR_NUMCMP = 0x0c
ERR_CODE_SM_ERR_ALREADY = 0x0d
ERR_CODE_SM_ERR_CROSS_TRANS = 0x0e
)
var SmErrCodeStringMap = map[int]string{
ERR_CODE_SM_ERR_PASSKEY: "passkey",
ERR_CODE_SM_ERR_OOB: "oob",
ERR_CODE_SM_ERR_AUTHREQ: "authreq",
ERR_CODE_SM_ERR_CONFIRM_MISMATCH: "confirm mismatch",
ERR_CODE_SM_ERR_PAIR_NOT_SUPP: "pairing not supported",
ERR_CODE_SM_ERR_ENC_KEY_SZ: "encryption key size",
ERR_CODE_SM_ERR_CMD_NOT_SUPP: "command not supported",
ERR_CODE_SM_ERR_UNSPECIFIED: "unspecified",
ERR_CODE_SM_ERR_REPEATED: "repeated attempts",
ERR_CODE_SM_ERR_INVAL: "invalid parameters",
ERR_CODE_SM_ERR_DHKEY: "dhkey check failed",
ERR_CODE_SM_ERR_NUMCMP: "numeric comparison failed",
ERR_CODE_SM_ERR_ALREADY: "pairing already in progress",
ERR_CODE_SM_ERR_CROSS_TRANS: "cross transport not allowed",
}
// These values never get transmitted or received, so their precise values
// don't matter. We specify them explicitly here to match the blehostd source.
const (
MSG_OP_REQ MsgOp = 0
MSG_OP_RSP = 1
MSG_OP_EVT = 2
)
// These values never get transmitted or received, so their precise values
// don't matter. We specify them explicitly here to match the blehostd source.
const (
MSG_TYPE_ERR MsgType = 1
MSG_TYPE_SYNC = 2
MSG_TYPE_CONNECT = 3
MSG_TYPE_TERMINATE = 4
MSG_TYPE_DISC_ALL_SVCS = 5
MSG_TYPE_DISC_SVC_UUID = 6
MSG_TYPE_DISC_ALL_CHRS = 7
MSG_TYPE_DISC_CHR_UUID = 8
MSG_TYPE_DISC_ALL_DSCS = 9
MSG_TYPE_WRITE = 10
MSG_TYPE_WRITE_CMD = 11
MSG_TYPE_EXCHANGE_MTU = 12
MSG_TYPE_GEN_RAND_ADDR = 13
MSG_TYPE_SET_RAND_ADDR = 14
MSG_TYPE_CONN_CANCEL = 15
MSG_TYPE_SCAN = 16
MSG_TYPE_SCAN_CANCEL = 17
MSG_TYPE_SET_PREFERRED_MTU = 18
MSG_TYPE_SECURITY_INITIATE = 19
MSG_TYPE_CONN_FIND = 20
MSG_TYPE_RESET = 21
MSG_TYPE_ADV_START = 22
MSG_TYPE_ADV_STOP = 23
MSG_TYPE_ADV_SET_DATA = 24
MSG_TYPE_ADV_RSP_SET_DATA = 25
MSG_TYPE_ADV_FIELDS = 26
MSG_TYPE_CLEAR_SVCS = 27
MSG_TYPE_ADD_SVCS = 28
MSG_TYPE_COMMIT_SVCS = 29
MSG_TYPE_ACCESS_STATUS = 30
MSG_TYPE_NOTIFY = 31
MSG_TYPE_FIND_CHR = 32
MSG_TYPE_SM_INJECT_IO = 33
MSG_TYPE_SYNC_EVT = 2049
MSG_TYPE_CONNECT_EVT = 2050
MSG_TYPE_CONN_CANCEL_EVT = 2051
MSG_TYPE_DISCONNECT_EVT = 2052
MSG_TYPE_DISC_SVC_EVT = 2053
MSG_TYPE_DISC_CHR_EVT = 2054
MSG_TYPE_DISC_DSC_EVT = 2055
MSG_TYPE_WRITE_ACK_EVT = 2056
MSG_TYPE_NOTIFY_RX_EVT = 2057
MSG_TYPE_MTU_CHANGE_EVT = 2058
MSG_TYPE_SCAN_EVT = 2059
MSG_TYPE_SCAN_COMPLETE_EVT = 2060
MSG_TYPE_ADV_COMPLETE_EVT = 2061
MSG_TYPE_ENC_CHANGE_EVT = 2062
MSG_TYPE_RESET_EVT = 2063
MSG_TYPE_ACCESS_EVT = 2064
MSG_TYPE_PASSKEY_EVT = 2065
)
var MsgOpStringMap = map[MsgOp]string{
MSG_OP_REQ: "request",
MSG_OP_RSP: "response",
MSG_OP_EVT: "event",
}
var MsgTypeStringMap = map[MsgType]string{
MSG_TYPE_ERR: "error",
MSG_TYPE_SYNC: "sync",
MSG_TYPE_CONNECT: "connect",
MSG_TYPE_TERMINATE: "terminate",
MSG_TYPE_DISC_ALL_SVCS: "disc_all_svcs",
MSG_TYPE_DISC_SVC_UUID: "disc_svc_uuid",
MSG_TYPE_DISC_ALL_CHRS: "disc_all_chrs",
MSG_TYPE_DISC_CHR_UUID: "disc_chr_uuid",
MSG_TYPE_DISC_ALL_DSCS: "disc_all_dscs",
MSG_TYPE_WRITE: "write",
MSG_TYPE_WRITE_CMD: "write_cmd",
MSG_TYPE_EXCHANGE_MTU: "exchange_mtu",
MSG_TYPE_GEN_RAND_ADDR: "gen_rand_addr",
MSG_TYPE_SET_RAND_ADDR: "set_rand_addr",
MSG_TYPE_CONN_CANCEL: "conn_cancel",
MSG_TYPE_SCAN: "scan",
MSG_TYPE_SCAN_CANCEL: "scan_cancel",
MSG_TYPE_SET_PREFERRED_MTU: "set_preferred_mtu",
MSG_TYPE_SECURITY_INITIATE: "security_initiate",
MSG_TYPE_CONN_FIND: "conn_find",
MSG_TYPE_RESET: "reset",
MSG_TYPE_ADV_START: "adv_start",
MSG_TYPE_ADV_STOP: "adv_stop",
MSG_TYPE_ADV_SET_DATA: "adv_set_data",
MSG_TYPE_ADV_RSP_SET_DATA: "adv_rsp_set_data",
MSG_TYPE_ADV_FIELDS: "adv_fields",
MSG_TYPE_CLEAR_SVCS: "clear_svcs",
MSG_TYPE_ADD_SVCS: "add_svcs",
MSG_TYPE_COMMIT_SVCS: "commit_svcs",
MSG_TYPE_ACCESS_STATUS: "access_status",
MSG_TYPE_NOTIFY: "notify",
MSG_TYPE_FIND_CHR: "find_chr",
MSG_TYPE_SM_INJECT_IO: "sm_inject_io",
MSG_TYPE_SYNC_EVT: "sync_evt",
MSG_TYPE_CONNECT_EVT: "connect_evt",
MSG_TYPE_CONN_CANCEL_EVT: "conn_cancel_evt",
MSG_TYPE_DISCONNECT_EVT: "disconnect_evt",
MSG_TYPE_DISC_SVC_EVT: "disc_svc_evt",
MSG_TYPE_DISC_CHR_EVT: "disc_chr_evt",
MSG_TYPE_DISC_DSC_EVT: "disc_dsc_evt",
MSG_TYPE_WRITE_ACK_EVT: "write_ack_evt",
MSG_TYPE_NOTIFY_RX_EVT: "notify_rx_evt",
MSG_TYPE_MTU_CHANGE_EVT: "mtu_change_evt",
MSG_TYPE_SCAN_EVT: "scan_evt",
MSG_TYPE_SCAN_COMPLETE_EVT: "scan_tmo_evt",
MSG_TYPE_ADV_COMPLETE_EVT: "adv_complete_evt",
MSG_TYPE_ENC_CHANGE_EVT: "enc_change_evt",
MSG_TYPE_RESET_EVT: "reset_evt",
MSG_TYPE_ACCESS_EVT: "access_evt",
MSG_TYPE_PASSKEY_EVT: "passkey_evt",
}
type BleHdr struct {
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
}
type Msg interface{}
type BleDiscSvc struct {
StartHandle int `json:"start_handle"`
EndHandle int `json:"end_handle"`
Uuid BleUuid `json:"uuid"`
}
type BleDiscChr struct {
DefHandle int `json:"def_handle"`
ValHandle int `json:"val_handle"`
Properties int `json:"properties"`
Uuid BleUuid `json:"uuid"`
}
type BleDiscDsc struct {
Handle uint16 `json:"handle"`
Uuid BleUuid `json:"uuid"`
}
type BleSyncReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
}
type BleConnectReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
OwnAddrType BleAddrType `json:"own_addr_type"`
PeerAddrType BleAddrType `json:"peer_addr_type"`
PeerAddr BleAddr `json:"peer_addr"`
// Optional
DurationMs int `json:"duration_ms"`
ScanItvl int `json:"scan_itvl"`
ScanWindow int `json:"scan_window"`
ItvlMin int `json:"itvl_min"`
ItvlMax int `json:"itvl_max"`
Latency int `json:"latency"`
SupervisionTimeout int `json:"supervision_timeout"`
MinCeLen int `json:"min_ce_len"`
MaxCeLen int `json:"max_ce_len"`
}
type BleConnectRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleConnectEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
ConnHandle uint16 `json:"conn_handle"`
}
type BleTerminateReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
ConnHandle uint16 `json:"conn_handle"`
HciReason int `json:"hci_reason"`
}
type BleTerminateRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleConnCancelReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
}
type BleConnCancelRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleConnCancelEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
}
type BleDisconnectEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Reason int `json:"reason"`
ConnHandle uint16 `json:"conn_handle"`
}
type BleDiscAllSvcsReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
ConnHandle uint16 `json:"conn_handle"`
}
type BleDiscAllSvcsRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleDiscSvcUuidReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
ConnHandle uint16 `json:"conn_handle"`
Uuid BleUuid `json:"svc_uuid"`
}
type BleDiscSvcUuidRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleDiscSvcEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
Svc BleDiscSvc `json:"service"`
}
type BleDiscAllChrsReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
ConnHandle uint16 `json:"conn_handle"`
StartHandle int `json:"start_handle"`
EndHandle int `json:"end_handle"`
}
type BleDiscAllChrsRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleDiscChrUuidReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
ConnHandle uint16 `json:"conn_handle"`
StartHandle int `json:"start_handle"`
EndHandle int `json:"end_handle"`
Uuid BleUuid `json:"chr_uuid"`
}
type BleDiscChrUuidRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleDiscChrEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
Chr BleDiscChr `json:"characteristic"`
}
type BleDiscAllDscsReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
ConnHandle uint16 `json:"conn_handle"`
StartHandle int `json:"start_handle"`
EndHandle int `json:"end_handle"`
}
type BleDiscAllDscsRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleDiscDscEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
ChrDefHandle uint16 `json:"chr_def_handle"`
Dsc BleDiscDsc `json:"descriptor"`
}
type BleErrRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
Msg string `json:"msg"`
}
type BleSyncRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Synced bool `json:"synced"`
}
type BleWriteReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
ConnHandle uint16 `json:"conn_handle"`
AttrHandle int `json:"attr_handle"`
Data BleBytes `json:"data"`
}
type BleWriteRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleWriteAckEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleWriteCmdReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
ConnHandle uint16 `json:"conn_handle"`
AttrHandle int `json:"attr_handle"`
Data BleBytes `json:"data"`
}
type BleWriteCmdRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleSyncEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Synced bool `json:"synced"`
}
type BleNotifyRxEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
ConnHandle uint16 `json:"conn_handle"`
AttrHandle int `json:"attr_handle"`
Indication bool `json:"indication"`
Data BleBytes `json:"data"`
}
type BleExchangeMtuReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
ConnHandle uint16 `json:"conn_handle"`
}
type BleExchangeMtuRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleMtuChangeEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
ConnHandle uint16 `json:"conn_handle"`
Mtu uint16 `json:"mtu"`
}
type BleGenRandAddrReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Nrpa bool `json:"nrpa"`
}
type BleGenRandAddrRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
Addr BleAddr `json:"addr"`
}
type BleSetRandAddrReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Addr BleAddr `json:"addr"`
}
type BleSetRandAddrRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleScanReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
OwnAddrType BleAddrType `json:"own_addr_type"`
DurationMs int `json:"duration_ms"`
Itvl int `json:"itvl"`
Window int `json:"window"`
FilterPolicy BleScanFilterPolicy `json:"filter_policy"`
Limited bool `json:"limited"`
Passive bool `json:"passive"`
FilterDuplicates bool `json:"filter_duplicates"`
}
type BleScanRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleScanEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
EventType BleAdvEventType `json:"event_type"`
AddrType BleAddrType `json:"addr_type"`
Addr BleAddr `json:"addr"`
Rssi int8 `json:"rssi"`
Data BleBytes `json:"data"`
// Optional
DataFlags *uint8 `json:"data_flags"`
DataUuids16 []BleUuid16 `json:"data_uuids16"`
DataUuids16IsComplete bool `json:"data_uuids16_is_complete"`
DataUuids32 []uint32 `json:"data_uuids32"`
DataUuids32IsComplete bool `json:"data_uuids32_is_complete"`
DataUuids128 []BleUuid128 `json:"data_uuids128"`
DataUuids128IsComplete bool `json:"data_uuids128_is_complete"`
DataName *string `json:"data_name"`
DataNameIsComplete bool `json:"data_name_is_complete"`
DataTxPwrLvl *int8 `json:"data_tx_pwr_lvl"`
DataSlaveItvlMin *uint16 `json:"data_slave_itvl_min"`
DataSlaveItvlMax *uint16 `json:"data_slave_itvl_max"`
DataSvcDataUuid16 BleBytes `json:"data_svc_data_uuid16"`
DataPublicTgtAddrs []BleAddr `json:"data_public_tgt_addrs"`
DataAppearance *uint16 `json:"data_appearance"`
DataAdvItvl *uint16 `json:"data_adv_itvl"`
DataSvcDataUuid32 BleBytes `json:"data_svc_data_uuid32"`
DataSvcDataUuid128 BleBytes `json:"data_svc_data_uuid128"`
DataUri *string `json:"data_uri"`
DataMfgData BleBytes `json:"data_mfg_data"`
}
type BleScanCompleteEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Reason int `json:"reason"`
}
type BleScanCancelReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
}
type BleScanCancelRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleSetPreferredMtuReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Mtu uint16 `json:"mtu"`
}
type BleSetPreferredMtuRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleConnFindReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
ConnHandle uint16 `json:"conn_handle"`
}
type BleConnFindRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
ConnHandle uint16 `json:"conn_handle"`
OwnIdAddrType BleAddrType `json:"own_id_addr_type"`
OwnIdAddr BleAddr `json:"own_id_addr"`
OwnOtaAddrType BleAddrType `json:"own_ota_addr_type"`
OwnOtaAddr BleAddr `json:"own_ota_addr"`
PeerIdAddrType BleAddrType `json:"peer_id_addr_type"`
PeerIdAddr BleAddr `json:"peer_id_addr"`
PeerOtaAddrType BleAddrType `json:"peer_ota_addr_type"`
PeerOtaAddr BleAddr `json:"peer_ota_addr"`
Role BleRole `json:"role"`
Encrypted bool `json:"encrypted"`
Authenticated bool `json:"authenticated"`
Bonded bool `json:"bonded"`
KeySize int `json:"key_size"`
}
type BleResetReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
}
type BleResetRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleSecurityInitiateReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
ConnHandle uint16 `json:"conn_handle"`
}
type BleSecurityInitiateRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleEncChangeEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
ConnHandle uint16 `json:"conn_handle"`
}
type BleAdvStartReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
OwnAddrType BleAddrType `json:"own_addr_type"`
DurationMs int `json:"duration_ms"`
ConnMode BleAdvConnMode `json:"conn_mode"`
DiscMode BleAdvDiscMode `json:"disc_mode"`
ItvlMin uint16 `json:"itvl_min"`
ItvlMax uint16 `json:"itvl_max"`
ChannelMap uint8 `json:"channel_map"`
FilterPolicy BleAdvFilterPolicy `json:"filter_policy"`
HighDutyCycle bool `json:"high_duty_cycle"`
// Only required for direct advertisements
PeerAddr *BleAddr `json:"peer_addr,omitempty"`
}
type BleAdvStartRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleAdvStopReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
}
type BleAdvStopRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleAdvSetDataReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Data BleBytes `json:"data"`
}
type BleAdvSetDataRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleAdvRspSetDataReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Data BleBytes `json:"data"`
}
type BleAdvRspSetDataRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleAdvFieldsReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Optional
Flags *uint8 `json:"flags,omitempty"`
/*** 0x02,0x03 - 16-bit service class UUIDs. */
Uuids16 []BleUuid16 `json:"uuids16,omitempty"`
Uuids16IsComplete bool `json:"uuids16_is_complete"`
/*** 0x04,0x05 - 32-bit service class UUIDs. */
Uuids32 []uint32 `json:"uuids32,omitempty"`
Uuids32IsComplete bool `json:"uuids32_is_complete"`
/*** 0x06,0x07 - 128-bit service class UUIDs. */
Uuids128 []BleUuid128 `json:"uuids128,omitempty"`
Uuids128IsComplete bool `json:"uuids128_is_complete"`
/*** 0x08,0x09 - Local name. */
Name *string `json:"name,omitempty,omitempty"`
NameIsComplete bool `json:"name_is_complete"`
/*** 0x0a - Tx power level. */
TxPwrLvl *int8 `json:"tx_pwr_lvl,omitempty"`
/*** 0x0d - Slave connection interval range. */
SlaveItvlMin *uint16 `json:"slave_itvl_min,omitempty"`
SlaveItvlMax *uint16 `json:"slave_itvl_max,omitempty"`
/*** 0x16 - Service data - 16-bit UUID. */
SvcDataUuid16 BleBytes `json:"svc_data_uuid16,omitempty"`
/*** 0x17 - Public target address. */
PublicTgtAddrs []BleAddr `json:"public_tgt_addrs,omitempty"`
/*** 0x19 - Appearance. */
Appearance *uint16 `json:"appearance,omitempty"`
/*** 0x1a - Advertising interval. */
AdvItvl *uint16 `json:"adv_itvl,omitempty"`
/*** 0x20 - Service data - 32-bit UUID. */
SvcDataUuid32 BleBytes `json:"svc_data_uuid32,omitempty"`
/*** 0x21 - Service data - 128-bit UUID. */
SvcDataUuid128 BleBytes `json:"svc_data_uuid128,omitempty"`
/*** 0x24 - URI. */
Uri *string `json:"uri,omitempty"`
/*** 0xff - Manufacturer specific data. */
MfgData BleBytes `json:"mfg_data,omitempty"`
}
type BleAdvFieldsRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
Data BleBytes `json:"data"`
}
type BleAdvCompleteEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Reason int `json:"reason"`
}
type BleResetEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Reason int `json:"reason"`
}
type BleClearSvcsReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
}
type BleClearSvcsRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleAddDsc struct {
Uuid BleUuid `json:"uuid"`
AttFlags BleAttFlags `json:"att_flags"`
MinKeySize int `json:"min_key_size"`
}
type BleAddChr struct {
Uuid BleUuid `json:"uuid"`
Flags BleChrFlags `json:"flags"`
MinKeySize int `json:"min_key_size"`
Dscs []BleAddDsc `json:"descriptors,omitempty"`
}
type BleAddSvc struct {
Uuid BleUuid `json:"uuid"`
SvcType BleSvcType `json:"type"`
Chrs []BleAddChr `json:"characteristics,omitempty"`
}
type BleAddSvcsReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
Svcs []BleAddSvc `json:"services"`
}
type BleAddSvcsRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleRegDsc struct {
Uuid BleUuid `json:"uuid"`
Handle uint16 `json:"handle"`
}
type BleRegChr struct {
Uuid BleUuid `json:"uuid"`
DefHandle uint16 `json:"def_handle"`
ValHandle uint16 `json:"val_handle"`
Dscs []BleRegDsc `json:"descriptors"`
}
type BleRegSvc struct {
Uuid BleUuid `json:"uuid"`
Handle uint16 `json:"handle"`
Chrs []BleRegChr `json:"characteristics"`
}
type BleCommitSvcsReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
}
type BleCommitSvcsRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
// Optional
Svcs []BleRegSvc `json:"services"`
}
type BleAccessEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
GattOp BleGattOp `json:"gatt_op"`
ConnHandle uint16 `json:"conn_handle"`
AttHandle uint16 `json:"att_handle"`
Data BleBytes `json:"data"`
}
type BleAccessStatusReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
AttStatus uint8 `json:"att_status"`
Data BleBytes `json:"data"`
}
type BleAccessStatusRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleNotifyReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
ConnHandle uint16 `json:"conn_handle"`
AttrHandle uint16 `json:"attr_handle"`
Data BleBytes `json:"data"`
}
type BleNotifyRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BleFindChrReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
SvcUuid BleUuid `json:"svc_uuid"`
ChrUuid BleUuid `json:"chr_uuid"`
}
type BleFindChrRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
DefHandle uint16 `json:"def_handle"`
ValHandle uint16 `json:"val_handle"`
}
type BleSmInjectIoReq struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
ConnHandle uint16 `json:"conn_handle"`
Action BleSmAction `json:"action"`
// Only one field valid depending on the value of `action`.
OobData BleBytes `json:"oob_data"`
Passkey uint32 `json:"passkey"`
NumcmpAccept bool `json:"numcmp_accept"`
}
type BleSmInjectIoRsp struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
Status int `json:"status"`
}
type BlePasskeyEvt struct {
// Header
Op MsgOp `json:"op"`
Type MsgType `json:"type"`
Seq BleSeq `json:"seq"`
// Mandatory
ConnHandle uint16 `json:"conn_handle"`
Action BleSmAction `json:"action"`
// Optional
Numcmp uint32 `json:"numcmp"`
}
func ErrCodeToString(e int) string {
var s string
switch {
case e >= ERR_CODE_SM_PEER_BASE:
case e >= ERR_CODE_SM_US_BASE:
case e >= ERR_CODE_L2C_BASE:
case e >= ERR_CODE_HCI_BASE:
s = HciErrCodeStringMap[e-ERR_CODE_HCI_BASE]
case e >= ERR_CODE_ATT_BASE:
default:
s = ErrCodeStringMap[e]
}
if s == "" {
s = "unknown"
}
return s
}
func ErrCodeToAtt(e int) int {
e -= ERR_CODE_ATT_BASE
if e < 0 || e >= 0x100 {
return -1
}
return e
}
func ErrCodeToHci(e int) int {
e -= ERR_CODE_HCI_BASE
if e < 0 || e >= 0x100 {
return -1
}
return e
}
func ErrCodeToL2c(e int) int {
e -= ERR_CODE_L2C_BASE
if e < 0 || e >= 0x100 {
return -1
}
return e
}
func ErrCodeToSmUs(e int) int {
e -= ERR_CODE_SM_US_BASE
if e < 0 || e >= 0x100 {
return -1
}
return e
}
func ErrCodeToSmPeer(e int) int {
e -= ERR_CODE_SM_PEER_BASE
if e < 0 || e >= 0x100 {
return -1
}
return e
}
func MsgOpToString(op MsgOp) string {
s := MsgOpStringMap[op]
if s == "" {
return "???"
}
return s
}
func MsgOpFromString(s string) (MsgOp, error) {
for op, name := range MsgOpStringMap {
if s == name {
return op, nil
}
}
return MsgOp(0), errors.New("Invalid MsgOp string: " + s)
}
func MsgTypeToString(msgType MsgType) string {
s := MsgTypeStringMap[msgType]
if s == "" {
return "???"
}
return s
}
func MsgTypeFromString(s string) (MsgType, error) {
for addrType, name := range MsgTypeStringMap {
if s == name {
return addrType, nil
}
}
return MsgType(0), errors.New("Invalid MsgType string: " + s)
}
func (o MsgOp) MarshalJSON() ([]byte, error) {
return json.Marshal(MsgOpToString(o))
}
func (o *MsgOp) UnmarshalJSON(data []byte) error {
var err error
var s string
if err := json.Unmarshal(data, &s); err != nil {
return err
}
*o, err = MsgOpFromString(s)
return err
}
func (t MsgType) MarshalJSON() ([]byte, error) {
return json.Marshal(MsgTypeToString(t))
}
func (t *MsgType) UnmarshalJSON(data []byte) error {
var err error
var s string
if err := json.Unmarshal(data, &s); err != nil {
return err
}
*t, err = MsgTypeFromString(s)
return err
}
func (bb *BleBytes) MarshalJSON() ([]byte, error) {
var buf bytes.Buffer
buf.Grow(len(bb.Bytes) * 5)
for i, b := range bb.Bytes {
if i != 0 {
buf.WriteString(":")
}
fmt.Fprintf(&buf, "0x%02x", b)
}
s := buf.String()
return json.Marshal(s)
return buf.Bytes(), nil
}
func (bb *BleBytes) UnmarshalJSON(data []byte) error {
var s string
if err := json.Unmarshal(data, &s); err != nil {
return err
}
// strings.Split() appears to return { nil } when passed an empty string.
if len(s) == 0 {
return nil
}
toks := strings.Split(strings.ToLower(s), ":")
bb.Bytes = make([]byte, len(toks))
for i, t := range toks {
if !strings.HasPrefix(t, "0x") {
return fmt.Errorf(
"Byte stream contains invalid token; token=%s stream=%s", t, s)
}
u64, err := strconv.ParseUint(t, 0, 8)
if err != nil {
return err
}
bb.Bytes[i] = byte(u64)
}
return nil
}