// NewServer returns an ATT (Attribute Protocol) server. func NewServer(db *DB, l2c ble.Conn) (*Server, error) { mtu := l2c.RxMTU() if mtu < ble.DefaultMTU || mtu > ble.MaxMTU { return nil, fmt.Errorf("invalid MTU") } // Although the rxBuf is initialized with the capacity of rxMTU, it is // not discovered, and only the default ATT_MTU (23 bytes) of it shall // be used until remote central request ExchangeMTU. s := &Server{ conn: &conn{ Conn: l2c, cccs: make(map[uint16]uint16), in: make(map[uint16]ble.Notifier), nn: make(map[uint16]ble.Notifier), }, db: db, rxMTU: mtu, txBuf: make([]byte, ble.DefaultMTU, ble.DefaultMTU), chNotBuf: make(chan []byte, 1), chIndBuf: make(chan []byte, 1), chConfirm: make(chan bool), dummyRspWriter: ble.NewResponseWriter(nil), } s.conn.svr = s s.chNotBuf <- make([]byte, ble.DefaultMTU, ble.DefaultMTU) s.chIndBuf <- make([]byte, ble.DefaultMTU, ble.DefaultMTU) return s, nil }
// NewClient returns an Attribute Protocol Client. func NewClient(l2c ble.Conn, h NotificationHandler) *Client { c := &Client{ l2c: l2c, rspc: make(chan []byte), chTxBuf: make(chan []byte, 1), rxBuf: make([]byte, ble.MaxMTU), chErr: make(chan error, 1), handler: h, } c.chTxBuf <- make([]byte, l2c.TxMTU(), l2c.TxMTU()) return c }
// NewClient ... func NewClient(c ble.Conn) (*Client, error) { return &Client{ conn: c.(*conn), id: xpc.MakeUUID(c.RemoteAddr().String()), }, nil }