Browse Source

添加两个子包

gaoyagang 1 year ago
parent
commit
56d77c7a66
14 changed files with 623 additions and 16 deletions
  1. 11 1
      go.mod
  2. 93 0
      go.sum
  3. 221 0
      identify/single.go
  4. 11 0
      identify/single_test.go
  5. 35 0
      identify/types.go
  6. 6 0
      identify/vars.go
  7. 6 10
      meta.html
  8. 50 0
      rabbitMQ/consumer.go
  9. 64 0
      rabbitMQ/consumer_test.go
  10. 51 0
      rabbitMQ/producter.go
  11. 27 0
      rabbitMQ/producter_test.go
  12. 14 0
      rabbitMQ/rabbitmq.go
  13. 30 0
      rabbitMQ/vars.go
  14. 4 5
      readme.md

+ 11 - 1
go.mod

@@ -1,3 +1,13 @@
 module gtlib.local/gaoyagang/gt-common
 
-go 1.19
+go 1.17
+
+require (
+	github.com/go-redis/redis/v8 v8.11.5
+	github.com/streadway/amqp v1.1.0
+)
+
+require (
+	github.com/cespare/xxhash/v2 v2.1.2 // indirect
+	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
+)

+ 93 - 0
go.sum

@@ -1,15 +1,108 @@
 github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
 github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
 github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
+github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
+github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
 github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
+github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
+github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
+github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
 github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
+github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/streadway/amqp v1.1.0 h1:py12iX8XSyI7aN/3dUT8DFIDJazNJsVJdxNVEpnQTZM=
+github.com/streadway/amqp v1.1.0/go.mod h1:WYSrTEYHOXHd0nwFeUXAe2G2hRnQT+deZJJf88uS9Bg=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0=
+golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=

+ 221 - 0
identify/single.go

@@ -0,0 +1,221 @@
+package identify
+
+import (
+	"encoding/json"
+	"strconv"
+	"strings"
+)
+
+// SingleItem Nv和Ov的组合规则:
+// 1. Nv是什么 || Nv不是什么
+// 2. Ov是什么 || Ov不是什么
+//
+// 1与2的布尔运行结果交叉后, 得到4种组合 00, 01, 10, 11.
+// 一个事件的判断, 就处在[00, 01, 10, 11]的其中, 有一项为nil, 则表示该项直接通过
+// 多个事件, 就判断多个[00, 01, 10, 11], 所以得出以下结论:
+// 针对设备配置如下规则:
+//
+//	{
+//			"EventName 1": {
+//	          "NvIn": [1,2,3,4],
+//	          "NvNotIn": [5,6,7,8],
+//	          "OvIn": [1,2,3,4],
+//			  "OvNotIn": [5,6,7,8],
+//			},
+//			"EventName 2": {
+//	          "NvIn": [1,2,3,4],
+//	          "NvNotIn": [5,6,7,8],
+//			  "OvNotIn": [5,6,7,8],
+//			},
+//	     ......
+//	}
+type SingleItem struct {
+	nv string // 当前值
+	ov string // 上一次的值
+
+	rules map[string]Rule
+}
+
+func (s *SingleItem) Check(ov, nv string) string {
+	defer func() {
+		s.nv = ""
+		s.ov = ""
+	}()
+	s.nv = nv
+	s.ov = ov
+	for event, rule := range s.rules {
+		if s.check(rule) {
+			return event
+		}
+	}
+	return ""
+}
+
+func (s *SingleItem) check(rule Rule) bool {
+	var ovIn, ovNotIn, nvIn, nvNotIn = true, true, true, true
+	if rule.OvIn != nil {
+		ovIn = s.ovIn(rule.OvIn)
+	}
+
+	if rule.OvNotIn != nil {
+		ovNotIn = s.ovNotIn(rule.OvNotIn)
+	}
+
+	if rule.NvIn != nil {
+		nvIn = s.nvIn(rule.NvIn)
+	}
+
+	if rule.NvNotIn != nil {
+		nvNotIn = s.nvNotIn(rule.NvNotIn)
+	}
+
+	return ovIn && ovNotIn && nvIn && nvNotIn
+}
+
+func (s *SingleItem) ovIn(slice []string) bool {
+	b := true
+	if slice != nil && s.inSlice(slice, s.ov) == false {
+		b = false
+	}
+	return b
+}
+
+func (s *SingleItem) ovNotIn(slice []string) bool {
+	b := true
+	if slice != nil && s.inSlice(slice, s.ov) == true {
+		b = false
+	}
+	return b
+}
+
+func (s *SingleItem) nvIn(slice []string) bool {
+	b := true
+	if slice != nil && s.inSlice(slice, s.nv) == false {
+		b = false
+	}
+	return b
+}
+
+func (s *SingleItem) nvNotIn(slice []string) bool {
+	b := true
+	if slice != nil && s.inSlice(slice, s.nv) == true {
+		b = false
+	}
+	return b
+}
+
+func (s *SingleItem) inSlice(slice []string, v string) bool {
+	for _, s2 := range slice {
+		s1 := s.transVar(s2)
+
+		if s1 == v {
+			return true
+		}
+		// 数字比较
+		if _, err := strconv.ParseInt(s1, 10, 64); err != nil {
+			return s.compare(s1, v)
+		}
+	}
+	return false
+}
+
+func (s *SingleItem) transVar(v string) string {
+	if v == VAR_NV {
+		v = s.nv
+	}
+
+	if v == VAR_OV {
+		v = s.ov
+	}
+	return v
+}
+
+func (s *SingleItem) compare(r string, v string) bool {
+	if strings.Index(r, "...") > -1 {
+		return s.compareRange(r, v)
+	} else if strings.Index(r, " ") > 1 {
+		return s.compareLogic(r, v)
+	}
+
+	return false
+}
+
+func (s *SingleItem) compareRange(r string, v string) bool {
+	rl := strings.Split(r, "...")
+	if len(rl) != 2 {
+		return false
+	}
+
+	var min, max, vi int64 = 0, 0, 0
+	if tmin, err := strconv.ParseInt(strings.TrimSpace(rl[0]), 10, 64); err == nil {
+		min = tmin
+	} else {
+		return false
+	}
+
+	if tmax, err := strconv.ParseInt(strings.TrimSpace(rl[1]), 10, 64); err == nil {
+		max = tmax
+	} else {
+		return false
+	}
+
+	if tvi, err := strconv.ParseInt(strings.TrimSpace(v), 10, 64); err == nil {
+		vi = tvi
+	} else {
+		return false
+	}
+
+	return min <= vi && vi <= max
+}
+
+func (s *SingleItem) compareLogic(r string, v string) bool {
+	rl := strings.Split(r, " ")
+	if len(rl) != 2 {
+		return false
+	}
+
+	var ri, vi int64 = 0, 0
+	if tri, err := strconv.ParseInt(strings.TrimSpace(rl[1]), 10, 64); err == nil {
+		ri = tri
+	} else {
+		return false
+	}
+
+	if tvi, err := strconv.ParseInt(strings.TrimSpace(v), 10, 64); err == nil {
+		vi = tvi
+	} else {
+		return false
+	}
+
+	switch rl[0] {
+	case "<":
+		return vi < ri
+	case "<=":
+		return vi <= ri
+	case ">":
+		return vi > ri
+	case ">=":
+		return vi >= ri
+	case "!=":
+		return vi != ri
+	}
+
+	return false
+}
+
+// NewSingleCheck 生成一个检测对象, 之后调用Check来获得事件名称
+func NewSingleCheck(rules map[string]Rule) *SingleItem {
+	return &SingleItem{
+		rules: rules,
+	}
+}
+
+func StepTest(ov, nv, ruleString string) string {
+	rules := make(map[string]Rule)
+	err := json.Unmarshal([]byte(ruleString), &rules)
+	if err != nil {
+		println(err.Error())
+	}
+
+	return NewSingleCheck(rules).Check(ov, nv)
+}

+ 11 - 0
identify/single_test.go

@@ -0,0 +1,11 @@
+package identify
+
+import "testing"
+
+func TestStepTest(t *testing.T) {
+	// 只要值发生改变就触发  旧值的可选范围中, 不包含新值
+	// 适合液位变化, 开关量, 敏感数据监控
+	rule := `{"xxx":{"OvNotIn":["$nv"]}}`
+	x := StepTest("5", "6", rule)
+	t.Log(x)
+}

+ 35 - 0
identify/types.go

@@ -0,0 +1,35 @@
+package identify
+
+import (
+	"database/sql/driver"
+	"encoding/json"
+)
+
+type Rule struct {
+	NvIn    []string `json:"NvIn"`
+	NvNotIn []string `json:"NvNotIn"`
+	OvIn    []string `json:"OvIn"`
+	OvNotIn []string `json:"OvNotIn"`
+}
+
+type MultiRule []Rule
+
+// Scan 实现方法
+func (d *MultiRule) Scan(input interface{}) error {
+	_ = json.Unmarshal(input.([]byte), &d)
+	return nil
+}
+
+func (d MultiRule) Value() (driver.Value, error) {
+	return json.Marshal(d)
+}
+
+// Scan 实现方法
+func (d *Rule) Scan(input interface{}) error {
+	_ = json.Unmarshal(input.([]byte), &d)
+	return nil
+}
+
+func (d Rule) Value() (driver.Value, error) {
+	return json.Marshal(d)
+}

+ 6 - 0
identify/vars.go

@@ -0,0 +1,6 @@
+package identify
+
+const (
+	VAR_NV = "$nv"
+	VAR_OV = "$ov"
+)

+ 6 - 10
meta.html

@@ -1,10 +1,6 @@
-<!doctype html>
-<html>
-<head>
-    <meta name="go-import" content="gtlib.local/gaoyagang/gt-common git http://120.55.44.4:10080/gaoyagang/gt-common.git">
-    <meta name="go-source" content="gtlib.local/gaoyagang/gt-common _ http://120.55.44.4:10080/gaoyagang/gt-common/src/master{/dir} http://120.55.44.4:10080/gaoyagang/gt-common/src/master{/dir}/{file}#L{line}">
-</head>
-<body>
-go get --insecure gtlib.local/gaoyagang/gt-common.git
-</body>
-</html>
+<!doctype html><html><head><meta name="go-import" content="gtlib.local/gaoyagang/gt-common git http://120.55.44.4:10080/gaoyagang/gt-common.git"><meta name="go-source" content="gtlib.local/gaoyagang/gt-common _ http://120.55.44.4:10080/gaoyagang/gt-common/src/master{/dir} http://120.55.44.4:10080/gaoyagang/gt-common/src/master{/dir}/{file}#L{line}"></head><body>go get --insecure gtlib.local/gaoyagang/gt-common.git</body></html>
+
+
+if ($args ~* "^go-get=1") {
+    return 200
+}

+ 50 - 0
rabbitMQ/consumer.go

@@ -0,0 +1,50 @@
+package rabbitMQ
+
+import "github.com/streadway/amqp"
+
+func NewConsumer(exchange Exchange) (*Consumer, error) {
+	conn, err := NewConnect(exchange.Dns)
+	if err != nil {
+		return nil, err
+	}
+
+	channel, err := conn.Channel()
+	if err != nil {
+		return nil, err
+	}
+
+	consumer := &Consumer{
+		conn:    conn,
+		channel: channel,
+	}
+
+	return consumer, nil
+}
+
+func (c *Consumer) Subscribe(queueName string) (<-chan amqp.Delivery, error) {
+	return c.channel.Consume(queueName, "", true, false, false, false, nil)
+}
+
+func (c *Consumer) Handler(queueName string, handler func(body []byte) error) error {
+	ch, err := c.channel.Consume(queueName, "", true, false, false, false, nil)
+	if err != nil {
+		return err
+	}
+
+	for delivery := range ch {
+		delivery := delivery
+		go func() {
+			err := handler(delivery.Body)
+			if err != nil {
+				println(err.Error())
+				//return c.channel.Ack()
+			}
+		}()
+	}
+	return nil
+}
+
+func (c *Consumer) Close() {
+	c.channel.Close()
+	c.conn.Close()
+}

+ 64 - 0
rabbitMQ/consumer_test.go

@@ -0,0 +1,64 @@
+package rabbitMQ
+
+import (
+	"testing"
+	"time"
+)
+
+func TestNewProducter1(t *testing.T) {
+	exchange := Exchange{
+		Name:      "gt.dc.event",
+		Type:      "fanout", // 广播
+		QueueName: "step_change",
+		Key:       "UF-4001A",
+		Dns:       "amqp://admin:devmq*1120@47.96.12.136:5672/",
+	}
+
+	got, err := NewProducter(exchange)
+
+	t.Log(got, err)
+	for {
+		send := got.Publisher("step_change", []byte(`{"device_code":"UF_4001A"}`))
+
+		_ = got.Publisher("step_change", []byte(`{"device_code":"UF_4001B"}`))
+
+		_ = got.Publisher("step_change_a", []byte(`{"device_code":"UF_4001C"}`))
+		_ = got.Publisher("step_change_b", []byte(`{"device_code":"UF_4001D"}`))
+
+		t.Log(send)
+
+		time.Sleep(2 * time.Second)
+	}
+
+	if got != nil {
+		got.Close()
+	}
+}
+
+func TestConsumer_Subscribe(t *testing.T) {
+	exchange := Exchange{
+		Name:      "gt.dc.event",
+		Type:      "fanout", // 广播
+		QueueName: "step_change",
+		Key:       "UF-4001A",
+		Dns:       "amqp://admin:devmq*1120@47.96.12.136:5672/",
+	}
+	c, _ := NewConsumer(exchange)
+
+	go TestNewProducter1(t)
+
+	go c.Handler("step_change", func(body []byte) error {
+		t.Logf("new message from  A step_change: %s", body)
+		return nil
+	})
+
+	go c.Handler("step_change", func(body []byte) error {
+		t.Logf("new message from B step_change: %s", body)
+		return nil
+	})
+
+	c.Handler("step_change_b", func(body []byte) error {
+		t.Logf("new message from step_change_b: %s", body)
+		return nil
+	})
+}

+ 51 - 0
rabbitMQ/producter.go

@@ -0,0 +1,51 @@
+package rabbitMQ
+
+import (
+	"github.com/streadway/amqp"
+	"time"
+)
+
+func NewProducter(exchange Exchange) (*Producter, error) {
+	conn, err := NewConnect(exchange.Dns)
+	if err != nil {
+		return nil, err
+	}
+
+	channel, err := conn.Channel()
+	if err != nil {
+		_ = conn.Close()
+		return nil, err
+	}
+
+	producter := &Producter{
+		conn:     conn,
+		channel:  channel,
+		Exchange: exchange,
+	}
+
+	_ = producter.channel.ExchangeDeclare(producter.Exchange.Name, producter.Exchange.Type, true, false, false, false, nil)
+
+	return producter, nil
+}
+
+// Publisher 发布
+func (p *Producter) Publisher(queueName string, msg []byte) error {
+	_, _ = p.channel.QueueDeclare(queueName, true, false, false, false, nil)
+	return p.channel.Publish("", queueName, false, false, amqp.Publishing{
+		ContentType:  "text/plain",
+		DeliveryMode: 2,
+		Timestamp:    time.Now(),
+		Body:         msg,
+	})
+}
+
+// DelayPublisher 延时发布
+func (p *Producter) DelayPublisher() error {
+
+	return nil
+}
+
+func (p *Producter) Close() {
+	p.channel.Close()
+	p.conn.Close()
+}

+ 27 - 0
rabbitMQ/producter_test.go

@@ -0,0 +1,27 @@
+package rabbitMQ
+
+import (
+	"testing"
+)
+
+func TestNewProducter(t *testing.T) {
+	exchange := Exchange{
+		Name:      "gt.dc.event",
+		Type:      "fanout", // 广播
+		QueueName: "step_change",
+		Key:       "UF-4001A",
+		Dns:       "amqp://admin:devmq*1120@47.96.12.136:5672/",
+	}
+
+	got, err := NewProducter(exchange)
+
+	t.Log(got, err)
+
+	send := got.Publisher("step_change", []byte(`{"device_code":"UF_4001A"}`))
+
+	t.Log(send)
+
+	if got != nil {
+		got.Close()
+	}
+}

+ 14 - 0
rabbitMQ/rabbitmq.go

@@ -0,0 +1,14 @@
+package rabbitMQ
+
+import (
+	"github.com/streadway/amqp"
+)
+
+func NewConnect(url string) (*amqp.Connection, error) {
+	conn, err := amqp.Dial(url)
+	if err != nil {
+		println("new rabbitMQ connect error: ", err.Error())
+	}
+
+	return conn, err
+}

+ 30 - 0
rabbitMQ/vars.go

@@ -0,0 +1,30 @@
+package rabbitMQ
+
+import "github.com/streadway/amqp"
+
+type (
+	Exchange struct {
+		Name      string // 交换机名称
+		Type      string // 交换机类型
+		QueueName string // 队列名称
+		Key       string // key值
+		Dns       string // 链接地址
+	}
+
+	// Producter 生产者
+	Producter struct {
+		conn     *amqp.Connection
+		channel  *amqp.Channel
+		Exchange Exchange
+	}
+
+	// Consumer 消费者
+	Consumer struct {
+		conn    *amqp.Connection
+		channel *amqp.Channel
+	}
+)
+
+var (
+	name = "a"
+)

+ 4 - 5
readme.md

@@ -10,18 +10,17 @@
 
 #### 使用说明
 > 1. 查看当前go的库环境: go env
-> 2. GOPRIVATE中增加私有仓库地址:
+>
+> 2. GOPRIVATE中增加私有仓库地址: 该部分请自行将其设置为全局环境变量
 > 
 >> * export GOPRIVATE=${GOPRIVATE},gtlib.local
 >> * export GONOPROXY=${GONOPROXY},gtlib.local # 会自动设置
 >> * export GONOSUMDB=${GONOSUMDB},gtlib.local # 会自动设置
 >> * export GOINSECURE=${GOINSECURE},gtlib.local
 >>
-> 3. 非必须 设置git config地址替换:
->
->> git config --global url."http://120.55.44.4:10080".insteadOf "gtlib.local"
+> 3. 为gtlib.local指定解析
 > 
-> 4. echo '120.55.44.4 gtlib.local' > /etc/hosts 
+>> echo '120.55.44.4 gtlib.local' > /etc/hosts 
 > 
 >