code: func (s *Server) indicate(h uint16, data []byte) (int, error) {
  	// Acquire and reuse indicateBuffer. Release it after usage.
  	iBuf := <-s.chIndBuf
  	defer func() { s.chIndBuf <- iBuf }()
  
  	rsp := HandleValueIndication(iBuf)
  	rsp.SetAttributeOpcode()
  	rsp.SetAttributeHandle(h)
  	buf := bytes.NewBuffer(rsp.AttributeValue())
  	buf.Reset()
  	if len(data) > buf.Cap() {
  		data = data[:buf.Cap()]
  	}
  	buf.Write(data)
  	n, err := s.conn.Write(rsp[:3+buf.Len()])
  	if err != nil {
  		return n, err
  	}
  	select {
  	case _, ok := <-s.chConfirm:
  		if !ok {
  			return 0, io.ErrClosedPipe
  		}
  		return n, nil
  	case <-time.After(time.Second * 30):
  		return 0, ErrSeqProtoTimeout
  	}
  }
docs: // indicate sends indication to remote central.