• 使用golang开发mqtt服务压力测试工具 清明


    package main
    
    import (
        "flag"
        "fmt"
        "sync"
        "time"
        //导入mqtt包
        MQTT "github.com/eclipse/paho.mqtt.golang"
    )
    
    var f MQTT.MessageHandler = func(client MQTT.Client, msg MQTT.Message) {
        fmt.Printf("TOPIC: %s\n", msg.Topic())
        fmt.Printf("MSG: %s\n", msg.Payload())
    }
    var fail_nums int = 0
    
    func main() {
        //生成连接的客户端数
        c := flag.Uint64("n", 3000, "client nums")
        flag.Parse()
        nums := int(*c)
        wg := sync.WaitGroup{}
        for i := 0; i < nums; i++ {
            wg.Add(1)
            time.Sleep(5 * time.Millisecond)
            go createTask(i, &wg)
        }
        wg.Wait()
    }
    
    func createTask(taskId int, wg *sync.WaitGroup) {
        defer wg.Done()
        opts := MQTT.NewClientOptions().AddBroker("tcp://192.168.1.110:1883").SetUsername("test").SetPassword("test")
        opts.SetClientID(fmt.Sprintf("go-simple-client:%d-%d", taskId, time.Now().Unix()))
        opts.SetDefaultPublishHandler(f)
        opts.SetConnectTimeout(time.Duration(60) * time.Second)
    
        //创建连接
        c := MQTT.NewClient(opts)
    
        if token := c.Connect(); token.WaitTimeout(time.Duration(60)*time.Second) && token.Wait() && token.Error() != nil {
            fail_nums++
            fmt.Printf("taskId:%d,fail_nums:%d,error:%s \n", taskId, fail_nums, token.Error())
            return
        }
    
        //每隔5秒向topic发送一条消息
        i := 0
        for {
            i++
            time.Sleep(time.Duration(5) * time.Second)
            text := fmt.Sprintf("this is msg #%d! from task:%d", i, taskId)
            token := c.Publish("test", 1, false, text)
            token.Wait()
        }
    
        c.Disconnect(250)
        fmt.Println("task ok!!")
    }
    

      

    package main
    
    import (
    	"bytes"
    	"crypto/rand"
    	"crypto/tls"
    	"encoding/json"
    	"flag"
    	"fmt"
    	"math/big"
    	"sync"
    	"time"
    
    	MQTT "github.com/eclipse/paho.mqtt.golang"
    )
    
    type Device struct {
    	ID                  int     `json:"id"`
    	Mac                 string  `json:"mac"`
    	Name                string  `json:"name"`
    	ProductType         string  `json:"product_type"`
    	Lang                string  `json:"lang"`
    	IP                  string  `json:"ip"`
    	IP2                 string  `json:"ip2"`
    	Gateway             string  `json:"gateway"`
    	Gateway2            string  `json:"gateway2"`
    	Netmask             string  `json:"netmask"`
    	Netmask2            string  `json:"netmask2"`
    	Inet                string  `json:"inet"`
    	AreaID              int     `json:"area_id"`
    	State               int     `json:"state"`
    	RestartTime         string  `json:"restart_time"`
    	LiveDetection       int     `json:"live_detection"`
    	FeverHigh           float32 `json:"fever_high"`
    	FeverLow            float32 `json:"fever_low"`
    	TempAdd             float32 `json:"temp_add"`
    	FaceRecThred        float32 `json:"face_rec_thred"`
    	FaceMinThred        float32 `json:"half_face_rec_thred"`
    	GateIsOpen          int     `json:"gate_is_open"`
    	GateOpenType        int     `json:"gate_open_type"`
    	GateOpenDur         int     `json:"gate_open_dur"`
    	GateOpenCondition   int     `json:"gate_open_condition"`
    	IoType              int     `json:"io_type"`
    	IDThred             float32 `json:"id_thred"`
    	VisitorGateOpenType int     `json:"visitor_gate_open_type"`
    	VisitorCardNo       string  `json:"visitor_card_no"`
    	Volume              int     `json:"volume"`
    	ScreenOff           int     `json:"screen_off"`
    	ScreenFillLight     int     `json:"screen_fill_light"`
    	SuccessMsg          string  `json:"success_msg"`
    	FailMsg             string  `json:"fail_msg"`
    	Version             string  `json:"version"`
    	LogSnap             int     `json:"log_snap"`
    	SyncPeriod          int     `json:"sync_period"`
    	FlowKeep            int     `json:"flow_keep"`
    	LastConnect         string  `json:"last_connect"`
    	LastModify          string  `json:"last_modify"`
    	CreateTime          string  `json:"create_time"`
    	Online              bool    `json:"online"`
    	GateVoltage         int     `json:"gate_voltage"`
    	GateAlarm           int     `json:"gate_alarm"`
    	GateAlarmSec        int     `json:"gate_alarm_sec"`
    	Brightness          int     `json:"brightness"`
    	AutoBacklightCom    int     `json:"auto_backlight_com"`
    	AudioUpload         string  `json:"audio_upload"`
    	OSVersion           string  `json:"os_version"`
    	APKversion          string  `json:"apk_version"`
    	MyVersion           string  `json:"funpacs_version"`
    }
    
    type DeviceState struct {
    	CPU        float32 `json:"CPU"`
    	CPUTemp    float32 `json:"CPUTemp"`
    	Memory     int64   `json:"Memory"`
    	Runtime    int64   `json:"runtime"`
    	APK        int     `json:"APK"`
    	APKRuntime int64   `json:"APKRuntime"`
    	NPU        bool    `json:"NPU"`
    }
    
    type MqttMsg struct {
    	Mac         string      `json:"mac"`
    	Cate        string      `json:"cate"`
    	SubCate     int         `json:"subCate"`
    	Cmd         string      `json:"cmd"`
    	SN          uint64      `json:"SN"`
    	Time        int64       `json:"time"`
    	DeviceData  Device      `json:"deviceData"`
    	DeviceState DeviceState `json:"deviceState"`
    }
    
    var f MQTT.MessageHandler = func(client MQTT.Client, msg MQTT.Message) {
    	fmt.Printf("TOPIC: %s\n", msg.Topic())
    	fmt.Printf("MSG: %s\n", msg.Payload())
    }
    
    func CreateRandomString(len int) string {
    	var container string
    	var str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
    	b := bytes.NewBufferString(str)
    	length := b.Len()
    	bigInt := big.NewInt(int64(length))
    	for i := 0; i < len; i++ {
    		randomInt, _ := rand.Int(rand.Reader, bigInt)
    		container += string(str[randomInt.Int64()])
    	}
    	return container
    }
    
    var fail_nums int = 0
    var gMyDevice Device
    
    func main() {
    	fmt.Println("PACS test start")
    
    	//生成连接的客户端数
    	c := flag.Uint64("n", 1, "client nums")
    	flag.Parse()
    	nums := int(*c)
    
    	fmt.Println("Client number: ", nums)
    
    	wg := sync.WaitGroup{}
    	for i := 0; i < nums; i++ {
    		wg.Add(1)
    		time.Sleep(5 * time.Millisecond)
    		go createTask(i, &wg)
    	}
    	wg.Wait()
    }
    
    func createTask(taskId int, wg *sync.WaitGroup) {
    	defer wg.Done()
    	opts := MQTT.NewClientOptions().AddBroker("tls://192.168.6.123:8883").SetUsername("superpacsmqtt").SetPassword("mqttpacssuper")
    	opts.SetClientID(fmt.Sprintf("pacs-test-client:%d-%d", taskId, time.Now().Unix()))
    	opts.SetTLSConfig(&tls.Config{InsecureSkipVerify: true})
    	opts.SetDefaultPublishHandler(f)
    	opts.SetConnectTimeout(time.Duration(60) * time.Second)
    
    	//创建连接
    	c := MQTT.NewClient(opts)
    
    	if token := c.Connect(); token.WaitTimeout(time.Duration(60)*time.Second) && token.Wait() && token.Error() != nil {
    		fail_nums++
    		fmt.Printf("taskId:%d,fail_nums:%d,error:%s \n", taskId, fail_nums, token.Error())
    		return
    	}
    
    	gServerRunTime := time.Now().Unix()
    	//mac := "TEST" + strconv.Itoa(taskId)
    	mac := "TEST" + CreateRandomString(8)
    
    	topic := "hub/funpacs/u/" + mac
    
    	gMyDevice.ID = taskId
    	gMyDevice.Mac = mac
    	gMyDevice.Name = mac
    	gMyDevice.ProductType = "MS-5738"
    	gMyDevice.Lang = "en"
    	gMyDevice.State = 1
    	gMyDevice.MyVersion = "1.0.68"
    
    	data := MqttMsg{SN: 1, Time: time.Now().Unix(), Mac: mac, Cate: "status", Cmd: "deviceData", DeviceData: gMyDevice}
    	jsDat, _ := json.Marshal(&data)
    	msg := string(jsDat)
    	fmt.Println(msg)
    	c.Publish(topic, 1, false, msg)
    
    	//每隔5秒向topic发送一条消息
    	i := 0
    	for {
    		i++
    		time.Sleep(time.Duration(5) * time.Second)
    
    		runtime := time.Now().Unix() - gServerRunTime
    		ds := DeviceState{Runtime: runtime, APK: i}
    
    		sdata := MqttMsg{SN: 1, Time: time.Now().Unix(), Mac: mac, Cate: "status", Cmd: "deviceStat", DeviceState: ds}
    		jsDat, _ := json.Marshal(&sdata)
    		msg := string(jsDat)
    		fmt.Println(msg)
    		token := c.Publish(topic, 1, false, msg)
    		token.Wait()
    	}
    
    }
    

      

  • 相关阅读:
    Hackers' Crackdown UVA
    Sequence II HDU
    To the moon HDU
    Dynamic Rankings ZOJ
    google vimium插件的一些简单命令
    关于datatable转换datatime类型的问题
    服务器无法播放flv格式的视频解决办法
    DTCMS 新建下拉列表控件
    ajax 返回数据 无法得到其属性的解决办法
    关于IIS中WEB网站访问弹“验证输入框”及“401限制访问”的解决办法
  • 原文地址:https://www.cnblogs.com/saryli/p/15543616.html
Copyright © 2020-2023  润新知