nmxact/nmble/ble_proto.go (1,196 lines of code) (raw):

/** * 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 }