package main import ( "flag" "fmt" "os" "os/signal" "syscall" "time" "git.asio.asia/nixevol/NixMsg/test/load" ) func main() { httpBase := flag.String("http", "", "服务 HTTP 根(WebSocket /mqtt 与管理/注册接口),如 http://127.0.0.1:12345") adminHTTP := flag.String("admin-http", "", "管理接口根;默认与 -http 相同") tcp := flag.String("tcp", "", "裸 MQTT TCP host:port;非空则 MQTT 走 TCP,HTTP 仍用于开通端") n := flag.Int("n", 50, "在线连接数") rate := flag.Float64("rate", 20, "单聊提交每秒条数") duration := flag.Duration("duration", time.Minute, "单聊持续时长;0 表示跳过单聊") hold := flag.Duration("hold", 0, "连上后先保持这么久再跑收发") groupSize := flag.Int("group-size", -1, "群发成员数;默认与 -n 相同,0 表示跳过群发") prefix := flag.String("prefix", "qb", "端编号前缀(小写)") password := flag.String("password", "password1234", "端登录密码") adminUser := flag.String("admin-user", "admin", "管理员用户名") adminPass := flag.String("admin-pass", "", "管理员密码(批量开通)") adminToken := flag.String("admin-token", "", "管理 API 令牌,与密码二选一") regCode := flag.String("register-code", "", "自助注册安全码(不走管理开通时使用)") reuse := flag.Bool("reuse", false, "编号已存在则跳过开通/注册") scenario := flag.String("scenario", "all", "hold | dm | group | all") flag.Parse() if *httpBase == "" && *tcp == "" { fmt.Fprintln(os.Stderr, "usage: mqttbench -http http://host:port [options]") flag.PrintDefaults() os.Exit(2) } gs := *groupSize if gs < 0 { gs = *n } cfg := load.Config{ HTTPBase: *httpBase, AdminHTTP: *adminHTTP, TCPAddr: *tcp, AdminUser: *adminUser, AdminPass: *adminPass, APIToken: *adminToken, RegisterCode: *regCode, Reuse: *reuse, Password: *password, Prefix: *prefix, N: *n, Rate: *rate, Duration: *duration, Hold: *hold, GroupSize: gs, Scenario: *scenario, } stop := make(chan os.Signal, 1) signal.Notify(stop, os.Interrupt, syscall.SIGTERM) done := make(chan struct{}) var runErr error var report *load.Report go func() { defer close(done) report, runErr = load.Run(cfg) }() select { case <-done: case <-stop: fmt.Fprintln(os.Stderr, "interrupted") os.Exit(130) } if runErr != nil { fmt.Fprintln(os.Stderr, runErr) os.Exit(1) } fmt.Print(report.Format()) }