| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 | 
							- package comm
 
- import (
 
- 	"encoding/hex"
 
- 	"fmt"
 
- 	"github.com/gin-gonic/gin"
 
- 	"github.com/jacobsa/go-serial/serial"
 
- 	"../pkg/app"
 
- 	"../pkg/e"
 
- 	"../pkg/setting"
 
- 	"../routers/restful"
 
- 	"log"
 
- 	"net/http"
 
- 	"time"
 
- 	"unsafe"
 
- )
 
- //一个已经被关闭的channel不会阻塞,已经被关闭的channel会实时返回
 
- //goroutine退出,关闭done来进行广播
 
- var done = make(chan struct{})
 
- var Id = make(chan int)
 
- var timeout = make(chan int)
 
- var ReturnString = make(chan string)
 
- //判断done是否关闭,即是否执行goroutine退出
 
- func cancelled() bool {
 
- 	select {
 
- 	case <-done:
 
- 		return true
 
- 	default:
 
- 		return false
 
- 	}
 
- }
 
- func Int2Byte(data int)(ret []byte){
 
- 	var len uintptr = unsafe.Sizeof(data)
 
- 	ret = make([]byte, len)
 
- 	var tmp int = 0xff
 
- 	var index uint = 0
 
- 	for index=0; index<uint(len); index++{
 
- 		ret[index] = byte((tmp<<(index*8) & data)>>(index*8))
 
- 	}
 
- 	return ret
 
- }
 
- func OpenComm() {
 
- 	var sum byte
 
- 	var recLength,dataLength, state int
 
-     comtimeout := 0
 
- 	buf := make([]byte, 32)
 
- 	recbuf := make([]byte, 1)
 
- 	//s_params := make([]interface{}, 1)
 
- 	openSerial:
 
- 	f, err := serial.Open(*setting.CommSetting)
 
- 	if err != nil {
 
- 		fmt.Println("Error opening serial port: ", err)
 
- 		time.Sleep(1 * time.Second)
 
- 		goto openSerial
 
- 	}else {
 
- 		log.Printf("[info] Serial %s is Started", setting.CommSetting.PortName)
 
- 		if comtimeout==0 {
 
- 			defer f.Close()
 
- 		}
 
- 		for {
 
- 			sum = (0x55 + 0xAA + 0x06 + 0x01 + 0x03 + 0x01) & 0xFF
 
-             v := 0
 
- 			if comtimeout==0 {
 
- 				v, _ = <- Id
 
- 			}
 
- 			comtimeout = 0
 
- 			cowidByte := Int2Byte(v)[:3]
 
- 			sum = (sum + cowidByte[0] + cowidByte[1] + cowidByte[2]) & 0xFF
 
- 			cowidByte = append(cowidByte, sum)
 
- 			requestCowid := "55AA06010301" + hex.EncodeToString(cowidByte)
 
- 			txData_, err := hex.DecodeString(requestCowid)
 
- 			recLength = 0
 
- 			state = 0
 
- 			_, err = f.Write(txData_)
 
- 			fmt.Println(hex.EncodeToString(txData_))
 
- 			if err != nil {
 
- 				fmt.Println("Error writing to serial port: ", err)
 
- 				time.Sleep(1 * time.Second)
 
- 				comtimeout = 1
 
- 				goto openSerial
 
- 			}
 
- 			loop:
 
- 				for {
 
- 					select {
 
- 					case <-timeout:
 
- 						break loop
 
- 					default:
 
- 						n, err := f.Read(buf)
 
- 						if err != nil {
 
- 							//if err != io.EOF {
 
- 								fmt.Println("Error reading from serial port: ", err)
 
- 								time.Sleep(1 * time.Second)
 
- 								comtimeout = 1
 
- 								goto openSerial
 
- 							//}
 
- 							//break loop
 
- 						} else if n > 0 {
 
- 							buf = buf[:n]
 
- 							for _, value := range buf {
 
- 								switch state {
 
- 								case 0: //头判断
 
- 									if value == 0x55 {
 
- 										state = 1
 
- 										recLength = 1
 
- 										recbuf = recbuf[:0]
 
- 										recbuf = append(recbuf, (byte)(value&0xFF))
 
- 									}
 
- 								case 1: //头判断中
 
- 									if value == 0xAA {
 
- 										state = 2
 
- 										recLength = 2
 
- 										recbuf = append(recbuf, (byte)(value&0xFF))
 
- 									} else {
 
- 										state = 0
 
- 										recLength = 0
 
- 									}
 
- 								case 2: //接收数据长度
 
- 									state = 3
 
- 									recLength = 3
 
- 									dataLength = (int)(value + 4)
 
- 									recbuf = append(recbuf, (byte)(value&0xFF))
 
- 								case 3: //接收数据中
 
- 									recbuf = append(recbuf, (byte)(value&0xFF))
 
- 									recLength++
 
- 									if recLength == dataLength {
 
-                                        fmt.Println(hex.EncodeToString(recbuf))
 
- 										ReturnString <- hex.EncodeToString(recbuf)
 
- 										state = 0
 
- 										recLength = 0
 
- 										break loop
 
- 									}
 
- 								}
 
- 							}
 
- 						} else {
 
- 							time.Sleep(10 * time.Millisecond)
 
- 						}
 
- 					}
 
- 				}
 
- 			}
 
- 	}
 
- }
 
- func saveData(ReceStr string,x int,y int) (string, error){
 
- 	s_params := make([]interface{}, 0)
 
- 	//bytelist, err := hex.DecodeString(ReturnS)
 
- 	s_params = append(s_params, 1)
 
- 	s_params = append(s_params, x)
 
- 	s_params = append(s_params, y)
 
- 	s_params = append(s_params, 1)
 
- 	_, err := restful.ExecQuery("INSERT INTO `cps_m` (`barid`, `x`, `y`) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE barid = ?", s_params)
 
- 	if err != nil {
 
- 		return "", err
 
- 	} else {
 
- 		bytelist, err := hex.DecodeString(ReceStr)
 
- 		rodecount := (int)((bytelist[2]-5)>>1)
 
- 		s_params = s_params[1:3]
 
- 		if rodecount>0{
 
- 			for i := 0; i < rodecount; i++{
 
- 				beaconname := (int)(bytelist[8+2*i])
 
- 				rssi := (int)(bytelist[9+2*i])
 
- 				s_params = s_params[:2]
 
- 				s_params = append(s_params, beaconname)
 
- 				s_params = append(s_params, rssi)
 
- 				s_params = append(s_params, rssi)
 
- 				_, err = restful.ExecQuery("INSERT INTO `cps_d`(`pid`,`beaconid`,`rssi`) "+
 
- 					"SELECT (SELECT `id` FROM `cps_m` WHERE `x`=? AND `y`=?),?,?  ON DUPLICATE KEY UPDATE rssi = ?", s_params)
 
- 				if err != nil {
 
- 					return "", err
 
- 				}
 
- 			}
 
- 			if err == nil{
 
- 				return "成功保存", nil
 
- 			}
 
- 		}else {
 
- 			return "没有收到数据", nil
 
- 		}
 
- 	}
 
- 	return "没有收到数据", nil
 
- }
 
- func savePointData(ReceStr string,limit int) (interface{}, error){
 
- 	s_params := make([]interface{}, 1)
 
- 	//bytelist, err := hex.DecodeString(ReturnS)
 
- 	bytelist, err := hex.DecodeString(ReceStr)
 
- 	rodecount := (int)((bytelist[2]-5)>>1)
 
- 	low := (int)(bytelist[5])
 
- 	mid := (int)(bytelist[6])
 
- 	mid = mid<<8
 
- 	high := (int)(bytelist[7])
 
- 	high = high<<16
 
- 	tagid := (int)(low|mid|high)
 
- 	s_params[0] = tagid
 
- 	if rodecount>0{
 
- 		for i := 0; i < rodecount; i++{
 
- 			beaconname := (int)(bytelist[8+2*i])
 
- 			rssi := (int)(bytelist[9+2*i])
 
- 			s_params = s_params[:1]
 
- 			s_params = append(s_params, beaconname)
 
- 			s_params = append(s_params, rssi)
 
- 			s_params = append(s_params, rssi)
 
- 			_, err = restful.ExecQuery(" INSERT INTO `cps_point`(`tagid`,`beaconid`,`rssi`) "+
 
- 				                              " Values( ?, ?, ?)  ON DUPLICATE KEY UPDATE rssi = ?", s_params)
 
- 			if err != nil {
 
- 				return "", err
 
- 			}
 
- 		}
 
- 		if err == nil{
 
- 			s_params = s_params[:2]
 
- 			s_params[0] = tagid
 
- 			s_params[1] = limit
 
- 			resultdata, err := restful.QueryByMap(" SELECT AVG(X) X,AVG(Y) Y FROM  ( "+
 
- 			"SELECT `cps_m`.x,`cps_m`.y, SUM(ABS(`cps_d`.`rssi`-`cps_point`.`rssi`)) absrssi "+
 
- 			"FROM `cps_d` JOIN `cps_point` ON `cps_d`.`beaconid`=`cps_point`.`beaconid` "+
 
- 			"JOIN `cps_m` ON `cps_m`.`id`=`cps_d`.`pid` WHERE  `cps_point`.`tagid`= ? "+
 
- 			"GROUP BY `cps_m`.x,`cps_m`.y "+
 
- 			"ORDER BY SUM(ABS(`cps_d`.`rssi`-`cps_point`.`rssi`)) "+
 
- 			"LIMIT ?) AS d "		, 0,0,s_params)
 
- 			if err != nil {
 
- 				return "", err
 
- 			} else {
 
- 				return resultdata, nil
 
- 			}
 
- 		}
 
- 	}else {
 
- 		return "没有收到数据", nil
 
- 	}
 
- 	return "没有收到数据", nil
 
- }
 
- func ProcessHttp(c *gin.Context) {
 
- 	var (
 
- 		appG = app.Gin{C: c}
 
- 	)
 
- 	id := 0//com.StrTo(c.Param("id")).MustInt()
 
- 	x := 0//com.StrTo(c.Param("x")).MustInt()
 
- 	y := 0//com.StrTo(c.Param("y")).MustInt()
 
- 	Id <- id
 
- 	select {
 
- 	case ReturnS := <- ReturnString: //拿到锁
 
- 		if x>=0 && y>=0{
 
- 			returnData, err := saveData(ReturnS,x,y)
 
- 			if err  != nil{
 
- 				appG.Response(http.StatusOK, e.ERROR, err.Error())
 
- 			}else {
 
- 				appG.Response(http.StatusOK, e.SUCCESS, returnData)
 
- 			}
 
- 		}else {
 
- 			returnData, err := savePointData(ReturnS,1)
 
- 			if err  != nil{
 
- 				appG.Response(http.StatusOK, e.ERROR, err.Error())
 
- 			}else {
 
- 				appG.Response(http.StatusOK, e.SUCCESS, returnData)
 
- 			}
 
- 		}
 
- 	case <-time.After(10 * time.Second): //超时5s
 
- 		timeout <- 1
 
- 		appG.Response(http.StatusOK, e.ERROR, "超时")
 
- 	}
 
- }
 
- func ProcessHttpCPS(c *gin.Context) {
 
- 	var (
 
- 		appG = app.Gin{C: c}
 
- 	)
 
- 	id := 0//com.StrTo(c.Param("id")).MustInt()
 
- 	limit := 0//com.StrTo(c.Param("limit")).MustInt()
 
- 	Id <- id
 
- 	select {
 
- 	case ReturnS := <- ReturnString: //拿到锁
 
- 		{
 
- 			returnData, err := savePointData(ReturnS, limit)
 
- 			if err  != nil{
 
- 				appG.Response(http.StatusOK, e.ERROR, err.Error())
 
- 			}else {
 
- 				appG.Response(http.StatusOK, e.SUCCESS, returnData)
 
- 			}
 
- 		}
 
- 	case <-time.After(10 * time.Second): //超时5s
 
- 		timeout <- 1
 
- 		appG.Response(http.StatusOK, e.ERROR, "超时")
 
- 	}
 
- }
 
 
  |