import socket import datetime import time font_library = { 'CN16':'\\FO000', # 16X16中文字体 'CN32':'\\FO001',# 32X32中文字体 'EN16': '\\FE000',# 8X16英文字体 'EN32': '\\FE001'# 16X32英文字体 } string_color = { "UNKNOWN": '', # "RED": '\\C1', # 红色, 默认 "GREEN": '\\C2', # 绿色 "YELLOW": '\\C3', # 黄色 "BLUE": '\\C4', # 蓝色 "CYAN": '\\C5', # 青色 "PURPLE": '\\C6', # 紫色 "WHITE": '\\C7' # 白色 } class Area: def __init__(self,area_index,x,y,width,height): self.area_index = area_index self.x = x self.y = y self.width = width self.height = height class LedProtocol: def __init__(self,area_list): self.area_dict = {} for i in range(0, len(area_list)): self.area_dict[i] = Area(i,area_list[i][0],area_list[i][1],area_list[i][2],area_list[i][3]) def string2bytes(self,area_index,input,en_font,cn_font): input = en_font+cn_font+input # area_index = 0 #显示区域编号 # width = 170 # 显示区域宽,单位像素 # height = 64 # 显示区域高,单位像素 # x = area_index * width + area_index # 显示区域左上角x,单位像素 # y = 0 # 显示区域左上角y,单位像素 # msg = bytearray(input, encoding='utf-8') msg = bytearray(input, encoding='gbk') m_frame_head = bytearray(8) # 帧头, 默认8个0xA5 m_frame_head[0:8] = b'\xA5\xA5\xA5\xA5\xA5\xA5\xA5\xA5' m_frame_configuration = bytearray(14) # 包头, 配置参数, 14个byte m_frame_configuration[0:12] = b'\xfe\xff\x00\x80\x00\x00\x00\x00\x00\x00\x63\x02' # m_frame_configuration 最后2个是 数据域长度,后面在写 m_cmd_head = bytearray(7) # 指令头, 默认7个byte m_cmd_head[0:7] = b'\xA3\x06\x01\x00\x00\x00\x01' m_area_head = bytearray(29) # 区域头, 默认29个byte # m_area_head 前面2个是 区域的数据长度, 后面在写 m_area_head[2] = 0 t_area_x = 0x8000 + self.area_dict[area_index].x # 区域 X 坐标,默认以字节(8 个像素点)为单位, 高字节最高位为 1 时,表示以像素点为单位 m_area_head[3] = t_area_x % 256 m_area_head[4] = int(t_area_x / 256) t_area_y = self.area_dict[area_index].y # 区域 Y 坐标,以像素点为单位 m_area_head[5] = t_area_y % 256 m_area_head[6] = int(t_area_y / 256) t_area_width = 0x8000 + self.area_dict[area_index].width # 区域宽度,默认以字节(8 个像素点)为单位, 高字节最高位为 1 时,表示以像素点为单位 m_area_head[7] = t_area_width % 256 m_area_head[8] = int(t_area_width / 256) t_area_height = self.area_dict[area_index].height # 区域高度,以像素点为单位 m_area_head[9] = t_area_height % 256 m_area_head[10] = int(t_area_height / 256) m_area_head[11] = self.area_dict[area_index].area_index m_area_head[12:25] = b'\x00\x00\x02\x00\x00\x00\x00\x02\x01\x01\x00\x00\x0a' m_area_head[18] = 8 #居中对齐 m_area_head[19] = 2 #多行显示 m_area_head[20] = 1 #手动换行 m_area_head[21] = 1 #0x01——静止显示 if area_index == 1: m_area_head[21] = 3 # 0x03——向左移动 m_area_head[23] = 6 # 运行速度 m_area_head[24] = 2 # 停留时间 # m_area_head后面4个是 显示字符串 的长度, 后续在写. # 长度整合 t_show_string_len = len(msg) m_area_head[25] = t_show_string_len % 256 m_area_head[26] = (int(t_show_string_len / 256)) % 256 m_area_head[27] = (int(t_show_string_len / 256 / 256)) % 256 m_area_head[28] = (int(t_show_string_len / 256 / 256 / 256)) % 256 t_area_data_len = 29 - 2 + len(msg) m_area_head[0] = t_area_data_len % 256 m_area_head[1] = int(t_area_data_len / 256) t_data_len = 7 + 29 + len(msg) m_frame_configuration[12] = t_data_len % 256 m_frame_configuration[13] = int(t_data_len / 256) # crc校验码 t_result_src = m_frame_configuration + m_cmd_head + m_area_head + msg crc = self.crc16(t_result_src) [a1, a2] = self.dec2hex(crc) m_frame_crc = bytearray(2) # crc校验码, 2个byte, 包校验为包头数据和数据域的校验值 m_frame_crc[0] = a1 m_frame_crc[1] = a2 p_src = t_result_src + m_frame_crc p_dst = bytearray(1024) j = 0 for i in range(len(p_src)): if p_src[i] == 0xA5: p_dst[j] = 0xA6 p_dst[j + 1] = 0x02 j += 2 elif p_src[i] == 0xA6: p_dst[j] = 0xA6 p_dst[j + 1] = 0x01 j += 2 elif p_src[i] == 0x5A: p_dst[j] = 0x5B p_dst[j + 1] = 0x02 j += 2 elif p_src[i] == 0x5B: p_dst[j] = 0x5B p_dst[j + 1] = 0x01 j += 2 else: p_dst[j] = p_src[i] j = j + 1 m_frame_tail = bytearray(1) m_frame_tail[0] = 90 # 就是0x5A output = m_frame_head + p_dst[0:j] + m_frame_tail # print('--------------------------------') # print(output) # print(len(output)) return output def crc16(self, bytes): crc = 0 for byte in bytes: crc = byte ^ crc for i in range(8): if crc & 0x01 == 1: crc = (crc >> 1) ^ 0xA001 else: crc = crc >> 1 return crc def dec2hex(self, num): a = int(num / 256) b = int(num % 256) return [b, a] # AREA_LIST =[ # [0,0,0,170,64],#区域编号,区域左上角X坐标,区域左上角Y坐标,区域宽度,区域高度 # [1,175,0,193,64],#区域编号,区域左上角X坐标,区域左上角Y坐标,区域宽度,区域高度 # [2,371,0,205,64]#区域编号,区域左上角X坐标,区域左上角Y坐标,区域宽度,区域高度 # ] # # if __name__=="__main__": # led = LedControl("192.168.1.100",5005,AREA_LIST) # led.sendLedMsg(0,string_color["WHITE"]+"A1入口",font_library["EN48"],font_library["CN48"]) # led.sendLedMsg(1,"%s空闲 可进入\\n%s限高: 2.00"%(string_color["GREEN"],string_color["BLUE"])) # led.sendLedMsg(2,"%s剩大车位:%d\\n%s剩小车位:%d"%(string_color["RED"],0,string_color["GREEN"],100)) # sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM) # sock.settimeout(1) # sock.connect(("192.168.1.163",5005)) # # print("connected") # # # time.sleep(1) # bytes=string2bytes(0, '楚天车库', string_color["RED"]) # sock.send(bytes) # time.sleep(1) # bytes=string2bytes(1, '停车入口', string_color["GREEN"]) # sock.send(bytes) # time.sleep(1) # bytes=string2bytes(2, '暂停服务', string_color["YELLOW"]) # sock.send(bytes) # #bytes=string2bytes(3, '\\C1暂停\\C2服务', string_color["UNKNOWN"]) # #sock.send(bytes) # # # sock.close() # print("end")