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, "超时")
- }
- }
|