瀏覽代碼

更新零下温度处理

liuxiulin 2 年之前
父節點
當前提交
bb379428d5
共有 1 個文件被更改,包括 14 次插入35 次删除
  1. 14 35
      server/client.go

+ 14 - 35
server/client.go

@@ -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 {