comm.go 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024
  1. package comm
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "encoding/hex"
  6. "fmt"
  7. MQTT "github.com/eclipse/paho.mqtt.golang"
  8. "github.com/jacobsa/go-serial/serial"
  9. "github.com/kptyun/KPTCOMM/pkg/setting"
  10. "github.com/kptyun/KPTCOMM/routers/restful"
  11. "github.com/recoilme/slowpoke"
  12. "github.com/siddontang/go-log/log"
  13. "math"
  14. //"github.com/xormplus/xorm"
  15. "io"
  16. "net"
  17. "strings"
  18. "sync"
  19. "time"
  20. )
  21. // 一个已经被关闭的channel不会阻塞,已经被关闭的channel会实时返回
  22. // goroutine退出,关闭done来进行广播
  23. var needEscape int
  24. var my_comport io.ReadWriteCloser
  25. var my_Controlcomport io.ReadWriteCloser
  26. var SrcAdd []byte
  27. var commop string = ""
  28. var delaysendcommop int = 0
  29. var Boastaddr *net.UDPAddr
  30. var Logger *log.Logger
  31. var StopCharP chan int
  32. // var ProcessKeyP chan []byte
  33. var ProcessKeyPstr chan []string
  34. var BroadcastBuf chan []byte
  35. var file string
  36. var RunTMRList sync.Map
  37. var MbTable = []uint16{
  38. 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
  39. 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
  40. 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
  41. 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
  42. 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
  43. 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
  44. 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
  45. 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
  46. 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
  47. 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
  48. 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
  49. 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
  50. 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
  51. 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
  52. 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
  53. 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
  54. 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
  55. 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
  56. 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
  57. 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
  58. 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
  59. 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
  60. 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
  61. 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
  62. 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
  63. 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
  64. 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
  65. 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
  66. 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
  67. 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
  68. 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
  69. 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040}
  70. func CheckSum(data []byte) uint16 {
  71. var crc16 uint16
  72. crc16 = 0xffff
  73. for _, v := range data {
  74. n := uint8(uint16(v) ^ crc16)
  75. crc16 >>= 8
  76. crc16 ^= MbTable[n]
  77. }
  78. return crc16
  79. }
  80. func getBoastaddr() *net.UDPAddr {
  81. tempaddr, err := net.ResolveUDPAddr("udp4", "255.255.255.255:8800")
  82. if err != nil {
  83. Logger.Errorf("%s \r\n", err)
  84. return tempaddr
  85. }
  86. if strings.TrimSpace(setting.ServerSetting.Netcard) != "" {
  87. interfaces, err := net.Interfaces()
  88. if err != nil {
  89. Logger.Errorf("%s \r\n", err)
  90. return tempaddr
  91. }
  92. for _, i := range interfaces {
  93. byName, err := net.InterfaceByName(i.Name)
  94. if err != nil {
  95. Logger.Errorf("%s \r\n", err)
  96. return tempaddr
  97. }
  98. if byName.Name == strings.TrimSpace(setting.ServerSetting.Netcard) {
  99. addresses, _ := byName.Addrs()
  100. for _, v := range addresses {
  101. if ipnet, ok := v.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
  102. if ipnet.IP.To4() != nil {
  103. ipmask := fmt.Sprintf("%d.%d.%d.%d:%d",
  104. ipnet.IP[12], ipnet.IP[13], ipnet.IP[14], 255, setting.ServerSetting.Broadcast)
  105. tempaddr, err = net.ResolveUDPAddr("udp4", ipmask)
  106. if err != nil {
  107. tempaddr, err = net.ResolveUDPAddr("udp4", "255.255.255.255:8800")
  108. if err != nil {
  109. Logger.Errorf("%s \r\n", err)
  110. return tempaddr
  111. }
  112. } else {
  113. //Logger.Infof("%s %s \r\n", "发现本机IP:", fmt.Sprintf("%d.%d.%d.%d", ipnet.IP[12], ipnet.IP[13], ipnet.IP[14], ipnet.IP[15]))
  114. return tempaddr
  115. break
  116. }
  117. }
  118. }
  119. }
  120. }
  121. }
  122. }
  123. return tempaddr
  124. }
  125. func CommStrValidate(rebus []byte) bool {
  126. var ResI byte
  127. ResI = 0
  128. for i, value := range rebus {
  129. if i < len(rebus)-1 {
  130. ResI = ResI + value
  131. }
  132. }
  133. ResI = 0xFF - ResI
  134. return ResI == rebus[len(rebus)-1]
  135. }
  136. func getDateTime(buf []byte) time.Time {
  137. dataTime := time.Date(2000+int(buf[0]>>2),
  138. time.Month(((buf[0]&0x03)<<2)|(buf[1]>>6)),
  139. int((buf[1]&0x3E)>>1),
  140. int(((buf[1]&0x01)<<4)|(buf[2]>>4)),
  141. int(((buf[2]&0x0F)<<2)|(buf[3]>>6)),
  142. int(buf[3]&0x3F),
  143. 0,
  144. time.Local)
  145. return dataTime
  146. }
  147. func getWeight(buf1, byte2, byte3 byte) float64 {
  148. ws := int16((byte3 & 96) >> 5)
  149. x := int16(buf1)<<8 | int16(byte2)
  150. if (byte3 >> 7) == 1 {
  151. x = -1 * x
  152. }
  153. s := float64(x)
  154. for i := int16(0); i < ws; i++ {
  155. s = s / 10
  156. }
  157. return s
  158. }
  159. func getSendTailer() byte {
  160. key := []byte("SendTailer")
  161. val, err := slowpoke.Get(file, key)
  162. if err != nil {
  163. val, err = slowpoke.Get(file, key)
  164. }
  165. if val == nil {
  166. val = make([]byte, 1)
  167. val[0] = 1
  168. } else {
  169. val[0] = val[0] + 1
  170. if val[0] > 0x0F {
  171. val[0] = 0
  172. }
  173. }
  174. err = slowpoke.Set(file, key, val)
  175. if err != nil {
  176. Logger.Errorf("%s \r\n", err)
  177. }
  178. return val[0]
  179. }
  180. func getF8(InSrcAddr byte, OriSendId byte) []byte {
  181. var p1, p2, p3, p4, temps byte
  182. year := byte(time.Now().Local().Year() % 2000)
  183. month := byte(time.Now().Local().Month())
  184. day := byte(time.Now().Local().Day())
  185. hour := byte(time.Now().Local().Hour())
  186. minute := byte(time.Now().Local().Minute())
  187. second := byte(time.Now().Local().Second())
  188. p1 = (year << 2) | (month >> 2)
  189. p2 = ((month & 0x03) << 6) | ((day & 0x1F) << 1) | ((hour & 0x3F) >> 4)
  190. p3 = ((hour & 0x0F) << 4) | ((minute & 0x3F) >> 2)
  191. p4 = ((minute & 0x03) << 6) | (second & 0x3F)
  192. buf := make([]byte, 0)
  193. buf = append(buf, 0x7e)
  194. buf = append(buf, 0x08)
  195. buf = append(buf, InSrcAddr)
  196. buf = append(buf, 0x18)
  197. buf = append(buf, p1)
  198. buf = append(buf, p2)
  199. buf = append(buf, p3)
  200. buf = append(buf, p4)
  201. tempTailer := getSendTailer()
  202. buf = append(buf, ((OriSendId&0x0F)<<8)|(tempTailer&0x0F))
  203. temps = 0
  204. for _, i2 := range buf {
  205. temps = temps + i2
  206. }
  207. buf = append(buf, 0xFF-temps)
  208. return buf
  209. }
  210. func duplicateValidate(recbuf []byte) ([]byte, []byte, bool) {
  211. key := make([]byte, 1)
  212. val := make([]byte, 2)
  213. key[0] = recbuf[2]
  214. if recbuf[3] < 240 {
  215. val[1] = recbuf[3] + 16
  216. } else {
  217. val[1] = recbuf[3]
  218. }
  219. if recbuf[1] < byte(len(recbuf)) {
  220. val[0] = recbuf[recbuf[1]]
  221. }
  222. oldval, err := slowpoke.Get(file, key)
  223. if err != nil {
  224. Logger.Errorf("%s %s\r\n", file, err)
  225. oldval, err = slowpoke.Get(file, key)
  226. }
  227. if oldval == nil {
  228. val[0] = 0
  229. val[1] = 0
  230. return key, val, true
  231. }
  232. return key, val, (oldval[0] != val[0]) || (oldval[1] != val[1])
  233. }
  234. func saveduplicateValidate(key []byte, val []byte) {
  235. err := slowpoke.Set(file, key, val)
  236. if err != nil {
  237. Logger.Errorf("%s \r\n", err)
  238. }
  239. }
  240. func processWeight(InSrcAddr byte, recbuf []byte) error {
  241. sParams := make([]interface{}, 0)
  242. sParams = append(sParams, InSrcAddr)
  243. sParams = append(sParams, getDateTime(recbuf[:4]))
  244. sParams = append(sParams, getWeight(recbuf[4], recbuf[5], recbuf[6]))
  245. _, err := restful.ExecQuerySqlx("select ProcTimeWeight(?,?,?)", sParams)
  246. if err != nil {
  247. Logger.Errorf("%s \r\n", err)
  248. }
  249. return err
  250. }
  251. func RunsendBuf() {
  252. defer func() {
  253. // 发生宕机时,获取panic传递的上下文并打印
  254. if err := recover(); err != nil {
  255. fmt.Println("RunsendBuf出错:", err)
  256. StopCharP <- 1
  257. }
  258. }()
  259. for {
  260. tmpstr := <-ProcessKeyPstr
  261. if len(tmpstr[0]) > 0 {
  262. err := sendBuf(tmpstr, nil)
  263. //println("recbuf",tmpstr)
  264. if err != nil {
  265. //goto openSerial
  266. StopCharP <- 1
  267. time.Sleep(10 * time.Millisecond)
  268. //RunTMRList = make(map[byte]int, 200)
  269. go OpenComm()
  270. }
  271. }
  272. }
  273. }
  274. func RunbroadBuf() {
  275. var err error
  276. var conn *net.UDPConn
  277. var intvalue int
  278. errT := 0
  279. for {
  280. recbuf := <-BroadcastBuf
  281. if setting.ServerSetting.ControlComm > 0 {
  282. my_Controlcomport, err = serial.Open(*setting.ControlCommSetting)
  283. if err != nil {
  284. Logger.Errorf("%s %s %s %s\r\n", setting.ControlCommSetting.PortName, "打开继电器串口错误: ", setting.CommSetting.PortName, err)
  285. if setting.DatabaseSetting.Showlog {
  286. fmt.Println(time.Now().Format("2006-01-02 15:04:05"), "打开继电器串口错误: ", setting.CommSetting.PortName, err)
  287. }
  288. } else {
  289. // Logger.Infof("%s %s\r\n", setting.ControlCommSetting.PortName, "打开继电器成功")
  290. if (recbuf[6] == 0xCB) && (recbuf[7] == 0xAE) {
  291. intvalue = 0
  292. for i := 0; i <= 5; i++ {
  293. if recbuf[21-i] != 0x20 {
  294. intvalue = intvalue + int(recbuf[21-i]-0x30)*int(math.Floor(math.Pow10(i)))
  295. } else {
  296. break
  297. }
  298. }
  299. _, err = my_Controlcomport.Write(SetCoil(1, recbuf[2]-1,
  300. (recbuf[14] == 0xC9) && (recbuf[15] == 0xD9) && (intvalue > setting.ServerSetting.RelayDev)))
  301. if err != nil {
  302. Logger.Errorf("%s %s: %s\r\n", "写继电器串口错误: ", setting.ControlCommSetting.PortName, err)
  303. if setting.DatabaseSetting.Showlog {
  304. fmt.Println(time.Now().Format("2006-01-02 15:04:05"), "写继电器串口错误: ", setting.ControlCommSetting.PortName, err)
  305. }
  306. }
  307. if setting.DatabaseSetting.Showlog {
  308. fmt.Println(time.Now().Format("2006-01-02 15:04:05"), recbuf[2]-1, " ", intvalue, " ", setting.ServerSetting.RelayDev, " ",
  309. (recbuf[14] == 0xC9) && (recbuf[15] == 0xD9) && (intvalue > setting.ServerSetting.RelayDev))
  310. }
  311. } else {
  312. _, err = my_Controlcomport.Write(SetCoil(1, recbuf[2]-1, false))
  313. if err != nil {
  314. Logger.Errorf("%s %s: %s\r\n", "写继电器串口错误: ", setting.ControlCommSetting.PortName, err)
  315. if setting.DatabaseSetting.Showlog {
  316. fmt.Println(time.Now().Format("2006-01-02 15:04:05"), "写继电器串口错误: ", setting.ControlCommSetting.PortName, err)
  317. }
  318. }
  319. }
  320. _ = my_Controlcomport.Close()
  321. }
  322. }
  323. if setting.ServerSetting.Broadcast > 0 {
  324. Boastaddr, err = net.ResolveUDPAddr("udp4", fmt.Sprintf("%s:%d", setting.ServerSetting.BroadcastAddr, setting.ServerSetting.Broadcast))
  325. if err != nil && errT == 0 {
  326. Boastaddr = getBoastaddr()
  327. }
  328. }
  329. if Boastaddr != nil {
  330. if errT == 0 {
  331. conn, err = net.DialUDP("udp4", nil, Boastaddr)
  332. if err != nil {
  333. Logger.Errorf("%s \r\n", err)
  334. errT = 1
  335. } else {
  336. if len(recbuf) > 0 {
  337. _, err := conn.Write(recbuf)
  338. if err != nil {
  339. Logger.Errorf("%s \r\n", err)
  340. errT = 1
  341. _ = conn.Close()
  342. }
  343. }
  344. }
  345. }
  346. }
  347. }
  348. }
  349. func processKey0(recbuf []byte) error {
  350. var err error
  351. InSrcAddr := recbuf[2]
  352. s := time.Now()
  353. if recbuf[3] == 0xF0 || recbuf[3] == 0xE0 {
  354. for i := 0; i < int((recbuf[1]-4)/7); i++ {
  355. err = processWeight(InSrcAddr, recbuf[4+(i*7):4+(i+1)*7])
  356. // break
  357. }
  358. }
  359. if setting.DatabaseSetting.ShowXormlog {
  360. println("processKey0=================", time.Now().Sub(s).Milliseconds())
  361. }
  362. return err
  363. }
  364. func processKey1(recbuf []byte) (string, error) {
  365. sParams := make([]interface{}, 0)
  366. s := time.Now()
  367. InSrcAddr := recbuf[2]
  368. InTime := getDateTime(recbuf[4:8])
  369. BeginWeight := getWeight(recbuf[8], recbuf[9], recbuf[12])
  370. endWeight := getWeight(recbuf[10], recbuf[11], recbuf[12])
  371. InButtonType := recbuf[3]
  372. OriSendId := recbuf[15]
  373. LastSortID := recbuf[13]
  374. LastInorOut := recbuf[14]
  375. sParams = append(sParams, InSrcAddr)
  376. sParams = append(sParams, InTime)
  377. sParams = append(sParams, endWeight)
  378. _, err := restful.ExecQuerySqlx("select ProcTimeWeight(?,?,?)", sParams)
  379. if err != nil {
  380. Logger.Errorf("%s \r\n", err)
  381. }
  382. sParams = append(sParams[:0])
  383. sParams = append(sParams, InSrcAddr)
  384. sParams = append(sParams, InTime)
  385. sParams = append(sParams, InButtonType)
  386. sParams = append(sParams, OriSendId)
  387. sParams = append(sParams, BeginWeight)
  388. sParams = append(sParams, endWeight)
  389. sParams = append(sParams, LastSortID)
  390. sParams = append(sParams, LastInorOut)
  391. //InObjAddr INTEGER, InSrcAddr INTEGER,InTime DATETIME,InButtonType INTEGER,OriSendId INTEGER,
  392. // OldWeight DOUBLE,NewestWeight DOUBLE,LastSortID INTEGER,LastInorOut INTEGER
  393. queryResult, err := restful.QueryByListv2Sqlx("select ProcNewButton(0,?,?,?,?,?,?,?,?) as resultstr", 0, 1, sParams)
  394. if err == nil {
  395. returnmsgmap, _ := queryResult.(map[string]interface{})
  396. returnmsgmap1, _ := returnmsgmap["rows"].([]map[string]interface{})
  397. if len(returnmsgmap1) > 0 {
  398. switch returnmsgmap1[0]["resultstr"].(type) {
  399. case string:
  400. if setting.DatabaseSetting.ShowXormlog {
  401. println("processKey1=================", time.Now().Sub(s).Milliseconds())
  402. }
  403. return returnmsgmap1[0]["resultstr"].(string), nil
  404. }
  405. }
  406. }
  407. return "", err
  408. }
  409. func delcommop(lastCommop string) error {
  410. tx, err := restful.Dbs.Beginx()
  411. if err != nil {
  412. fmt.Println("GetT error:", err)
  413. }
  414. defer func() {
  415. switch {
  416. case err != nil:
  417. fmt.Println("__error:", err)
  418. if tx != nil {
  419. tx.Rollback()
  420. }
  421. default:
  422. if tx != nil {
  423. err = tx.Commit()
  424. }
  425. }
  426. }()
  427. sParams := make([]interface{}, 0)
  428. sParams = append(sParams, lastCommop)
  429. _, err = restful.ExecQueryT("delete from `commop` where `Cont`= ?", sParams, tx)
  430. if err == nil {
  431. commop = ""
  432. }
  433. return err
  434. }
  435. func getcommop() string {
  436. queryResult, err := restful.QueryByListSqlx("SELECT `Cont` as resultstr,ID FROM `commop` ", 0, 1, nil)
  437. if err == nil {
  438. returnmsgmap, _ := queryResult.(map[string]interface{})
  439. returnmsgmap1, _ := returnmsgmap["rows"].(map[string][]interface{})
  440. if len(returnmsgmap1["resultstr"]) > 0 {
  441. sParams := make([]interface{}, 0)
  442. sParams = append(sParams, returnmsgmap1["ID"][0])
  443. //restful.ExecQuery("update commop set `SendTimes`=`SendTimes` + 1 where id = ?", sParams)
  444. //restful.ExecQuery("delete from commop where `SendTimes`>= 5 and id = ?", sParams)
  445. restful.ExecQuerySqlx("update commop set `SendTimes`=`SendTimes` + 1 where id = ?", sParams)
  446. restful.ExecQuerySqlx("delete from commop where `SendTimes`>= 5 and id = ?", sParams)
  447. return returnmsgmap1["resultstr"][0].(string)
  448. }
  449. } else {
  450. Logger.Errorf("%s \r\n", err)
  451. }
  452. return ""
  453. }
  454. func getnextOperate() string {
  455. queryResult, err := restful.QueryByListSqlx("SELECT `Cont` as resultstr,ID FROM `commop` ", 0, 1, nil)
  456. if err == nil {
  457. returnmsgmap, _ := queryResult.(map[string]interface{})
  458. returnmsgmap1, _ := returnmsgmap["lists"].(map[string][]interface{})
  459. if len(returnmsgmap1["resultstr"]) > 0 {
  460. sParams := make([]interface{}, 0)
  461. sParams = append(sParams, returnmsgmap1["ID"][0])
  462. return returnmsgmap1["resultstr"][0].(string)
  463. }
  464. } else {
  465. Logger.Errorf("%s \r\n", err)
  466. }
  467. return ""
  468. }
  469. func processChar(inbyte byte, recLength, dataLength, state uint8, recbuf []byte) (uint8, uint8, uint8, bool, []byte) {
  470. //7E 15 01 F1 7E 45 C8 AB CC EC BD E1 CA F8 20 20 20 20 20 20 20 30 1C
  471. switch state {
  472. case 0: //头判断
  473. if inbyte == 0x7E {
  474. state = 1
  475. recLength = 1
  476. recbuf = recbuf[:0]
  477. recbuf = append(recbuf, inbyte)
  478. }
  479. case 1: //接收长度数据
  480. if inbyte == 0x7E {
  481. state = 1
  482. recLength = 1
  483. recbuf = recbuf[:0]
  484. recbuf = append(recbuf, inbyte)
  485. } else {
  486. state = 2
  487. recLength = 2
  488. dataLength = inbyte + 2
  489. recbuf = append(recbuf, inbyte)
  490. }
  491. case 2: //接收数据中
  492. recbuf = append(recbuf, inbyte)
  493. recLength++
  494. if recLength == dataLength {
  495. state = 0
  496. recLength = 0
  497. return recLength, dataLength, state, true, recbuf
  498. }
  499. }
  500. return recLength, dataLength, state, false, recbuf
  501. }
  502. func processCharApi(inbyte byte, recLength, dataLength, state uint8, recbuf []byte) (uint8, uint8, uint8, bool, []byte) {
  503. //7E 15 01 F1 7E 45 C8 AB CC EC BD E1 CA F8 20 20 20 20 20 20 20 30 1C
  504. switch state {
  505. case 0: //头判断
  506. if inbyte == 0x7E {
  507. state = 1
  508. recLength = 1
  509. recbuf = recbuf[:0]
  510. recbuf = append(recbuf, inbyte)
  511. }
  512. case 1: //头判断
  513. if inbyte == 0x7E {
  514. state = 1
  515. recLength = 1
  516. recbuf = recbuf[:0]
  517. recbuf = append(recbuf, inbyte)
  518. } else if inbyte == 0x00 {
  519. state = 2
  520. recLength = 2
  521. recbuf = append(recbuf, inbyte)
  522. } else {
  523. state = 0
  524. recLength = 0
  525. recbuf = recbuf[:0]
  526. }
  527. case 2: //接收数据中
  528. if inbyte == 0x7E {
  529. state = 1
  530. recLength = 1
  531. recbuf = recbuf[:0]
  532. recbuf = append(recbuf, inbyte)
  533. } else {
  534. if inbyte == 0x7D {
  535. needEscape = 1
  536. } else {
  537. state = 3
  538. recLength = 3
  539. dataLength = inbyte + 4
  540. if needEscape == 1 {
  541. needEscape = 0
  542. recbuf = append(recbuf, inbyte^0x20)
  543. } else {
  544. recbuf = append(recbuf, inbyte)
  545. }
  546. }
  547. }
  548. case 3: //接收数据中
  549. if inbyte == 0x7D {
  550. needEscape = 1
  551. } else {
  552. recLength++
  553. if needEscape == 1 {
  554. needEscape = 0
  555. recbuf = append(recbuf, inbyte^0x20)
  556. } else {
  557. recbuf = append(recbuf, inbyte)
  558. }
  559. }
  560. if recLength == dataLength {
  561. state = 0
  562. recLength = 0
  563. if recbuf[3] == 0x90 && len(recbuf) > 16 && len(recbuf) > int(recbuf[16]+17) {
  564. SrcAdd = recbuf[4:12]
  565. recbuf = recbuf[15 : recbuf[16]+17]
  566. //recbuf = append(recbuf[4:12], recbuf[15:recbuf[16]+17]...)
  567. }
  568. return recLength, dataLength, state, true, recbuf
  569. }
  570. }
  571. return recLength, dataLength, state, false, recbuf
  572. }
  573. func getOutbytes(inbuf string, srcAdd string) ([]byte, error) {
  574. var tmpsum byte
  575. inbuf = strings.ToLower(inbuf)
  576. d, err := hex.DecodeString(inbuf)
  577. if err != nil {
  578. return nil, err
  579. }
  580. for i, i2 := range d {
  581. if i < len(d)-1 {
  582. tmpsum = tmpsum + i2
  583. } else {
  584. d[len(d)-1] = 0xFF - tmpsum
  585. }
  586. }
  587. if d[3] != 0xAA {
  588. Logger.Infof("O:\t% X \r\n", d)
  589. }
  590. if setting.DatabaseSetting.Showlog && (d[3] != 0xAA) {
  591. fmt.Printf("%s O:\t% X \r\n", time.Now().Format("2006-01-02 15:04:05"), d)
  592. }
  593. if setting.ServerSetting.UseAPI == 1 {
  594. if d[3] == 0x18 {
  595. Logger.Infof("sent to:\t% X \r\n", SrcAdd)
  596. }
  597. d = XbeeMake(d, srcAdd, d[3] == 0xA2)
  598. //d = XbeeMake(d, srcAdd, true)
  599. }
  600. return d, nil
  601. }
  602. // 保护方式允许一个函数
  603. func ProtectRun() {
  604. CurrentPath, _ := setting.GetCurrentPath()
  605. h, _ := log.NewRotatingFileHandler(CurrentPath+"Plog.log", 40*1024*1024, 10)
  606. if setting.DatabaseSetting.Showline {
  607. Logger = log.New(h, log.Ltime|log.Lfile)
  608. } else {
  609. Logger = log.New(h, log.Ltime)
  610. }
  611. Logger.SetLevelByName("info")
  612. //ProcessKeyP = make(chan []byte, 100)
  613. ProcessKeyPstr = make(chan []string, 100)
  614. BroadcastBuf = make(chan []byte, 100)
  615. //RunTMRList = make(map[byte]int, 200)
  616. go RunsendBuf()
  617. //if setting.ServerSetting.Broadcast > 0 {
  618. go RunbroadBuf()
  619. //}
  620. for {
  621. err := OpenComm()
  622. if err != nil {
  623. if strings.Compare(err.Error(), "一分钟未收到数据") < 0 {
  624. Logger.Errorln(err)
  625. }
  626. }
  627. time.Sleep(1 * time.Second)
  628. }
  629. }
  630. func XbeeMake(inbuf []byte, srcAdd string, boast bool) []byte {
  631. //7E 00 0F 10 01 00 00 00 00 00 00 FF FF FF FE 00 C0 01 32
  632. var CheckSum byte
  633. var localSrcAdd []byte
  634. var er error
  635. buf := make([]byte, 0)
  636. buf1 := make([]byte, 0)
  637. inbuflen := len(inbuf) + 14
  638. if len(srcAdd) > 0 {
  639. localSrcAdd, er = hex.DecodeString(srcAdd)
  640. }
  641. if er != nil || len(srcAdd) == 0 {
  642. localSrcAdd = localSrcAdd[:0]
  643. localSrcAdd = append(buf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF)
  644. }
  645. buf = append(buf, 0x7e, 0x00, byte(inbuflen&0xFF), 0x10, 0x01)
  646. if boast {
  647. buf = append(buf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF)
  648. } else {
  649. for _, i2 := range localSrcAdd {
  650. buf = append(buf, i2)
  651. }
  652. }
  653. buf = append(buf, 0xFF, 0xFE, 0x00, 0xC0)
  654. for _, i2 := range inbuf {
  655. buf = append(buf, i2)
  656. }
  657. CheckSum = 0x00
  658. for i := 3; i < len(buf); i++ {
  659. CheckSum = CheckSum + buf[i]
  660. }
  661. buf = append(buf, 0xFF-CheckSum)
  662. buf1 = append(buf1, 0x7E)
  663. for i := 1; i < len(buf); i++ {
  664. if buf[i] == 0x7E || buf[i] == 0x7D || buf[i] == 0x11 || buf[i] == 0x13 {
  665. buf1 = append(buf1, 0x7D, buf[i]^0x20)
  666. } else {
  667. buf1 = append(buf1, buf[i])
  668. }
  669. }
  670. return buf1
  671. }
  672. func writeComm(tempstr string, srcAdd string) error {
  673. if len(tempstr) == 0 {
  674. return nil
  675. }
  676. buftmp, err := getOutbytes(tempstr, srcAdd)
  677. if err == nil {
  678. _, err = my_comport.Write(buftmp)
  679. if err != nil {
  680. Logger.Errorf("%s %s\r\n", "串口写入错误: ", err)
  681. time.Sleep(1 * time.Second)
  682. _ = my_comport.Close()
  683. return err
  684. }
  685. }
  686. return nil
  687. }
  688. func sendBuf(tmpstr []string, client MQTT.Client) error {
  689. var tmepstr2, tempstr1 string
  690. tmepstr2 = ""
  691. d, err := hex.DecodeString(tmpstr[0])
  692. if err == nil {
  693. mylength1 := int(d[1] + 2)
  694. if len(d) > mylength1 {
  695. tempstr1 = hex.EncodeToString(d[0:mylength1])
  696. tmepstr2 = hex.EncodeToString(d[mylength1:])
  697. } else {
  698. tempstr1 = tmpstr[0]
  699. }
  700. if client != nil {
  701. MQPublish(client, tempstr1)
  702. MQPublish(client, tmepstr2)
  703. } else {
  704. if len(tempstr1) > 0 {
  705. err = writeComm(tempstr1, tmpstr[1])
  706. if err != nil {
  707. return err
  708. }
  709. }
  710. if len(tmepstr2) > 0 {
  711. err = writeComm(tmepstr2, tmpstr[1])
  712. if err != nil {
  713. return err
  714. }
  715. }
  716. }
  717. }
  718. return nil
  719. }
  720. func ProcessBuf(rebuff []byte) string {
  721. var err error
  722. var tmpstr string
  723. tmpstr = ""
  724. if CommStrValidate(rebuff) {
  725. if rebuff[3] == 0xA4 {
  726. if setting.DatabaseSetting.Showlog {
  727. fmt.Printf("%s I:\t% X \n", time.Now().Format("2006-01-02 15:04:05"), rebuff)
  728. }
  729. Logger.Infof("I:\t% X \r\n", rebuff)
  730. tmpcommop_, err := hex.DecodeString(commop)
  731. if err == nil && len(tmpcommop_) > 5 {
  732. if rebuff[2]&0x1F == tmpcommop_[2]&0x1F {
  733. delcommop(commop)
  734. }
  735. }
  736. } else if rebuff[3] == 0xA1 {
  737. // if setting.ServerSetting.Broadcast > 0 {
  738. select {
  739. case BroadcastBuf <- rebuff:
  740. default:
  741. Logger.Errorf("%s\r\n", "BroadcastBuf通道已满")
  742. }
  743. // }
  744. } else if rebuff[3]&0xF0 == 0xA0 {
  745. if setting.DatabaseSetting.Showlog {
  746. fmt.Printf("%s A0:\t% X \n", time.Now().Format("2006-01-02 15:04:05"), rebuff)
  747. }
  748. } else {
  749. if setting.DatabaseSetting.Showlog {
  750. fmt.Printf("%s I:\t% X \n", time.Now().Format("2006-01-02 15:04:05"), rebuff)
  751. }
  752. Logger.Infof("I:\t% X \r\n", rebuff)
  753. key, val, valresul := duplicateValidate(rebuff)
  754. if valresul {
  755. if rebuff[3]&0xF0 == 0xE0 {
  756. rebuff[3] = rebuff[3] + 0x10
  757. }
  758. if rebuff[3] == 0xF0 {
  759. err = processKey0(rebuff)
  760. if err == nil {
  761. tmpstr = fmt.Sprintf("7E04%02x10%02x00", rebuff[2], rebuff[rebuff[1]])
  762. }
  763. } else if rebuff[3] == 0xF1 || rebuff[3] == 0xF2 || rebuff[3] == 0xF3 ||
  764. rebuff[3] == 0xF4 || rebuff[3] == 0xF5 {
  765. // err = processKey0(rebuff)
  766. tmpstr, err = processKey1(rebuff)
  767. } else if rebuff[3] == 0xF8 {
  768. tmpstr = hex.EncodeToString(getF8(rebuff[2], rebuff[4]))
  769. }
  770. } else {
  771. fmt.Printf("%s duplicateValidate:\t%s \n", time.Now().Format("2006-01-02 15:04:05"), "重复数据")
  772. if rebuff[3] == 0xE1 || rebuff[3] == 0xE2 || rebuff[3] == 0xE3 {
  773. //tmpstr = fmt.Sprintf("7E04%02x11%02x00", rebuff[2], rebuff[rebuff[1]])
  774. tmpstr, _ = processKey1(rebuff)
  775. } else if rebuff[3] == 0xE0 {
  776. tmpstr = fmt.Sprintf("7E04%02x10%02x00", rebuff[2], rebuff[rebuff[1]])
  777. } else if rebuff[3] == 0xF8 || rebuff[3] == 0xE8 {
  778. tmpstr = hex.EncodeToString(getF8(rebuff[2], rebuff[4]))
  779. } else if rebuff[3] == 0xF4 || rebuff[3] == 0xE4 || rebuff[3] == 0xF5 || rebuff[3] == 0xE5 {
  780. if rebuff[3]&0xF0 == 0xE0 {
  781. rebuff[3] = rebuff[3] + 0x10
  782. }
  783. tmpstr, _ = processKey1(rebuff)
  784. }
  785. }
  786. if len(tmpstr) > 0 {
  787. saveduplicateValidate(key, val)
  788. }
  789. }
  790. }
  791. return tmpstr
  792. }
  793. func SetCoil(Addr byte, KAddr byte, State bool) []byte {
  794. m_data := []byte{0x01, 0x05, 0x00, 0x01, 0x00, 0x00}
  795. m_data[0] = Addr
  796. m_data[3] = KAddr
  797. if State {
  798. m_data[4] = 0xFF
  799. }
  800. checksum := CheckSum(m_data)
  801. int16buf := new(bytes.Buffer)
  802. binary.Write(int16buf, binary.LittleEndian, checksum)
  803. m_data = append(m_data, int16buf.Bytes()...)
  804. //fmt.Printf("output-after:%X \n",m_data)
  805. return m_data
  806. }
  807. func SetMulCoil(Addr byte, value int16) []byte {
  808. m_data := []byte{0x01, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00}
  809. m_data[0] = Addr
  810. m_data[3] = 0
  811. m_data[5] = 16
  812. m_data[7] = byte(value & 0xFF)
  813. m_data[8] = byte((value >> 8) & 0xFF)
  814. checksum := CheckSum(m_data)
  815. int16buf := new(bytes.Buffer)
  816. binary.Write(int16buf, binary.LittleEndian, checksum)
  817. m_data = append(m_data, int16buf.Bytes()...)
  818. fmt.Printf("output-after:%X \n", m_data)
  819. return m_data
  820. }
  821. func coil(i int) int16 {
  822. return 1 << (i - 1)
  823. }
  824. func OpenComm() (err error) {
  825. var monitorBegin, monitorend time.Time
  826. var recLength, dataLength, state uint8
  827. var processok bool
  828. SrcAdd = make([]byte, 8)
  829. defer slowpoke.CloseAll()
  830. defer func() {
  831. // 发生宕机时,获取panic传递的上下文并打印
  832. if err := recover(); err != nil {
  833. fmt.Println("OpenComm出错:", err)
  834. }
  835. }()
  836. //a := 0
  837. //
  838. //b :=1/a
  839. //println(b)
  840. fmt.Println("启动时间:", time.Now().Local().Format("2006-01-02 15:04:05")) //2019-07-31 13:57:52
  841. file = setting.CurrentPath + "rectailer"
  842. buf := make([]byte, 32)
  843. recbuf := make([]byte, 1)
  844. SrcAdd = make([]byte, 8)
  845. openserial:
  846. my_comport, err = serial.Open(*setting.CommSetting)
  847. recLength = 0
  848. dataLength = 0
  849. state = 0
  850. if err != nil {
  851. Logger.Errorf("%s %s %s %s\r\n", setting.CommSetting.PortName, "打开错误: ", setting.CommSetting.PortName, err)
  852. if setting.DatabaseSetting.Showlog {
  853. fmt.Println(time.Now().Format("2006-01-02 15:04:05"), setting.CommSetting.PortName, "打开错误: ", setting.CommSetting.PortName, err)
  854. }
  855. time.Sleep(1 * time.Second)
  856. goto openserial
  857. }
  858. Logger.Infof("%s %s\r\n", setting.CommSetting.PortName, "打开成功")
  859. // my_comport.Write(SetCoil(1,1, true))
  860. // my_comport.Write(SetMulCoil(1,(coil(1)|coil(3)|coil(5)|coil(7))))
  861. // my_comport.Write(SetMulCoil(1,(coil(2)|coil(4)|coil(6)|coil(8))))
  862. if setting.DatabaseSetting.Showlog {
  863. fmt.Println(time.Now().Format("2006-01-02 15:04:05"), setting.CommSetting.PortName, "打开成功")
  864. }
  865. sendcommopBegin := time.Now()
  866. sendLoraBegin := time.Now()
  867. monitorBegin = time.Now()
  868. defer my_comport.Close()
  869. for {
  870. select {
  871. case <-StopCharP:
  872. Logger.Infof("%s\r\n", "服务被停止")
  873. break
  874. default:
  875. n, err := my_comport.Read(buf)
  876. if (err != io.EOF) && (err != nil) {
  877. Logger.Errorf("%s %s\r\n", "串口读写错误: ", err)
  878. time.Sleep(1 * time.Second)
  879. _ = my_comport.Close()
  880. panic(err)
  881. } else if n > 0 {
  882. monitorBegin = time.Now()
  883. buf = buf[:n]
  884. //fmt.Printf("% X ",buf)
  885. for _, value := range buf {
  886. if setting.ServerSetting.UseAPI == 1 {
  887. recLength, dataLength, state, processok, recbuf = processCharApi(value, recLength, dataLength, state, recbuf)
  888. } else {
  889. recLength, dataLength, state, processok, recbuf = processChar(value, recLength, dataLength, state, recbuf)
  890. }
  891. if processok {
  892. var recbuftem = make([]byte, len(recbuf))
  893. copy(recbuftem, recbuf)
  894. go func(recbuftem []byte, tempSrcAdd string) {
  895. if (len(recbuftem) > 3) && (recbuftem[2] < 30) {
  896. b := recbuftem[2]
  897. key, mapok := RunTMRList.Load(b)
  898. if !mapok {
  899. key = 0
  900. }
  901. if key == 0 {
  902. tmpstr := make([]string, 2)
  903. begin := time.Now()
  904. RunTMRList.Store(b, 1)
  905. tmpstr[0] = ProcessBuf(recbuftem)
  906. tmpstr[1] = tempSrcAdd
  907. end := time.Now()
  908. // fmt.Printf(tmpstr[0])
  909. if len(tmpstr) > 0 && end.Sub(begin).Seconds() < 30 {
  910. select {
  911. case ProcessKeyPstr <- tmpstr:
  912. default:
  913. Logger.Errorf("%s\r\n", "ProcessKeyPstr通道已满")
  914. }
  915. } else {
  916. Logger.Errorf("%s\r\n", "ProcessBuf 为空或超过30秒")
  917. }
  918. RunTMRList.Store(b, 0)
  919. }
  920. recbuftem = recbuftem[:0]
  921. }
  922. }(recbuftem, hex.EncodeToString(SrcAdd))
  923. }
  924. }
  925. } else {
  926. sendcommopEnd := time.Now()
  927. if (sendcommopEnd.Sub(sendLoraBegin).Milliseconds() > setting.ServerSetting.SendRoute) && (setting.ServerSetting.SendRoute > 0) {
  928. sendLoraBegin = time.Now()
  929. tempsend := make([]string, 2)
  930. tempsend[0] = "7E03FFAA00"
  931. tempsend[1] = ""
  932. select {
  933. case ProcessKeyPstr <- tempsend:
  934. default:
  935. Logger.Errorf("%s\r\n", "commop_ProcessKeyPstr通道已满")
  936. }
  937. } else if sendcommopEnd.Sub(sendcommopBegin).Seconds() > 1 {
  938. sendcommopBegin = time.Now()
  939. delaysendcommop = 0
  940. commop = getcommop()
  941. if len(commop) > 0 {
  942. tempTailer := getSendTailer()
  943. tempCommopstr, er := hex.DecodeString(commop)
  944. if er == nil {
  945. tempCommopstr[tempCommopstr[1]] = (tempCommopstr[tempCommopstr[1]] & 0xF0) | (tempTailer & 0x0F)
  946. tempsend := make([]string, 2)
  947. tempsend[0] = hex.EncodeToString(tempCommopstr)
  948. tempsend[1] = ""
  949. select {
  950. case ProcessKeyPstr <- tempsend:
  951. default:
  952. Logger.Errorf("%s\r\n", "commop_ProcessKeyPstr通道已满")
  953. }
  954. }
  955. }
  956. } else {
  957. monitorend = time.Now()
  958. if monitorend.Sub(monitorBegin).Minutes() > 1 {
  959. time.Sleep(1 * time.Second)
  960. _ = my_comport.Close()
  961. panic("一分钟未收到数据")
  962. }
  963. time.Sleep(10 * time.Microsecond)
  964. }
  965. }
  966. }
  967. }
  968. }