msgRealQuote.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /**
  2. * @Author : zou.yingbin
  3. * @Create : 2022/3/26 14:52
  4. * @Modify : 2022/3/26 14:52
  5. * @note :
  6. */
  7. package client
  8. import (
  9. "fmt"
  10. "mtp20access/packet"
  11. "strconv"
  12. )
  13. // DispatchRealQuote 分发行情
  14. func DispatchRealQuote(p *packet.MiQuotePacket, clinet *Client) {
  15. // TODO: 目前只实现了订阅发送模式, 未支持全部发送模式
  16. pending := make([]byte, 0)
  17. // 解析接收到的商品
  18. ware := parseWareInfo(p)
  19. // 获取已订阅行情商品列表
  20. quoteSubs := clinet.GetQuoteSubs()
  21. for _, sub := range quoteSubs {
  22. for i := range ware {
  23. w := &ware[i]
  24. if w.exchId == strconv.Itoa(sub.ExchangeId) && w.goodsCode == sub.GoodsCode {
  25. pending = append(pending, w.buf...)
  26. }
  27. }
  28. }
  29. if len(pending) > 0 {
  30. // 按商品重新打包
  31. quote := packet.MiQuotePacket{
  32. BigType: p.BigType,
  33. SmallType: p.SmallType,
  34. SerialNum: p.SerialNum,
  35. Mode: p.Mode,
  36. }
  37. quote.Msg = pending
  38. sendBuf := quote.EnPack()
  39. // 发送给客户端
  40. if clinet.quoteWriteChan != nil {
  41. clinet.quoteWriteChan <- sendBuf
  42. }
  43. }
  44. }
  45. // 分发通知
  46. func DispatchNftTrade(p *[]byte, clinet *Client) {
  47. // 发送给客户端
  48. if clinet.tradeWriteChan != nil {
  49. clinet.tradeWriteChan <- *p
  50. }
  51. }
  52. // parseWareInfo 从报文中解析出所有报价商品
  53. func parseWareInfo(p *packet.MiQuotePacket) []wareInfo {
  54. ware := make([]wareInfo, 0)
  55. // 0x42(66)是控制信息,要过滤掉
  56. if p.OriMsg[5] == 0x42 {
  57. return ware
  58. }
  59. data := p.OriMsg[14:]
  60. nPos1, nPos2 := -1, -1
  61. for i := 0; i < len(data); i++ {
  62. // 报价包开始
  63. if data[i] == 0x10 {
  64. nPos1 = i
  65. }
  66. // 报价包结束
  67. if data[i] == 0x11 {
  68. nPos2 = i + 1
  69. }
  70. if nPos1 >= 0 && nPos2 > 0 {
  71. // 处理闪退问题
  72. if nPos1 > nPos2 {
  73. fmt.Printf("接收到错误的行情记录(nPos1>nPos2): %v \n", p.OriMsg)
  74. // 重置nPos1, nPos2 继续查找下一个报价包
  75. nPos1, nPos2 = -1, -1
  76. }
  77. v := wareInfo{buf: data[nPos1:nPos2]}
  78. v.parseField()
  79. //v.printInfo()
  80. //v.debugPrintAllField()
  81. ware = append(ware, v)
  82. // 重置nPos1, nPos2 继续查找下一个报价包
  83. nPos1, nPos2 = -1, -1
  84. }
  85. }
  86. return ware
  87. }