code: func (c *Client) Read(handle uint16) ([]byte, error) {
  
  	// Acquire and reuse the txBuf, and release it after usage.
  	txBuf := <-c.chTxBuf
  	defer func() { c.chTxBuf <- txBuf }()
  
  	req := ReadRequest(txBuf[:3])
  	req.SetAttributeOpcode()
  	req.SetAttributeHandle(handle)
  
  	b, err := c.sendReq(req)
  	if err != nil {
  		return nil, err
  	}
  
  	// Convert and validate the response.
  	rsp := ReadResponse(b)
  	switch {
  	case rsp[0] == ErrorResponseCode && len(rsp) == 5:
  		return nil, ble.ATTError(rsp[4])
  	case rsp[0] == ErrorResponseCode && len(rsp) != 5:
  		fallthrough
  	case rsp[0] != rsp.AttributeOpcode():
  		fallthrough
  	case len(rsp) < 1:
  		return nil, ErrInvalidResponse
  	}
  	return rsp.AttributeValue(), nil
  }
docs: // Read requests the server to read the value of an attribute and return its
  // value in a Read Response. [Vol 3, Part F, 3.4.4.3 & 3.4.4.4]