|
@@ -1,7 +1,6 @@
|
|
|
package server
|
|
|
|
|
|
import (
|
|
|
- "encoding/binary"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
"github.com/gogf/gf/encoding/gbinary"
|
|
@@ -9,9 +8,9 @@ import (
|
|
|
"github.com/gogf/gf/os/glog"
|
|
|
"github.com/gogf/gf/util/gconv"
|
|
|
"io"
|
|
|
+ "math"
|
|
|
"net"
|
|
|
"pt100-gateway/protocol"
|
|
|
- "strconv"
|
|
|
"strings"
|
|
|
"syscall"
|
|
|
"time"
|
|
@@ -98,14 +97,14 @@ func (c *Client) decodeAndReport(buf []byte) error {
|
|
|
if buf[1] == 0x03 {
|
|
|
data := &protocol.Data{}
|
|
|
data.Address = gconv.String(gbinary.BeDecodeToInt(buf[0:1]))
|
|
|
- data.Tem1 = decodeData(buf[3:5])
|
|
|
- data.Tem2 = decodeData(buf[5:7])
|
|
|
- data.Tem3 = decodeData(buf[7:9])
|
|
|
- data.Tem4 = decodeData(buf[9:11])
|
|
|
- data.Tem5 = decodeData(buf[11:13])
|
|
|
- data.Tem6 = decodeData(buf[13:15])
|
|
|
- data.Tem7 = decodeData(buf[15:17])
|
|
|
- data.Tem8 = decodeData(buf[17:19])
|
|
|
+ data.Tem1 = caleTemperature(buf[3:5])
|
|
|
+ data.Tem2 = caleTemperature(buf[5:7])
|
|
|
+ data.Tem3 = caleTemperature(buf[7:9])
|
|
|
+ data.Tem4 = caleTemperature(buf[9:11])
|
|
|
+ data.Tem5 = caleTemperature(buf[11:13])
|
|
|
+ data.Tem6 = caleTemperature(buf[13:15])
|
|
|
+ data.Tem7 = caleTemperature(buf[15:17])
|
|
|
+ data.Tem8 = caleTemperature(buf[17:19])
|
|
|
|
|
|
if err := c.srv.ReportStatus(c.Id, data, "status"); err != nil {
|
|
|
return err
|
|
@@ -114,14 +113,16 @@ func (c *Client) decodeAndReport(buf []byte) error {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-func decodeData(buf []byte) float32 {
|
|
|
+func caleTemperature(buf []byte) float32 {
|
|
|
if gbinary.BeDecodeToUint16(buf) == 0xFFFF {
|
|
|
return 0
|
|
|
}
|
|
|
value := gconv.Float32(gbinary.BeDecodeToUint16(buf)&0x7FFF) / 10
|
|
|
-
|
|
|
+ if value < 1 {
|
|
|
+ value = float32(math.Floor(float64(value) + 0.5))
|
|
|
+ }
|
|
|
if gbinary.BeDecodeToUint16(buf)&0x8000 == 0x8000 {
|
|
|
- value = -value
|
|
|
+ value = value * -1
|
|
|
}
|
|
|
return value
|
|
|
}
|
|
@@ -143,28 +144,6 @@ func (c *Client) closeConnection() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// 计算温度值, 处理零下的情况
|
|
|
-func caleTemperature(data []byte) int {
|
|
|
- var ym uint16
|
|
|
- var isBlowZero bool
|
|
|
- var result int
|
|
|
- bm := binary.BigEndian.Uint16(data)
|
|
|
- var bitNum = len(data) * 8
|
|
|
- f := "%." + strconv.Itoa(bitNum) + "b"
|
|
|
- bmStr := fmt.Sprintf(f, bm)
|
|
|
- if string(bmStr[0]) == "1" { // blow zero
|
|
|
- ym = ^bm + 1
|
|
|
- isBlowZero = true
|
|
|
- } else {
|
|
|
- ym = bm
|
|
|
- }
|
|
|
- result = int(ym)
|
|
|
- if isBlowZero {
|
|
|
- result = int(ym) * -1
|
|
|
- }
|
|
|
- return result
|
|
|
-}
|
|
|
-
|
|
|
// isErrConnReset read: connection reset by peer
|
|
|
func isErrConnReset(err error) bool {
|
|
|
if ne, ok := err.(*net.OpError); ok {
|