led_protocol.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import socket
  2. import datetime
  3. import time
  4. font_library = {
  5. 'CN16':'\\FO000', # 16X16中文字体
  6. 'CN32':'\\FO001',# 32X32中文字体
  7. 'EN16':'\\FE000',# 8X16英文字体
  8. 'EN32':'\\FE001',# 16X32英文字体
  9. 'EN48':'\\FE002' # 32x48英文字体
  10. }
  11. string_color = {
  12. "UNKNOWN": '', #
  13. "RED": '\\C1', # 红色, 默认
  14. "GREEN": '\\C2', # 绿色
  15. "YELLOW": '\\C3', # 黄色
  16. "BLUE": '\\C4', # 蓝色
  17. "CYAN": '\\C5', # 青色
  18. "PURPLE": '\\C6', # 紫色
  19. "WHITE": '\\C7' # 白色
  20. }
  21. class Area:
  22. def __init__(self,area_index,x,y,width,height):
  23. self.area_index = area_index
  24. self.x = x
  25. self.y = y
  26. self.width = width
  27. self.height = height
  28. class LedProtocol:
  29. def __init__(self,area_list):
  30. self.area_dict = {}
  31. for i in range(0, len(area_list)):
  32. self.area_dict[i] = Area(i,area_list[i][0],area_list[i][1],area_list[i][2],area_list[i][3])
  33. def string2bytes(self,area_index,input,en_font,cn_font):
  34. input = en_font+cn_font+input
  35. # area_index = 0 #显示区域编号
  36. # width = 170 # 显示区域宽,单位像素
  37. # height = 64 # 显示区域高,单位像素
  38. # x = area_index * width + area_index # 显示区域左上角x,单位像素
  39. # y = 0 # 显示区域左上角y,单位像素
  40. # msg = bytearray(input, encoding='utf-8')
  41. msg = bytearray(input, encoding='gbk')
  42. m_frame_head = bytearray(8) # 帧头, 默认8个0xA5
  43. m_frame_head[0:8] = b'\xA5\xA5\xA5\xA5\xA5\xA5\xA5\xA5'
  44. m_frame_configuration = bytearray(14) # 包头, 配置参数, 14个byte
  45. m_frame_configuration[0:12] = b'\xfe\xff\x00\x80\x00\x00\x00\x00\x00\x00\x63\x02'
  46. # m_frame_configuration 最后2个是 数据域长度,后面在写
  47. m_cmd_head = bytearray(7) # 指令头, 默认7个byte
  48. m_cmd_head[0:7] = b'\xA3\x06\x01\x00\x00\x00\x01'
  49. m_area_head = bytearray(29) # 区域头, 默认29个byte
  50. # m_area_head 前面2个是 区域的数据长度, 后面在写
  51. m_area_head[2] = 0
  52. t_area_x = 0x8000 + self.area_dict[area_index].x # 区域 X 坐标,默认以字节(8 个像素点)为单位, 高字节最高位为 1 时,表示以像素点为单位
  53. m_area_head[3] = t_area_x % 256
  54. m_area_head[4] = int(t_area_x / 256)
  55. t_area_y = self.area_dict[area_index].y # 区域 Y 坐标,以像素点为单位
  56. m_area_head[5] = t_area_y % 256
  57. m_area_head[6] = int(t_area_y / 256)
  58. t_area_width = 0x8000 + self.area_dict[area_index].width # 区域宽度,默认以字节(8 个像素点)为单位, 高字节最高位为 1 时,表示以像素点为单位
  59. m_area_head[7] = t_area_width % 256
  60. m_area_head[8] = int(t_area_width / 256)
  61. t_area_height = self.area_dict[area_index].height # 区域高度,以像素点为单位
  62. m_area_head[9] = t_area_height % 256
  63. m_area_head[10] = int(t_area_height / 256)
  64. m_area_head[11] = self.area_dict[area_index].area_index
  65. m_area_head[12:25] = b'\x00\x00\x02\x00\x00\x00\x00\x02\x01\x01\x00\x00\x0a'
  66. m_area_head[18] = 8 #居中对齐
  67. m_area_head[19] = 2 #多行显示
  68. m_area_head[20] = 1 #手动换行
  69. m_area_head[21] = 1 #0x01——静止显示
  70. if area_index == 1:
  71. m_area_head[21] = 3 # 0x03——向左移动
  72. m_area_head[23] = 6 # 运行速度
  73. m_area_head[24] = 4 # 停留时间
  74. # m_area_head后面4个是 显示字符串 的长度, 后续在写.
  75. # 长度整合
  76. t_show_string_len = len(msg)
  77. m_area_head[25] = t_show_string_len % 256
  78. m_area_head[26] = (int(t_show_string_len / 256)) % 256
  79. m_area_head[27] = (int(t_show_string_len / 256 / 256)) % 256
  80. m_area_head[28] = (int(t_show_string_len / 256 / 256 / 256)) % 256
  81. t_area_data_len = 29 - 2 + len(msg)
  82. m_area_head[0] = t_area_data_len % 256
  83. m_area_head[1] = int(t_area_data_len / 256)
  84. t_data_len = 7 + 29 + len(msg)
  85. m_frame_configuration[12] = t_data_len % 256
  86. m_frame_configuration[13] = int(t_data_len / 256)
  87. # crc校验码
  88. t_result_src = m_frame_configuration + m_cmd_head + m_area_head + msg
  89. crc = self.crc16(t_result_src)
  90. [a1, a2] = self.dec2hex(crc)
  91. m_frame_crc = bytearray(2) # crc校验码, 2个byte, 包校验为包头数据和数据域的校验值
  92. m_frame_crc[0] = a1
  93. m_frame_crc[1] = a2
  94. p_src = t_result_src + m_frame_crc
  95. p_dst = bytearray(1024)
  96. j = 0
  97. for i in range(len(p_src)):
  98. if p_src[i] == 0xA5:
  99. p_dst[j] = 0xA6
  100. p_dst[j + 1] = 0x02
  101. j += 2
  102. elif p_src[i] == 0xA6:
  103. p_dst[j] = 0xA6
  104. p_dst[j + 1] = 0x01
  105. j += 2
  106. elif p_src[i] == 0x5A:
  107. p_dst[j] = 0x5B
  108. p_dst[j + 1] = 0x02
  109. j += 2
  110. elif p_src[i] == 0x5B:
  111. p_dst[j] = 0x5B
  112. p_dst[j + 1] = 0x01
  113. j += 2
  114. else:
  115. p_dst[j] = p_src[i]
  116. j = j + 1
  117. m_frame_tail = bytearray(1)
  118. m_frame_tail[0] = 90 # 就是0x5A
  119. output = m_frame_head + p_dst[0:j] + m_frame_tail
  120. # print('--------------------------------')
  121. # print(output)
  122. # print(len(output))
  123. return output
  124. def crc16(self, bytes):
  125. crc = 0
  126. for byte in bytes:
  127. crc = byte ^ crc
  128. for i in range(8):
  129. if crc & 0x01 == 1:
  130. crc = (crc >> 1) ^ 0xA001
  131. else:
  132. crc = crc >> 1
  133. return crc
  134. def dec2hex(self, num):
  135. a = int(num / 256)
  136. b = int(num % 256)
  137. return [b, a]
  138. # AREA_LIST =[
  139. # [0,0,0,170,64],#区域编号,区域左上角X坐标,区域左上角Y坐标,区域宽度,区域高度
  140. # [1,175,0,193,64],#区域编号,区域左上角X坐标,区域左上角Y坐标,区域宽度,区域高度
  141. # [2,371,0,205,64]#区域编号,区域左上角X坐标,区域左上角Y坐标,区域宽度,区域高度
  142. # ]
  143. #
  144. # if __name__=="__main__":
  145. # led = LedControl("192.168.1.100",5005,AREA_LIST)
  146. # led.sendLedMsg(0,string_color["WHITE"]+"A1入口",font_library["EN48"],font_library["CN48"])
  147. # led.sendLedMsg(1,"%s空闲 可进入\\n%s限高: 2.00"%(string_color["GREEN"],string_color["BLUE"]))
  148. # led.sendLedMsg(2,"%s剩大车位:%d\\n%s剩小车位:%d"%(string_color["RED"],0,string_color["GREEN"],100))
  149. # sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  150. # sock.settimeout(1)
  151. # sock.connect(("192.168.1.163",5005))
  152. #
  153. # print("connected")
  154. #
  155. #
  156. # time.sleep(1)
  157. # bytes=string2bytes(0, '楚天车库', string_color["RED"])
  158. # sock.send(bytes)
  159. # time.sleep(1)
  160. # bytes=string2bytes(1, '停车入口', string_color["GREEN"])
  161. # sock.send(bytes)
  162. # time.sleep(1)
  163. # bytes=string2bytes(2, '暂停服务', string_color["YELLOW"])
  164. # sock.send(bytes)
  165. # #bytes=string2bytes(3, '\\C1暂停\\C2服务', string_color["UNKNOWN"])
  166. # #sock.send(bytes)
  167. #
  168. #
  169. # sock.close()
  170. # print("end")