您现在的位置是:网站首页> Go语言

Go电子秤代码

摘要
package main

import (
	"bytes"
	"errors"
	"fmt"
	"html/template"
	"net"
	"net/http"
	"runtime"
	//"syscall"
	//	"unicode/utf8"
	"unsafe"

	"golang.org/x/net/websocket"
	//"code.google.com/p/go.net/websocket"
	//"log"

	"bufio"
	//	"io"

	"strings"
	"time"

	"sync"

	"encoding/json"

	"strconv"

	"LocalWeb/mylib"

	"math/rand"

	"os"

	//	"github.com/axgle/mahonia"
	"github.com/tarm/serial"

	"reflect"

	"io/ioutil"

	"golang.org/x/text/encoding/simplifiedchinese"
	"golang.org/x/text/transform"
)

// 端口
const (
	HTTP_PORT  string = "888"
	HTTPS_PORT string = "443"
)

// 目录
const (
	CSS_CLIENT_PATH   = "/css/"
	CSS2_CLIENT_PATH  = "/assets/css/"
	DART_CLIENT_PATH  = "/js/"
	IMAGE_CLIENT_PATH = "/image/"

	CSS_SVR_PATH   = "web"
	CSS2_SVR_PATH  = "web"
	DART_SVR_PATH  = "web"
	IMAGE_SVR_PATH = "web"
)

func init() {
	runtime.GOMAXPROCS(runtime.NumCPU())
}

/*
 h := syscall.MustLoadDLL("kernel32.dll")
    c := h.MustFindProc("GetDiskFreeSpaceExW")
    lpFreeBytesAvailable := int64(0)
    lpTotalNumberOfBytes := int64(0)
    lpTotalNumberOfFreeBytes := int64(0)
    r2, _, err := c.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("F:"))),
        uintptr(unsafe.Pointer(&lpFreeBytesAvailable)),
        uintptr(unsafe.Pointer(&lpTotalNumberOfBytes)),
        uintptr(unsafe.Pointer(&lpTotalNumberOfFreeBytes)))
    if r2 != 0 {
        log.Println(r2, err, lpFreeBytesAvailable/1024/1024)
    }

	package main

import (
    "fmt"
    "syscall"
    "unsafe"
    "strconv"
)

type ulong int32
type ulong_ptr uintptr

type PROCESSENTRY32 struct {
    dwSize ulong
    cntUsage ulong
    th32ProcessID ulong
    th32DefaultHeapID ulong_ptr
    th32ModuleID ulong
    cntThreads ulong
    th32ParentProcessID ulong
    pcPriClassBase ulong
    dwFlags ulong
    szExeFile [260]byte
}

func main() {
    kernel32 := syscall.NewLazyDLL("kernel32.dll");
    CreateToolhelp32Snapshot := kernel32.NewProc("CreateToolhelp32Snapshot");
    pHandle,_,_ := CreateToolhelp32Snapshot.Call(uintptr(0x2),uintptr(0x0));
    if int(pHandle)==-1 {
        return;
    }
    Process32Next := kernel32.NewProc("Process32Next");
    for {
        var proc PROCESSENTRY32;
        proc.dwSize = ulong(unsafe.Sizeof(proc));
        if rt,_,_ := Process32Next.Call(uintptr(pHandle),uintptr(unsafe.Pointer(&proc)));int(rt)==1 {
            fmt.Println("ProcessName : "+string(proc.szExeFile[0:]));
            fmt.Println("ProcessID : "+strconv.Itoa(int(proc.th32ProcessID)));
        }else{
            break;
        }
    }
    CloseHandle := kernel32.NewProc("CloseHandle");
    _,_,_ = CloseHandle.Call(pHandle);


	lpBuffer := make([]byte,256)

_,_,callErr := syscall.Syscall(_GetLogicalDriveStrings,2,uintptr(len(lpBuffer)),uintptr(unsafe.Pointer(&lpBuffer[0])),0)

if callErr != 0 {

            fmt.Println("callErr", callErr)

    }

disk := []string{}

for _,v := range lpBuffer{

    if v >= 65 && v <= 90{

        disk = append(disk,string(v)+":")

    }

}

return disk
}

import "websocket"

	type T struct {
		Msg string
		Count int
	}

	// receive JSON type T
	var data T
	websocket.JSON.Receive(ws, &data)

	// send JSON type T
	websocket.JSON.Send(ws, data)

var mutex sync.Mutex

func write() {

mutex.Lock()

defer mutex.Unlock()

在Go语言中,读写锁由结构体类型sync.RWMutex代表。与互斥锁类似,sync.RWMutex类型的零值就已经是立即可用的读写锁了。在此类型的方法集合中包含了两对方法,即:
代码如下:

func (*RWMutex) Lock

func (*RWMutex) Unlock
和
复制代码 代码如下:
func (*RWMutex) RLock

func (*RWMutex) RUnlock

*/

type ComDeviceData struct {
	Weight     string //重量
	UnitPrice  string //单价
	TotalPrice string //总价
}
type WebSocketData struct {
	Command    string      //命令
	DeviceType string      //设备类型
	DeviceUuid string      //设备唯一id
	DeviceInfo interface{} //设备信息
	Data       interface{} //命令数据
}

type BindEventST struct {
	EventName string
}

type OneWebSocket struct { //一个WebSocket连接
	m_RW sync.RWMutex
}
type oneEvent struct { //一个事件
	EventName string //事件名
	EventMemo string //事件描述
}
type DeviceEventST struct { //一种设备类型的事件
	DeviceType string     //设备类型
	EventArray []oneEvent //设备事件
}

type WebSocketEventLink struct {
	EventLinkArray map[*websocket.Conn]OneWebSocket
}

type OneDeviceWork struct {
	Command    string
	SendString string
	conn       *websocket.Conn
}

type COMWeight struct {
	m_ComDeviceData ComDeviceData
}

//设备描述
type NETDevice struct {
	DeviceCommType string                        //设备通讯方式
	DeviceType     string                        //设备类型
	DeviceUuid     string                        //设备唯一id
	DeviceEvent    DeviceEventST                 //设备事件描
	m_EventMAP     map[string]WebSocketEventLink //*websocket.Conn //绑定的事件连接
	DeviceInfo     interface{}                   //设备信息
	LinkOBJ        interface{}                   //设备连接对象
	//DeviceWorkPtr  []OneDeviceWork

}
type COMDeviceInfo struct {
	COMString string //串口信息
}

type TCPDeviceInfo struct {
	IP    string //IP地址
	nPort int    //端口
}

type ReturnMessage struct {
	OK      bool   //是否成功
	Msg     string //消息串
	MsgData interface{}
}

type OnePLU struct {
	PLUNum   string //PLU编号
	GoodName string //品名
	GoodNum  string //商品编号
	Price    string //单价
	GoodType string //购买模式
	Weight   string //皮重
	ShopNo   string //店号
}

type ReportOneRecord struct {
	RecordNum     string //记录号
	RecordTime    string //记录时间
	DeptNo        string //部门号
	ShopNo        string //店号
	PLUNum        string //PLU序
	Weight        string //重量
	Price         string //单价
	Total         string //折扣前总价
	DiscountTotal string //折扣后总价
	BalanceNum    string //秤号
}

var m_LinkRW sync.RWMutex
var m_DeviceRW sync.RWMutex
var m_LinkUserMap map[*websocket.Conn]OneWebSocket
var m_DeviceTypeEventMap map[string]DeviceEventST //设备类型事件数组
var m_DeviceMap map[string]NETDevice              //设备列表

//var m_WebSocketData WebSocketData

var sGlobalCOM string = ""
var sDeviceType string = ""
var m_NETDeviceArray []NETDevice

var bGlobalVisual bool = false
var bGlobalSearchDevice = false
var m_SearchRW sync.RWMutex

var sGlobalTCPDeviceTypeArray []string = []string{}
var nGlobalTCPPortArray []int = []int{}
var sGlobalTCPIPArray []string = []string{}

var m_GlobalWG sync.WaitGroup

func Substr(str string, start, length int) string {
	rs := []rune(str)
	rl := len(rs)
	end := 0

	if start < 0 {
		start = rl - 1 + start
	}
	end = start + length

	if start > end {
		start, end = end, start
	}

	if start < 0 {
		start = 0
	}
	if start > rl {
		start = rl
	}
	if end < 0 {
		end = 0
	}
	if end > rl {
		end = rl
	}
	str0 := string(rs[start:end])
	rs = nil
	return str0
}
func ChuLiWeight(w string) string {

	nL := len(w)
	if nL == 3 {
		return "0." + w
	}
	return Substr(w, 0, nL-3) + "." + Substr(w, nL-3, 3)

}
func ChuLiUnitPrice(w string) string {

	nL := len(w)
	if nL == 2 {
		return "0." + w
	}
	return Substr(w, 0, nL-2) + "." + Substr(w, nL-2, 2)

}
func ChuLiTotalPrice(w string) string {

	nL := len(w)
	if nL == 2 {
		return "0." + w
	}
	return Substr(w, 0, nL-2) + "." + Substr(w, nL-2, 2)

}
func MyCOMReturn(m_OneDevice NETDevice, Weight string, UnitPrice string, TotalPrice string) bool {

	var m_WebSocketData WebSocketData
	var m_ComDeviceData ComDeviceData
	m_ComDeviceData.Weight = Weight
	m_ComDeviceData.UnitPrice = UnitPrice
	m_ComDeviceData.TotalPrice = TotalPrice
	m_WebSocketData.Command = "COM"
	m_WebSocketData.Data = m_ComDeviceData
	m_LinkRW.Lock()
	for key, _ := range m_LinkUserMap {

		if err := websocket.JSON.Send(key, m_WebSocketData); err != nil {

			break
		} else {
		}

	}
	m_LinkRW.Unlock()
	return true
}

func MyCOMReturnEvent(m_OneDevice NETDevice, EventName string, m_WebSocketData WebSocketData) bool {

	m_LinkRW.Lock()
	m_WebSocketEventLink, bOK := m_OneDevice.m_EventMAP[EventName]
	if bOK {
		for key, _ := range m_WebSocketEventLink.EventLinkArray {

			if err := websocket.JSON.Send(key, m_WebSocketData); err != nil {

				break
			} else {
			}
		}

	} else {
		fmt.Println("未找到绑定事件", EventName, m_OneDevice.m_EventMAP)
	}

	m_LinkRW.Unlock()
	return true
}

func FindManyCOMDevice() ([]string, []string) {
	var sDeviceTypeArray []string = []string{}
	var sDeviceCOMArray []string = []string{}

	if bGlobalVisual {

		sDeviceTypeArray = append(sDeviceTypeArray, "ACS-15Ab")
		sDeviceCOMArray = append(sDeviceCOMArray, "COM1")
		return sDeviceTypeArray, sDeviceCOMArray
	}
	var s *serial.Port
	var err error
	var i int = 1
	var n int
	var sCOM string
	buf := make([]byte, 1024)
	var nPos int = 0
	var ss string
	var stringLength int
	var nn int
	var tBegin int64
	for {
		sCOM = "COM" + strconv.Itoa(i)
		c := &serial.Config{Name: sCOM, Baud: 9600}
		s, err = serial.OpenPort(c)
		if err != nil {

		} else {

			time.Sleep(500000000)
			tBegin = time.Now().Unix()

			for {

				if time.Now().Unix()-tBegin > 1 {
					fmt.Println("超时退出")
					break
				}
				n, err = s.Read(buf[nPos:])
				if err != nil {
					//log.Fatal(err)
					break
				}
				if n > 0 {
					nPos += n
				JXX:
					if nPos > 2 {
						if buf[0] == 0x0a && buf[1] == 0x0d {
							ss = string(buf[2:nPos])
							stringLength = len(ss)
							nn = strings.IndexAny(ss, "\r\n")
							if nn == -1 {

								switch stringLength {
								case 5:
									//s.Close()
									//return "ACS-15Ab", sCOM
									sDeviceTypeArray = append(sDeviceTypeArray, "ACS-15Ab")
									sDeviceCOMArray = append(sDeviceCOMArray, sCOM)
									break

								case 20:
									//s.Close()
									//return "ACS-15Ab", sCOM
									sDeviceTypeArray = append(sDeviceTypeArray, "ACS-15Ab")
									sDeviceCOMArray = append(sDeviceCOMArray, sCOM)
									break
								default:
									nPos = 0
									continue

								}

							} else {
								sss := Substr(ss, 0, nn)
								stringLength = len(sss)
								switch stringLength {
								case 5:
									//s.Close()
									//return "ACS-15Ab", sCOM
									sDeviceTypeArray = append(sDeviceTypeArray, "ACS-15Ab")
									sDeviceCOMArray = append(sDeviceCOMArray, sCOM)
									break
								case 20:
									//s.Close()
									//return "ACS-15Ab", sCOM
									sDeviceTypeArray = append(sDeviceTypeArray, "ACS-15Ab")
									sDeviceCOMArray = append(sDeviceCOMArray, sCOM)
									break
								default:
									nPos = 0
									continue
								}

							}

							//s.Close()
							//return "ACS-15Ab", sCOM
							sDeviceTypeArray = append(sDeviceTypeArray, "ACS-15Ab")
							sDeviceCOMArray = append(sDeviceCOMArray, sCOM)
							break

						} else {
							ss = string(buf[0:nPos])
							nn = strings.IndexAny(ss, "\r\n")
							if nn == -1 {
								nPos = 0
							} else {
								copy(buf, buf[nn:nPos])
								nPos = nPos - nn
								goto JXX

							}

						}

					}

				}
				time.Sleep(200000000)

			}

			s.Close()

		}
		i = i + 1
		if i > 20 {

			break
		}

	}
	return sDeviceTypeArray, sDeviceCOMArray
}

func FindCOMDevice() (string, string) {
	if bGlobalVisual {
		return "ACS-15Ab", "COM1"
	}
	var s *serial.Port
	var err error
	var i int = 1
	var n int
	var sCOM string
	buf := make([]byte, 1024)
	var nPos int = 0
	var ss string
	var stringLength int
	var nn int
	var tBegin int64
	for {
		sCOM = "COM" + strconv.Itoa(i)
		fmt.Println("扫串口:", sCOM)
		c := &serial.Config{Name: sCOM, Baud: 9600}
		s, err = serial.OpenPort(c)
		if err != nil {
			fmt.Println("打开失败:", sCOM)
		} else {

			fmt.Println("打开成功:", sCOM)
			time.Sleep(500000000)
			tBegin = time.Now().Unix()
			fmt.Println("开始试探串口数据")
			for {

				if time.Now().Unix()-tBegin > 1 {
					fmt.Println("探测数据超时退出")
					break
				}
				n, err = s.Read(buf[nPos:])
				if err != nil {
					//log.Fatal(err)
					break
				}
				if n > 0 {
					nPos += n
				JXX:
					if nPos > 2 {
						if buf[0] == 0x0a && buf[1] == 0x0d {
							ss = string(buf[2:nPos])
							stringLength = len(ss)
							nn = strings.IndexAny(ss, "\r\n")
							if nn == -1 {

								switch stringLength {
								case 5:
									s.Close()
									return "ACS-15Ab", sCOM
								case 20:
									s.Close()
									return "ACS-15Ab", sCOM
								default:
									nPos = 0
									continue

								}

							} else {
								sss := Substr(ss, 0, nn)
								stringLength = len(sss)
								switch stringLength {
								case 5:
									s.Close()
									return "ACS-15Ab", sCOM
								case 20:
									s.Close()
									return "ACS-15Ab", sCOM
								default:
									nPos = 0
									continue
								}

							}

							s.Close()
							return "ACS-15Ab", sCOM
						} else {
							ss = string(buf[0:nPos])
							nn = strings.IndexAny(ss, "\r\n")
							if nn == -1 {
								nPos = 0
							} else {
								copy(buf, buf[nn:nPos])
								nPos = nPos - nn
								goto JXX

							}

						}

					}

				}
				time.Sleep(200000000)

			}

			s.Close()

		}
		i = i + 1
		if i > 20 {

			break
		}

	}
	return "", ""
}

func MyCOM(call func(m_OneDevice NETDevice, EventName string, m_WebSocketData WebSocketData) bool, m_OneDevice NETDevice) {

	//fmt.Printf("启动串口\r\n")
	//m_OneDevice.DeviceWorkPtr = []OneDeviceWork{}
	var err error
	var s *serial.Port
	c := &serial.Config{Name: sGlobalCOM /*"COM4"*/, Baud: 9600}
	s, err = serial.OpenPort(c)
	if err != nil {

	} else {
		m_OneDevice.LinkOBJ = s
	}

	buf := make([]byte, 1024)
	var nPos int = 0
	var nn int = 0
	var ss string
	var m_WebSocketData WebSocketData
	m_WebSocketData.DeviceInfo = m_OneDevice.DeviceInfo
	m_WebSocketData.DeviceType = m_OneDevice.DeviceType
	m_WebSocketData.DeviceUuid = m_OneDevice.DeviceUuid
	var m_ComDeviceData ComDeviceData
	var stringWeight string = "0.000"    //固定三位小数
	var stringUnitPrice string = "0.00"  //固定两位小数
	var stringTotalPrice string = "0.00" //固定两位小数

	if bGlobalVisual {
		m_OneDevice.LinkOBJ = nil
		tt := time.Now().Unix()
		r := rand.New(rand.NewSource(time.Now().UnixNano()))
		var ww int = 0
		for {
			if time.Now().Unix()-tt >= 1 {
				ww = r.Intn(10)
				stringWeight = strconv.Itoa(ww)
				stringUnitPrice = "0.02"
				stringTotalPrice = strconv.FormatFloat(float64(ww)*0.02, 'f', 2, 64)
				tt = time.Now().Unix()
			}
			if !bGlobalVisual {
				break
			}
			if bGlobalSearchDevice {
				break
			}

			m_ComDeviceData.Weight = stringWeight
			m_ComDeviceData.UnitPrice = stringUnitPrice
			m_ComDeviceData.TotalPrice = stringTotalPrice
			m_WebSocketData.Command = "onCOMData"
			m_WebSocketData.Data = m_ComDeviceData
			//fmt.Println("触发模拟重量")
			call(m_OneDevice, "onCOMData", m_WebSocketData)
			time.Sleep(300000000)
		}
	} else {

		for {
			if err != nil {
				//log.Fatal(err)
				//fmt.Println("%v", err)
				m_OneDevice.LinkOBJ = nil
				return
			} else {

				/*
					n, err := s.Write([]byte("P"))
					if err != nil {
						//log.Fatal(err)
						return
					}

				*/

				n, err := s.Read(buf[nPos:])
				if err != nil {
					//log.Fatal(err)
					return
				}
				if bGlobalSearchDevice {
					s.Close()
					fmt.Println("关闭退出")
					return
				}
				if n > 0 {
					nPos += n
					//fmt.Printf("收串口数据%d\r\n", n)
					//log.Print("%q", buf[:n])
				JX:
					if nPos > 2 {
						stringWeight = "0"
						stringUnitPrice = "0"
						stringTotalPrice = "0"
						//fmt.Printf("action data %v\r\n", buf)
						if buf[0] == 0x0a && buf[1] == 0x0d {
							ss = string(buf[2:nPos])
							//fmt.Println("串口数据:", ss)
							stringLength := len(ss)
							nn = strings.IndexAny(ss, "\r\n")
							if nn == -1 {
								switch stringLength {
								case 5:
									nPos = 0
									stringWeight = ss
									stringUnitPrice = "0"
									stringTotalPrice = "0"
								case 20:
									stringWeight = Substr(ss, 0, 5)
									stringUnitPrice = Substr(ss, 7, 5)
									stringTotalPrice = Substr(ss, 14, 6)
								default:
									nPos = 0
									continue
								}
								stringWeight = ChuLiWeight(stringWeight)
								stringUnitPrice = ChuLiUnitPrice(stringUnitPrice)
								stringTotalPrice = ChuLiTotalPrice(stringTotalPrice)
								fmt.Printf("收解析数据stringWeight:%v,stringUnitPrice:%v,stringTotalPrice:%v\r\n", stringWeight, stringUnitPrice, stringTotalPrice)

								m_ComDeviceData.Weight = stringWeight
								m_ComDeviceData.UnitPrice = stringUnitPrice
								m_ComDeviceData.TotalPrice = stringTotalPrice
								m_WebSocketData.Command = "onCOMData"
								m_WebSocketData.Data = m_ComDeviceData

								call(m_OneDevice, "onCOMData", m_WebSocketData)

							} else {
								sss := Substr(ss, 0, nn)
								stringLength = len(sss)
								switch stringLength {
								case 5:
									nPos = 0
									stringWeight = sss
									stringUnitPrice = "0"
									stringTotalPrice = "0"
								case 20:
									stringWeight = Substr(sss, 0, 5)
									stringUnitPrice = Substr(sss, 7, 5)
									stringTotalPrice = Substr(sss, 14, 6)
								default:
									nPos = 0
									continue
								}
								stringWeight = ChuLiWeight(stringWeight)
								stringUnitPrice = ChuLiUnitPrice(stringUnitPrice)
								stringTotalPrice = ChuLiTotalPrice(stringTotalPrice)
								fmt.Printf("收解析数据stringWeight:%v,stringUnitPrice:%v,stringTotalPrice:%v\r\n", stringWeight, stringUnitPrice, stringTotalPrice)
								m_ComDeviceData.Weight = stringWeight
								m_ComDeviceData.UnitPrice = stringUnitPrice
								m_ComDeviceData.TotalPrice = stringTotalPrice
								m_WebSocketData.Command = "onCOMData"
								m_WebSocketData.Data = m_ComDeviceData

								call(m_OneDevice, "onCOMData", m_WebSocketData)
								copy(buf, buf[nn:nPos])
								nPos = nPos - nn
								goto JX

							}

						} else {
							ss = string(buf[0:nPos])
							nn = strings.IndexAny(ss, "\r\n")
							if nn == -1 {
								nPos = 0
							} else {
								copy(buf, buf[nn:nPos])
								nPos = nPos - nn
								goto JX

							}
						}

					}

				} else {
					if bGlobalVisual {
						s.Close()
						fmt.Println("关闭退出")
						return
					}
				}
				time.Sleep(300000000)
			}
		}
	}
}
func MyTCPCallBack(m_OneDevice NETDevice, com int, data string) bool {

	fmt.Printf("TCP指令:%v\r\n", com)
	println("TCP数据:", data)
	return true
}

func MyTCP(call func(m_OneDevice NETDevice, com int, data string) bool, m_OneDevice NETDevice) {

	//	m_OneDevice.DeviceWorkPtr = []OneDeviceWork{}
	call(m_OneDevice, 1, "123")
	conn, err := net.DialTimeout("tcp", "127.0.0.1:5000", time.Second*10)
	if err != nil {
		return //panic(err)
	}
	//conn.SetDeadline()
	m_OneDevice.LinkOBJ = conn
	fmt.Fprintf(conn, "hello server\n")
	/*
		data, err := bufio.NewReader(conn).ReadString('\n')
		if err != nil {
			panic(err)
		}
		fmt.Printf("输出获得数据:%#v\n", data)
	*/
	reader := bufio.NewReader(conn)
	b := make([]byte, 1024*4)
	for {
		n, err := reader.Read(b)
		if err != nil {
			m_OneDevice.LinkOBJ = nil
			break
		} else {
			fmt.Printf("数据长度:%v", n)
			println("netstring:", string(b[0:n]))
		}
	}
	fmt.Printf("与服务器断开连接\n")

}

type MyData struct {
	iSize int
	data  [500]byte
}

func IntPtr(n int) uintptr {
	return uintptr(n)
}

/*
func StrPtr(s string) uintptr {
	return uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(s)))
}
*/
func byteString(p []byte) string {
	for i := 0; i < len(p); i++ {
		if p[i] == 0 {
			return string(p[0:i])
		}
	}
	return string(p)
}
func GetMyIPHead() string {
	addrs, err := net.InterfaceAddrs()
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	var sIP string
	for _, address := range addrs {

		// 检查ip地址判断是否回环地址
		if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
			if ipnet.IP.To4() != nil {
				//fmt.Println(ipnet.IP.String())
				sIP = ipnet.IP.String()
				break
			}

		}
	}
	nPos := strings.LastIndex(sIP, ".")
	var sHeadIP = Substr(sIP, 0, nPos)
	return sHeadIP
}
func searchTPCDevic() {

	var sIPHead = GetMyIPHead()

	var nCnt int = 1
	var nn int = 255 / nCnt
	m_GlobalWG.Add(nn)
	for i := 0; i < nn; i++ {
		go FindManyTCPDevice(sIPHead, i*nCnt, nCnt)
	}
	m_GlobalWG.Wait()
	fmt.Println("TCP设备扫描完毕:", sGlobalTCPIPArray)

}
func FindManyTCPDevice(sHeadIP string, nB int, nCnt int) ([]string, []int, []string) {
	var sDeviceTypeArray []string = []string{}
	var nPortArray []int = []int{}
	var sIPArray []string = []string{}

	/*
		addrs, err := net.InterfaceAddrs()
		if err != nil {
			fmt.Println(err)
			os.Exit(1)
		}
		var sIP string
		for _, address := range addrs {

			// 检查ip地址判断是否回环地址
			if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
				if ipnet.IP.To4() != nil {
					//fmt.Println(ipnet.IP.String())
					sIP = ipnet.IP.String()
					break
				}

			}
		}
		nPos := strings.LastIndex(sIP, ".")
		var sHeadIP = Substr(sIP, 0, nPos)
	*/
	var i int
	var sIP string
	for i = nB; i < nB+nCnt; i++ {
		sIP = sHeadIP + "." + strconv.Itoa(i)
		conn, err := net.DialTimeout("tcp", sIP+":4001", time.Second*1)
		if err != nil {
			//fmt.Println("连接" + sIP + "失败")
		} else {
			fmt.Println("连接上了:" + sIP)
			conn.Close()
			m_LinkRW.Lock()
			//return "ATCP", 4001, sIP
			//sDeviceTypeArray = append(sDeviceTypeArray, "ATCP")
			//nPortArray = append(nPortArray, 4001)
			//sIPArray = append(sIPArray, sIP)
			sGlobalTCPDeviceTypeArray = append(sGlobalTCPDeviceTypeArray, "ATCP")
			nGlobalTCPPortArray = append(nGlobalTCPPortArray, 4001)
			sGlobalTCPIPArray = append(sGlobalTCPIPArray, sIP)
			m_LinkRW.Unlock()

		}

	}
	m_GlobalWG.Done()
	return sDeviceTypeArray, nPortArray, sIPArray
}
func FindTCPDevice() (string, int, string) {

	if bGlobalVisual {
		return "TM-15H", 4001, "192.168.0.150"
	}

	addrs, err := net.InterfaceAddrs()
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	var sIP string
	for _, address := range addrs {

		// 检查ip地址判断是否回环地址
		if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
			if ipnet.IP.To4() != nil {
				//fmt.Println(ipnet.IP.String())
				sIP = ipnet.IP.String()
				break
			}

		}
	}
	nPos := strings.LastIndex(sIP, ".")
	var sHeadIP = Substr(sIP, 0, nPos)
	var i int
	for i = 1; i < 256; i++ {
		if bGlobalVisual {
			return "TM-15H", 4001, "192.168.0.150"
		}
		sIP = sHeadIP + "." + strconv.Itoa(i) + ":4001"
		conn, err := net.DialTimeout("tcp", sIP, time.Second*1)
		if err != nil {
			fmt.Println("连接" + sIP + "失败")
		} else {
			fmt.Println("连接上了:" + sIP)
			conn.Close()
			return "TM-15H", 4001, sIP

		}

	}

	return "", 0, ""
}
func InitDevice(bInitDevice bool) {

	if bInitDevice {
		m_DeviceMap = make(map[string]NETDevice)
		m_DeviceTypeEventMap = make(map[string]DeviceEventST)
		var m_COMDeviceEvent DeviceEventST
		m_COMDeviceEvent.DeviceType = "ACS-15Ab"
		//m_COMDeviceEvent.EventArray = []oneEvent{oneEvent{"onCOMData", "串口实时重量信息"}, oneEvent{"onCOMEvent", "串口触发事件"}}
		m_COMDeviceEvent.EventArray = []oneEvent{oneEvent{"onCOMData", "串口实时重量信息"}}
		m_DeviceTypeEventMap["ACS-15Ab"] = m_COMDeviceEvent

		var m_TCPDeviceEvent DeviceEventST
		m_TCPDeviceEvent.DeviceType = "TM-15H"
		m_TCPDeviceEvent.EventArray = []oneEvent{oneEvent{"onTCPData", "TCP接收数据"}}
		m_DeviceTypeEventMap["TM-15H"] = m_TCPDeviceEvent
	}

	sDeviceType, sGlobalCOM = FindCOMDevice()
	if sGlobalCOM != "" {
		fmt.Println("找到的COM口为", sGlobalCOM)

		var m_DeviceUuid string = sDeviceType + "-" + sGlobalCOM
		m_DeviceRW.Lock()
		_, ok := m_DeviceMap[m_DeviceUuid]
		if !ok {
			var m_OneDevice NETDevice
			m_OneDevice.DeviceCommType = "COM"
			m_OneDevice.DeviceType = sDeviceType
			m_OneDevice.DeviceUuid = m_DeviceUuid
			m_OneDevice.m_EventMAP = make(map[string]WebSocketEventLink)
			var m_COMDeviceInfo COMDeviceInfo
			m_COMDeviceInfo.COMString = sGlobalCOM
			m_OneDevice.DeviceInfo = m_COMDeviceInfo
			m_OneDevice.DeviceEvent = m_DeviceTypeEventMap[sDeviceType]
			m_DeviceMap[m_OneDevice.DeviceUuid] = m_OneDevice
			go MyCOM(MyCOMReturnEvent, m_OneDevice)

		}
		m_DeviceRW.Unlock()
	}
	var nPort int
	var sIP string

	for i := 0; i < len(sGlobalTCPDeviceTypeArray); i++ {
		//sDeviceType, nPort, sIP = FindTCPDevice()
		sDeviceType = sGlobalTCPDeviceTypeArray[i]
		nPort = nGlobalTCPPortArray[i]
		sIP = sGlobalTCPIPArray[i]
		if sDeviceType != "" {
			fmt.Println("找到的TCP设备", sIP)
			var m_DeviceUuid string = sDeviceType + "-" + sIP
			m_DeviceRW.Lock()
			_, ok := m_DeviceMap[m_DeviceUuid]
			if !ok {

				var m_OneTCPDevice NETDevice
				m_OneTCPDevice.DeviceCommType = "TCP"
				m_OneTCPDevice.DeviceType = sDeviceType             //"ATCP"
				m_OneTCPDevice.DeviceUuid = sDeviceType + ":" + sIP // "ATCP:" + sIP
				m_OneTCPDevice.m_EventMAP = make(map[string]WebSocketEventLink)
				var m_TCPDeviceInfo TCPDeviceInfo
				m_TCPDeviceInfo.IP = sIP
				m_TCPDeviceInfo.nPort = nPort
				m_OneTCPDevice.DeviceInfo = m_TCPDeviceInfo
				m_OneTCPDevice.DeviceEvent = m_DeviceTypeEventMap[sDeviceType] //"ATCP"]
				m_DeviceMap[m_OneTCPDevice.DeviceUuid] = m_OneTCPDevice
				fmt.Println("TCPUUID:", m_OneTCPDevice.DeviceUuid)
				fmt.Println("OneTCP:", m_OneTCPDevice)
				//go MyTCP(MyTCPCallBack, m_OneTCPDevice)

			}
			m_DeviceRW.Unlock()

		}
	}

}

func DeviceMap2DeviceArray() {

	m_NETDeviceArray = []NETDevice{}
	for _, m_OneDevice := range m_DeviceMap {
		//fmt.Println("ToArray OneDevice :%v", m_OneDevice)
		m_NETDeviceArray = append(m_NETDeviceArray, m_OneDevice)
	}
	//fmt.Println("m_NETDeviceArray :%v", m_NETDeviceArray)
}
func String(b []byte) (s string) {
	pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b))
	pstring := (*reflect.StringHeader)(unsafe.Pointer(&s))
	pstring.Data = pbytes.Data
	pstring.Len = pbytes.Len
	return
}

func Slice(s string) (b []byte) {
	pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b))
	pstring := (*reflect.StringHeader)(unsafe.Pointer(&s))
	pbytes.Data = pstring.Data
	pbytes.Len = pstring.Len
	pbytes.Cap = pstring.Len
	return
}

func QWCodeToUTF8(str string) string {

	var returnString string = ""
	var m_Bytes []byte = []byte{}
	nL := len(str)
	for i := 0; i < nL; i += 4 {
		sQCode := Substr(str, i, 2)
		sWCode := Substr(str, i+2, 2)
		nQCode, _ := strconv.Atoi(sQCode)
		nWCode, _ := strconv.Atoi(sWCode)
		if nQCode == 3 {
			nQCode = 0
			nWCode += 32

			m_Bytes = append(m_Bytes, (byte)(nWCode))
			m_Bytes = append(m_Bytes, (byte)(nQCode))

		} else {
			nQCode += 160
			nWCode += 160
			m_Bytes = append(m_Bytes, (byte)(nQCode))
			m_Bytes = append(m_Bytes, (byte)(nWCode))
		}

	}
	fmt.Println("区位码bytes:", m_Bytes)

	I := bytes.NewReader(m_Bytes)
	O := transform.NewReader(I, simplifiedchinese.GBK.NewDecoder())
	d, e := ioutil.ReadAll(O)
	if e != nil {
		return ""
	}
	returnString = string(d[0:])
	returnString = strings.Replace(returnString, "\u0000", "", -1)
	return returnString

}
func UTF8ToQWCode(str string) string {
	var returnString = ""
	buf := new(bytes.Buffer)
	w := transform.NewWriter(buf, simplifiedchinese.GBK.NewEncoder())
	w.Write([]byte(str))
	w.Close()
	var m_Bytes []byte = buf.Bytes()
	fmt.Println("GB:", m_Bytes)
	fmt.Println("GBLength:", len(m_Bytes))
	//ASCI-32  其他 -36
	var i int = 0
	for i = 0; i < len(m_Bytes); {
		if m_Bytes[i] > 160 {
			returnString += fmt.Sprintf("%02d", m_Bytes[i]-160)
			returnString += fmt.Sprintf("%02d", m_Bytes[i+1]-160)
			i += 2
		} else {
			returnString += "03"
			returnString += fmt.Sprintf("%02d", m_Bytes[i]-32)
			i += 1
		}
	}
	fmt.Println("QWCode:", returnString)
	return returnString
}
func main() {

	/*
		var tt int64
		tt = time.Now().Unix()
		time.Sleep(3000000000)
		fmt.Println("相差秒:", time.Now().Unix()-tt)
	*/
	//TestFS()
	//fmt.Println("nowtime:", mylib.GetNowTimeString())
	//fmt.Println("byte[]:", []byte("成都"))
	//fmt.Println("区位码转串", QWCodeToUTF8("19412228"))
	//fmt.Println("当前时间:", mylib.GetNowTimeString())
	//UTF8ToQWCode("NO1进口水果")
	searchTPCDevic()
	/*
		var strCOMArray []string

				var MyString string = "中华abc"
				byteArray := Slice(MyString)
				fmt.Println("字符串byte[]:", byteArray)

			strCOMArray = append(strCOMArray, "你好")
			strCOMArray = append(strCOMArray, "我们")
			strCOMArray = append(strCOMArray, "大家", "你的")
			delete(strCOMArray, 0)
		fmt.Println("字符串:", strCOMArray[3])

			mylib.Hello()
			mylib.Hello2()
	*/
	InitDevice(true)

	DeviceMap2DeviceArray()

	//json转换开始
	var m_ComDeviceData ComDeviceData
	var m_WebSocketData WebSocketData
	m_ComDeviceData.Weight = "10"
	m_ComDeviceData.UnitPrice = "10"
	m_ComDeviceData.TotalPrice = "10"
	m_WebSocketData.Command = "COM"
	m_WebSocketData.Data = m_ComDeviceData

	/*
		u, _ := m_WebSocketData.Data.(ComDeviceData)
		fmt.Println("强制转换后的weight:", u.TotalPrice)
	*/

	/*
		st := &m_WebSocketData
		b, err := json.Marshal(st)

		stb := &WebSocketData{}
		err = json.Unmarshal(b, &stb)

		fmt.Println("weight:", stb.Command, string(b))
	*/
	//return
	//json转换结束

	m_LinkUserMap = make(map[*websocket.Conn]OneWebSocket)
	//go MyCOM(MyCOMReturn)
	//go MyTCP(MyTCPCallBack)

	//调用动态库
	/*
		var m_Data MyData
		dll32 := syscall.NewLazyDLL("GoDll.dll")
		println("call dll:", dll32.Name)
		InitDevice := dll32.NewProc("InitDevice")
		ret, _, _ := InitDevice.Call()
		println("get the result:", ret)

		GetString := dll32.NewProc("GetString")

		GetString.Call(uintptr(unsafe.Pointer(&m_Data)))
		println("iSize:", m_Data.iSize)
		ss := string(m_Data.data[0:])
		d := mahonia.NewDecoder("gbk")
		str := d.ConvertString(ss)

		println("string:", str)
	*/
	// 先把css和脚本服务上去
	http.Handle(CSS_CLIENT_PATH, http.FileServer(http.Dir(CSS_SVR_PATH)))
	http.Handle(DART_CLIENT_PATH, http.FileServer(http.Dir(DART_SVR_PATH)))
	http.Handle(CSS2_CLIENT_PATH, http.FileServer(http.Dir(CSS2_SVR_PATH)))

	// 网址与处理逻辑对应起来
	http.HandleFunc("/", HomePage)
	http.Handle("/ws", websocket.Handler(OnWebSocket))

	// 开始服务
	fmt.Println("服务启动端口:", HTTP_PORT)
	err := http.ListenAndServe(":"+HTTP_PORT, nil)
	if err != nil {
		fmt.Println("服务失败 /// ", err)
	} else {
		fmt.Println("服务已经启动端口:", HTTP_PORT)
	}
}

func WriteTemplateToHttpResponse(res http.ResponseWriter, t *template.Template) error {
	if t == nil || res == nil {
		return errors.New("WriteTemplateToHttpResponse: t must not be nil.")
	}
	var buf bytes.Buffer
	err := t.Execute(&buf, nil)
	if err != nil {
		return err
	}
	res.Header().Set("Content-Type", "text/html; charset=utf-8")
	_, err = res.Write(buf.Bytes())
	return err
}

func HomePage(res http.ResponseWriter, req *http.Request) {
	t, err := template.ParseFiles("web/main.html")
	if err != nil {
		fmt.Println(err)
		return
	}
	err = WriteTemplateToHttpResponse(res, t)
	if err != nil {
		fmt.Println(err)
		return
	}
}

func ActionBindEvent(ws *websocket.Conn, m_OneWebSocket OneWebSocket, data WebSocketData) bool {

	var m_EventInterface map[string]interface{} = data.Data.(map[string]interface{})
	var EventName string
	m_IEventName, bOK1 := m_EventInterface["EventName"]
	if !bOK1 {
		return false
	}
	EventName = m_IEventName.(string)
	var m_OneNETDevice NETDevice
	var bOK bool
	m_OneNETDevice, bOK = m_DeviceMap[data.DeviceUuid]
	if bOK {
		_, ok := m_OneNETDevice.m_EventMAP[EventName]
		if ok {
			//绑定事件处理
			m_OneWebSocket.m_RW.Lock()
			m_OneNETDevice.m_EventMAP[EventName].EventLinkArray[ws] = m_OneWebSocket
			m_OneWebSocket.m_RW.Unlock()
			return true
		} else {
			//绑定事件处理
			var m_WebSocketEventLink WebSocketEventLink
			m_OneWebSocket.m_RW.Lock()
			m_WebSocketEventLink.EventLinkArray = make(map[*websocket.Conn]OneWebSocket)
			m_WebSocketEventLink.EventLinkArray[ws] = m_OneWebSocket
			m_OneNETDevice.m_EventMAP[EventName] = m_WebSocketEventLink
			m_OneWebSocket.m_RW.Unlock()
			fmt.Println("绑定事件后", m_OneNETDevice.m_EventMAP)
			return true
		}
	} else {

		return false
	}

}
func ActionUnBindEvent(ws *websocket.Conn, m_OneWebSocket OneWebSocket, data WebSocketData) bool {
	var m_EventInterface map[string]interface{} = data.Data.(map[string]interface{})
	var EventName string
	m_IEventName, bOK1 := m_EventInterface["EventName"]
	if !bOK1 {
		return false
	}
	EventName = m_IEventName.(string)
	var m_OneNETDevice NETDevice
	var bOK bool
	m_OneNETDevice, bOK = m_DeviceMap[data.DeviceUuid]
	if bOK {
		_, ok := m_OneNETDevice.m_EventMAP[EventName]
		if ok {

			m_OneWebSocket.m_RW.Lock()
			delete(m_OneNETDevice.m_EventMAP[EventName].EventLinkArray, ws)
			m_OneWebSocket.m_RW.Unlock()
		}
		return true
	} else {
		return false
	}
}
func GZDataString(str string, nL int) string {
	var iL = len(str)
	if nL <= iL {
		str = Substr(str, 0, nL)
	} else {
		for i := 0; i < nL-iL; i++ {
			str = "0" + str
		}
	}
	return str
}
func SendDeviceCommand(ws *websocket.Conn, m_OneDevice NETDevice, Command string, sendString string) {
	if m_OneDevice.DeviceCommType == "COM" {

	} else if m_OneDevice.DeviceCommType == "TCP" {

		var m_TCPDeviceInfo TCPDeviceInfo = m_OneDevice.DeviceInfo.(TCPDeviceInfo)

		conn, err := net.DialTimeout("tcp", m_TCPDeviceInfo.IP+":4001", time.Second*10)
		if err != nil {
			fmt.Println("连接失败:", m_TCPDeviceInfo.IP+":4001")
			return //panic(err)
		}
		defer conn.Close()
		if err := conn.SetReadDeadline(time.Now().Add(time.Second * 4)); err != nil {
			return
		}
		m_sendbytes := []byte(sendString)
		fmt.Println("sendCommand", sendString)
		conn.Write(m_sendbytes)
		fmt.Println("开始读取")

		var returnString string
		reader := bufio.NewReader(conn)
		b := make([]byte, 1024*4)
		//for {
		n, err := reader.Read(b)
		if err != nil {
			m_OneDevice.LinkOBJ = nil
			//break
		} else {
			fmt.Printf("数据长度:%v", n)
			returnString = string(b[0:n])
			println("netstring:", returnString)

		}
		var m_WebSocketData WebSocketData
		m_WebSocketData.Command = Command
		m_WebSocketData.DeviceType = m_OneDevice.DeviceType
		m_WebSocketData.DeviceUuid = m_OneDevice.DeviceUuid
		var m_ReturnMessage ReturnMessage
		m_ReturnMessage.OK = false
		m_ReturnMessage.Msg = "未知错误"
		switch Command {

		case "CLEARPLU":
			if strings.Index(returnString, "0iaa0") != -1 {
				m_ReturnMessage.OK = true
				m_ReturnMessage.Msg = "清除PLU成功"
			} else {
				m_ReturnMessage.OK = false
				m_ReturnMessage.Msg = "清除PLU失败"
			}
		case "SETPLU":
			if strings.Index(returnString, "0v0001a0") != -1 {
				m_ReturnMessage.OK = true
				m_ReturnMessage.Msg = "设置PLU成功"
			} else {
				m_ReturnMessage.OK = false
				m_ReturnMessage.Msg = "设置PLU失败"
			}
		case "READPLU": //读取PLU
			if strings.Index(returnString, "0u") != -1 && strings.Index(returnString, "E\r\n") != -1 {
				m_ReturnMessage.OK = true
				m_ReturnMessage.Msg = "读取PLU成功"
				var m_OnePLU OnePLU
				m_OnePLU.PLUNum = Substr(returnString, 2, 4)
				m_OnePLU.GoodNum = Substr(returnString, 7, 7)
				m_OnePLU.Price = Substr(returnString, 14, 6)
				m_OnePLU.GoodType = Substr(returnString, 20, 1)
				if m_OnePLU.GoodType == "0" {
					m_OnePLU.GoodType = "称重"
				} else if m_OnePLU.GoodType == "1" {
					m_OnePLU.GoodType = "计件"
				} else if m_OnePLU.GoodType == "2" {
					m_OnePLU.GoodType = "定重"
				}

				m_OnePLU.Weight = Substr(returnString, 21+2+2+2+3+2+2+13, 5)

				m_OnePLU.ShopNo = Substr(returnString, 21+2+2+2+3, 2)

				//m_OnePLU.GoodName=Substr(returnString,21+2+2+2+3+2+2+13+5, )
				nB := strings.LastIndex(returnString, "B")
				nE := strings.LastIndex(returnString, "C")

				m_OnePLU.GoodName = Substr(returnString, nB+1, nE-nB-1)
				m_OnePLU.GoodName = QWCodeToUTF8(m_OnePLU.GoodName)
				m_ReturnMessage.MsgData = m_OnePLU

			} else {

				m_ReturnMessage.OK = false
				m_ReturnMessage.Msg = "读取PLU信息失败"

			}

		case "BACKREPORT": //回收报表
			if strings.Index(returnString, "0j") != -1 && strings.Index(returnString, "bc\r\n") != -1 {
				m_ReturnMessage.OK = true
				m_ReturnMessage.Msg = "回收报表成功"
				ss := Substr(returnString, 6, 2)
				if ss == "ac" {
					m_ReturnMessage.Msg = "无记录可回收"
				} else {
					var m_ReportOneRecord ReportOneRecord
					m_ReportOneRecord.RecordNum = Substr(returnString, 2, 4)
					m_ReportOneRecord.RecordTime = Substr(returnString, 2+4+1, 10)
					var sTime string = ""
					sTime = "20" + Substr(m_ReportOneRecord.RecordTime, 0, 2) + "年" + Substr(m_ReportOneRecord.RecordTime, 2, 2) + "月" + Substr(m_ReportOneRecord.RecordTime, 4, 2) + "日 " + Substr(m_ReportOneRecord.RecordTime, 6, 2) + "时" + Substr(m_ReportOneRecord.RecordTime, 8, 2) + "分"
					m_ReportOneRecord.RecordTime = sTime
					m_ReportOneRecord.DeptNo = Substr(returnString, 2+4+1+10, 2)
					m_ReportOneRecord.ShopNo = Substr(returnString, 2+4+1+12, 2)
					m_ReportOneRecord.PLUNum = Substr(returnString, 2+4+1+12+2, 4)
					m_ReportOneRecord.Weight = Substr(returnString, 2+4+1+12+2+4, 6)
					d, _ := strconv.Atoi(m_ReportOneRecord.Weight)
					var fWeight float32 = float32(float32(d) / 10000.0)
					m_ReportOneRecord.Weight = fmt.Sprint(fWeight, "kg")

					m_ReportOneRecord.Price = Substr(returnString, 2+4+1+12+2+4+6, 6)
					d, _ = strconv.Atoi(m_ReportOneRecord.Price)
					var fPrice float32 = float32(float32(d) / 1000.0)
					m_ReportOneRecord.Price = fmt.Sprint(fPrice, "元/kg")

					m_ReportOneRecord.Total = Substr(returnString, 2+4+1+12+2+4+6+6, 7)
					d, _ = strconv.Atoi(m_ReportOneRecord.Total)
					var fTotal float32 = float32(float32(d) / 1000.0)
					m_ReportOneRecord.Total = fmt.Sprint(fTotal, "元")

					m_ReportOneRecord.DiscountTotal = Substr(returnString, 2+4+1+12+2+4+6+6+7, 7)

					d, _ = strconv.Atoi(m_ReportOneRecord.DiscountTotal)
					var fDiscountTotal float32 = float32(float32(d) / 1000.0)
					m_ReportOneRecord.DiscountTotal = fmt.Sprint(fDiscountTotal, "元")

					m_ReportOneRecord.BalanceNum = Substr(returnString, 2+4+1+12+2+4+6+6+7+7+10, 2)
					m_ReturnMessage.MsgData = m_ReportOneRecord

				}

			} else {
				if strings.Index(returnString, "ac") != -1 {
					m_ReturnMessage.Msg = "无记录可回收"
					m_ReturnMessage.OK = true

				} else {
					m_ReturnMessage.OK = false
					m_ReturnMessage.Msg = "回收报表失败"
				}
			}
		case "CLAERREPORT": //清除报表
			if strings.Index(returnString, "0ha\r\n") != -1 {
				m_ReturnMessage.OK = true
				m_ReturnMessage.Msg = "清除报表成功"
			} else {
				m_ReturnMessage.OK = false
				m_ReturnMessage.Msg = "清除报表失败"

			}

		case "SETTIME": //校时
			if strings.Index(returnString, "0p\r\n") != 1 {
				m_ReturnMessage.OK = true
				m_ReturnMessage.Msg = "设置时间成功"
			} else {
				m_ReturnMessage.OK = false
				m_ReturnMessage.Msg = "设置时间失败"

			}

		}
		m_WebSocketData.Data = m_ReturnMessage
		if err = websocket.JSON.Send(ws, m_WebSocketData); err != nil {

		} else {
			bb, err1 := json.Marshal(m_WebSocketData)
			str := string(bb)
			if err1 == nil {
				fmt.Println("向客户端发送:", str)
			}
		}

		//}
		fmt.Printf("与服务器断开连接\n")
		//conn.Close()
		if err := conn.SetReadDeadline(time.Time{}); err != nil {

		}

	}

}
func OnWebSocket(ws *websocket.Conn) {
	defer ws.Close()
	var data WebSocketData
	var err error
	var str string
	ss := ws.LocalAddr().String()
	fmt.Println("连接上来WebSocket", ss)
	if strings.Index(ss, "ws://localhost") == -1 && strings.Index(ss, "ws://127.0.0.1") == -1 {
		data.Command = "KILL"
		if err = websocket.JSON.Send(ws, data); err != nil {

		}
		ws.Close()
		return
	}
	m_LinkRW.Lock()
	var m_OneWebSocket OneWebSocket
	m_LinkUserMap[ws] = m_OneWebSocket

	data.Command = "LISTDEVICE"
	data.Data = m_NETDeviceArray

	bArray, _ := json.Marshal(data)

	fmt.Println("m_NETDeviceArray :%v", string(bArray))

	if err = websocket.JSON.Send(ws, data); err != nil {

	} else {
		bb, err1 := json.Marshal(data)
		str = string(bb)
		if err1 == nil {
			fmt.Println("向客户端发送:", str)
		}
	}
	m_LinkRW.Unlock()
	for {
		/*
			if err = websocket.Message.Receive(ws, &str); err != nil {
				break
			} else {
				fmt.Println("从客户端收到:", str)
			}

			str = "hello, I'm server."

			if err = websocket.Message.Send(ws, str); err != nil {
				break
			} else {
				fmt.Println("向客户端发送:", str)
			}
		*/
		data.Command = ""
		data.Data = nil
		if err = websocket.JSON.Receive(ws, &data); err != nil {
			break
		} else {
			if data.Command != "" {
				fmt.Println("从客户端收到命令:", data.Command)
			}
			if data.Data != nil {
				fmt.Println("从客户端收到数据:", data.Data)
			}
			switch data.Command {
			case "HEART":
				if err = websocket.JSON.Send(ws, data); err != nil {

					break
				}
			case "BINDEVENT":
				if ActionBindEvent(ws, m_OneWebSocket, data) {
					data.Data = "true"
					if err = websocket.JSON.Send(ws, data); err != nil {

						break
					}

				}
			case "UNBINDEVENT":
				if ActionUnBindEvent(ws, m_OneWebSocket, data) {
					data.Data = "true"
					if err = websocket.JSON.Send(ws, data); err != nil {

						break
					}

				}
			case "SEARCHDEVICE":

				m_SearchRW.Lock()
				bGlobalSearchDevice = true
				m_LinkRW.Lock()
				// 遍历map
				for k, _ := range m_DeviceMap {

					delete(m_DeviceMap, k)
				}
				m_LinkRW.Unlock()
				time.Sleep(2000000000)
				fmt.Println("发送:LISTDEVICE")
				bGlobalSearchDevice = false
				searchTPCDevic()
				InitDevice(false)
				m_LinkRW.Lock()
				DeviceMap2DeviceArray()
				data.Command = "LISTDEVICE"
				data.Data = m_NETDeviceArray
				if err = websocket.JSON.Send(ws, data); err != nil {
					m_LinkRW.Unlock()
					m_SearchRW.Unlock()
					break

				} else {

				}

				m_LinkRW.Unlock()
				m_SearchRW.Unlock()
			case "SETVISUAL":
				m_LinkRW.Lock()
				// 遍历map
				for k, _ := range m_DeviceMap {

					delete(m_DeviceMap, k)
				}
				m_LinkRW.Unlock()
				fmt.Println("清除原来设备完毕", m_DeviceMap)
				bGlobalVisual = true
				InitDevice(false)
				m_LinkRW.Lock()
				DeviceMap2DeviceArray()
				data.Command = "LISTDEVICE"
				data.Data = m_NETDeviceArray
				if err = websocket.JSON.Send(ws, data); err != nil {
					m_LinkRW.Unlock()
					break

				} else {

				}

				m_LinkRW.Unlock()
				fmt.Println("DeviceMap:", m_DeviceMap)

			case "NOVISUAL":
				fmt.Println("清除原来设备")
				m_LinkRW.Lock()
				// 遍历map
				for k, _ := range m_DeviceMap {

					delete(m_DeviceMap, k)
				}
				m_LinkRW.Unlock()

				fmt.Println("清除原来设备完毕", m_DeviceMap)
				bGlobalVisual = false
				InitDevice(false)
				fmt.Println("发送设备")
				m_LinkRW.Lock()
				DeviceMap2DeviceArray()
				data.Command = "LISTDEVICE"
				data.Data = m_NETDeviceArray
				fmt.Println("发送设备...")
				if err = websocket.JSON.Send(ws, data); err != nil {
					m_LinkRW.Unlock()
					break

				} else {

				}

				m_LinkRW.Unlock()
			case "SETPLU":

				fmt.Println("设置PLU", data)
				m_LinkRW.Lock()
				m_OneDevice, _ok := m_DeviceMap[data.DeviceUuid]
				m_OneDevice.LinkOBJ = 1
				if bGlobalVisual {
					m_OneDevice.LinkOBJ = 1
				}
				if _ok && m_OneDevice.LinkOBJ != nil {
					var stringByte string = "!0V"
					var m_DataInterface map[string]interface{} = data.Data.(map[string]interface{})
					var TStr string
					sPLUNum, bOK1 := m_DataInterface["sPLUNum"]
					if !bOK1 {

					} else {

						TStr = sPLUNum.(string)
						TStr = GZDataString(TStr, 4)
						stringByte += TStr
						stringByte += "A"

						sGoodNum, bOK1 := m_DataInterface["sGoodNum"]
						if !bOK1 {

						} else {
							TStr = sGoodNum.(string)
							TStr = GZDataString(TStr, 7)
							stringByte += TStr

							sPrice, bOK1 := m_DataInterface["sPrice"]
							if !bOK1 {

							} else {
								TStr = sPrice.(string)
								TStr = GZDataString(TStr, 6)
								stringByte += TStr

								sGoodType, bOK1 := m_DataInterface["sGoodType"]
								if !bOK1 {

								} else {
									TStr = sGoodType.(string)
									if TStr == "WEIGHT" {
										stringByte += "0"
									} else if TStr == "COUNT" {
										stringByte += "1"
									} else if TStr == "DOTWEIGHT" {
										stringByte += "3"
									}
									stringByte += "00" //特殊信息1
									stringByte += "00" //特殊信息2
									stringByte += "00" //特殊信息3

									stringByte += "000" //有效期

									sShopNo, bOK1 := m_DataInterface["sShopNo"]
									if !bOK1 {

									} else {
										TStr = sShopNo.(string)
										TStr = GZDataString(TStr, 2)
										stringByte += TStr

										stringByte += "00"            //部门
										stringByte += "0000000000000" //为13位数字代号

										sWeight, bOK1 := m_DataInterface["sWeight"]
										if !bOK1 {

										} else {
											TStr = sWeight.(string)
											TStr = GZDataString(TStr, 5)
											stringByte += TStr //皮重

											stringByte += "00" //标签号

											stringByte += "00" //是否打折

											stringByte += "00" //第一时间段
											stringByte += "00"
											stringByte += "00"

											stringByte += "00" //第二时间段
											stringByte += "00"
											stringByte += "00"

											stringByte += "00" //第三时间段
											stringByte += "00"
											stringByte += "00"

											stringByte += "00" //第四时间段
											stringByte += "00"
											stringByte += "00"

											stringByte += "B" //为分隔符

											sGoodName, bOK1 := m_DataInterface["sGoodName"]
											if !bOK1 {

											} else {
												TStr = sGoodName.(string)
												stringByte += UTF8ToQWCode(TStr)
												stringByte += "CDE\r\n"
												fmt.Println("开始发送:", stringByte)
												m_LinkRW.Unlock()
												SendDeviceCommand(ws, m_OneDevice, "SETPLU", stringByte)
												m_LinkRW.Lock()
												/*
													var m_OneDeviceWork OneDeviceWork
													m_OneDeviceWork.Command = "SETPLU"
													m_OneDeviceWork.SendString = stringByte
													fmt.Println("SendString:", m_OneDeviceWork.SendString)
													m_OneDeviceWork.conn = ws
													m_OneDevice.DeviceWorkPtr = append(m_OneDevice.DeviceWorkPtr, m_OneDeviceWork)
												*/
											}

										}

									}
								}

							}

						}
					}

					//var m_TCP net.Conn = oneDevice.LinkOBJ.(net.Conn)
					//m_TCP.Write([]byte(stringByte))

				} else {

					fmt.Println("所有设备:", m_DeviceMap)
					fmt.Println("未找到设备:", data.DeviceUuid)
				}

				m_LinkRW.Unlock()
			case "READPLU":
				fmt.Println("读取PLU", data)
				m_LinkRW.Lock()
				m_OneDevice, _ok := m_DeviceMap[data.DeviceUuid]
				m_OneDevice.LinkOBJ = 1
				if bGlobalVisual {
					m_OneDevice.LinkOBJ = 1
				}
				if _ok && m_OneDevice.LinkOBJ != nil {

					var m_DataInterface map[string]interface{} = data.Data.(map[string]interface{})
					var TStr string = "1"
					sPLUNum, bOK1 := m_DataInterface["sPLUNum"]
					if !bOK1 {

					} else {
						TStr = sPLUNum.(string)
					}
					var readPLUString string = mylib.GetReadPLUString(TStr)
					m_LinkRW.Unlock()
					SendDeviceCommand(ws, m_OneDevice, "READPLU", readPLUString)
				} else {
					m_LinkRW.Unlock()
				}
			case "CLEARPLU":
				fmt.Println("清空PLU", data)
				m_LinkRW.Lock()
				m_OneDevice, _ok := m_DeviceMap[data.DeviceUuid]
				m_OneDevice.LinkOBJ = 1
				if bGlobalVisual {
					m_OneDevice.LinkOBJ = 1
				}
				if _ok && m_OneDevice.LinkOBJ != nil {

					var ClearPLUString string = mylib.GetClearPLUString()
					m_LinkRW.Unlock()
					SendDeviceCommand(ws, m_OneDevice, "CLEARPLU", ClearPLUString)
				} else {
					m_LinkRW.Unlock()
				}

			case "BACKREPORT":
				fmt.Println("回收报表", data)
				m_LinkRW.Lock()
				m_OneDevice, _ok := m_DeviceMap[data.DeviceUuid]
				m_OneDevice.LinkOBJ = 1
				if bGlobalVisual {
					m_OneDevice.LinkOBJ = 1
				}
				if _ok && m_OneDevice.LinkOBJ != nil {

					var m_DataInterface map[string]interface{} = data.Data.(map[string]interface{})
					var TStr string = "1"
					sReportNO, bOK1 := m_DataInterface["sReportNO"]
					if !bOK1 {

					} else {
						TStr = sReportNO.(string)
					}

					var BackReportString string = mylib.GetBackReportString(TStr)
					m_LinkRW.Unlock()
					SendDeviceCommand(ws, m_OneDevice, "BACKREPORT", BackReportString)
				} else {
					m_LinkRW.Unlock()
				}

			case "CLEARREPORT":
				fmt.Println("清除报表", data)
				m_LinkRW.Lock()
				m_OneDevice, _ok := m_DeviceMap[data.DeviceUuid]
				m_OneDevice.LinkOBJ = 1
				if bGlobalVisual {
					m_OneDevice.LinkOBJ = 1
				}
				if _ok && m_OneDevice.LinkOBJ != nil {

					var ClearReportString string = mylib.GetClearReportString()
					m_LinkRW.Unlock()
					SendDeviceCommand(ws, m_OneDevice, "CLEARREPORT", ClearReportString)
				} else {
					m_LinkRW.Unlock()
				}
			case "SETTIME":
				fmt.Println("设置时间", data)
				m_LinkRW.Lock()
				m_OneDevice, _ok := m_DeviceMap[data.DeviceUuid]
				m_OneDevice.LinkOBJ = 1
				if bGlobalVisual {
					m_OneDevice.LinkOBJ = 1
				}
				if _ok && m_OneDevice.LinkOBJ != nil {

					var NowTimeString string = mylib.GetNowTimeString()
					m_LinkRW.Unlock()
					SendDeviceCommand(ws, m_OneDevice, "SETTIME", NowTimeString)
				} else {
					m_LinkRW.Unlock()
				}

			default:

			}
		}

		/*
			str = "hello, I'm server.JsonString"
			data.Msg = str
		*/

	}
	fmt.Println("客户端断开连接")
	m_LinkRW.Lock()
	delete(m_LinkUserMap, ws)
	for _, m_TOneDevice := range m_DeviceMap {
		for _, m_WebSocketEventLink := range m_TOneDevice.m_EventMAP {
			_, bOK := m_WebSocketEventLink.EventLinkArray[ws]
			if bOK {
				delete(m_WebSocketEventLink.EventLinkArray, ws)
			}

		}
	}

	m_LinkRW.Unlock()
}

//测试反射
func TestFS() {
	hl := hello
	hl()
	fv := reflect.ValueOf(hl)
	fmt.Println("fv is reflect.Func ?", fv.Kind() == reflect.Func)
	fv.Call(nil)
	TestFS2()
	TestFS3()

}
func TestFS2() {
	fv := reflect.ValueOf(prints)
	params := make([]reflect.Value, 1)                 //参数
	params[0] = reflect.ValueOf(20)                    //参数设置为20
	rs := fv.Call(params)                              //rs作为结果接受函数的返回值
	fmt.Println("result:", rs[0].Interface().(string)) //当然也可以直接是rs[0].Interface()
}
func hello() {
	fmt.Println("Hello world!")
}
func prints(i int) string {
	fmt.Println("i =", i)
	return strconv.Itoa(i)
}

type MyType struct {
	i    int
	name string
}

func (mt *MyType) SetI(i int) {
	mt.i = i
}

func (mt *MyType) SetName(name string) {
	mt.name = name
}

func (mt *MyType) String() string {
	return fmt.Sprintf("%p", mt) + "--name:" + mt.name + " i:" + strconv.Itoa(mt.i)
}

func TestFS3() {
	myType := &MyType{22, "wowzai"}
	//fmt.Println(myType)     //就是检查一下myType对象内容
	//println("---------------")
	mtV := reflect.ValueOf(&myType).Elem()
	fmt.Println("Before:", mtV.MethodByName("String").Call(nil)[0])
	params := make([]reflect.Value, 1)
	params[0] = reflect.ValueOf(18)
	mtV.MethodByName("SetI").Call(params)
	params[0] = reflect.ValueOf("reflection test")
	mtV.MethodByName("SetName").Call(params)
	fmt.Println("After:", mtV.MethodByName("String").Call(nil)[0])
}

func TestFS4() {

	var m_TCPPack mylib.TCPPack
	m_TCPPack.Name = "你哈"
}

/*
import (
    "bytes"
    "code.google.com/p/go.text/encoding/simplifiedchinese"
    "code.google.com/p/go.text/transform"
    "io/ioutil"
)

func Decode(s []byte) ([]byte, error) {  //gbk汉字byte[] 转utf8 的byte[]
    I := bytes.NewReader(s)
    O := transform.NewReader(I, simplifiedchinese.GBK.NewDecoder())
    d, e := ioutil.ReadAll(O)
    if e != nil {
        return nil, e
    }
    return d, nil
}

func Encode(s []byte) ([]byte, error) { //utf8的byte[] 转gbk的byte[]
    I := bytes.NewReader(s)
    O := transform.NewReader(I, simplifiedchinese.GBK.NewEncoder())
    d, e := ioutil.ReadAll(O)
    if e != nil {
        return nil, e
    }
    return d, nil
}
复制代码
*/
package mylib

import (
	"fmt"
	"time"
)

type TCPPack struct {
	Name string
}

func Hello() {
	fmt.Println("我在库里")
}
func (T *TCPPack) TCPFunction(a, b int) int {
	return a + b

}
func Substr(str string, start, length int) string {
	rs := []rune(str)
	rl := len(rs)
	end := 0

	if start < 0 {
		start = rl - 1 + start
	}
	end = start + length

	if start > end {
		start, end = end, start
	}

	if start < 0 {
		start = 0
	}
	if start > rl {
		start = rl
	}
	if end < 0 {
		end = 0
	}
	if end > rl {
		end = rl
	}
	str0 := string(rs[start:end])
	rs = nil
	return str0
}
func DataString(str string, nL int) string {

	var iL int = len(str)
	if nL <= iL {
		str = Substr(str, 0, nL)
	} else {
		for i := 0; i < nL-iL; i++ {
			str = "0" + str
		}
	}

	return str
}
func GetClearPLUString() string {

	return "!0IA\r\n"
}
func GetClearReportString() string {
	return "!0HA\r\n"
}
func GetBackReportString(strNO string) string {

	return "!0J" + DataString(strNO, 4) + "A\r\n"
}

func GetReadPLUString(strPLU string) string {
	return "!0U" + DataString(strPLU, 4) + "A\r\n"
}
func GetNowTimeString() string {

	var tTime time.Time = time.Now()
	//var m_M time.Month = tTime.Month()

	return fmt.Sprintf("!0P%02d%02d%02d%02d%02d\r\n", tTime.Year()-2000, (int)(tTime.Month()), tTime.Day(), tTime.Hour(), tTime.Minute())
	return ""
}


Top