# -*- coding: utf-8 -*- # !/usr/bin/env python import datetime import os import simplejson as json import threading from gevent import socket import struct from contextlib import closing import time from binascii import * import crcmod import random def get_bytes_from_str(strMsg): result = bytes() if len(strMsg) % 2 != 0: return None for ii in range(len(strMsg) / 2): temp = int('%s%s' % (strMsg[2 * ii], strMsg[2 * ii + 1]), 16) result += struct.pack('B', temp) return result def crc16Add(read): crc16 = crcmod.mkCrcFun(0x18005, rev=True, initCrc=0xFFFF, xorOut=0x0000) data = read.replace(" ", "") #消除空格 readcrcout = hex(crc16(unhexlify(data))).upper() str_list = list(readcrcout) # print(str_list) if len(str_list) == 5: str_list.insert(2, '0') # 位数不足补0,因为一般最少是5个 crc_data = "".join(str_list) #用""把数组的每一位结合起来 组成新的字符串 # print(crc_data) read = read.strip() + ' ' + crc_data[4:] + ' ' + crc_data[2:4] #把源代码和crc校验码连接起来 # print('CRC16校验:', crc_data[4:] + ' ' + crc_data[2:4]) print(read) return crc_data[2:4] + crc_data[4:] gclient = None server = '211.159.224.10' port = 8767 def device_receive(devNo): global devClientDict while True: try: devClient = devClientDict.get(devNo,None) if devClient is None: time.sleep(10) continue data = devClient.recv(1024) # 这里是字节1k if not data: time.sleep(0.5) continue data = data.decode() print("receive msg:", data) # 根据服务器下发的指令,构造回复指令 # cmdType = data[10:12] # if cmdType == '12': # 读取实时监测数据 # sendMsg = '68401A0300130000000000000000000000000000000055031412782305010001010200000000000000000000000000000000000000000000000000000000000000005C7A' # elif cmdType == '34': # 运营平台远程控制启机 # sendMsg = '681E1A03003332010200000000111511161555350260320102000000010101008643' # elif cmdType == '36': # sendMsg = '680E1A030035320102000000010101002704' # elif cmdType == '42': # sendMsg = '68130A0300415503141278230500000000D14B0A540198E2' # elif cmdType == '44': # sendMsg = '680D1A030043550314127823050100BD84' # elif cmdType == '46': # sendMsg = '680D1A0300455503141278230500000000D14B0A540000000000E14C0A5400' # elif cmdType == '48': # sendMsg = '680D1A0300475503141278230500000000D14B0A540100000000E14C0A54005DB3' # elif cmdType == '52': # sendMsg = '680C1A030051550314127823050125DC' # elif cmdType == '56': # sendMsg = '68121A0300555503141278230598B70E11100314ADAC' # elif cmdType == '58': # sendMsg = '680C1A03005755031412782305010E7C' # elif cmdType == '62': # sendMsg = '680D1A0300635503141278230501000000000045A5' # elif cmdType == '92': # sendMsg = '680C1A030091550314127823050175D9' # elif cmdType == '94': # sendMsg = '680C1A03009355031412782305016CB9' # elif cmdType == 'A4': # sendMsg = '68251A0300A3550314127823051151116155535026055031412782305010100002010291128018D3C' # else: # continue # # devClient.sendall(sendMsg) except Exception, e: time.sleep(1) continue # 设备发送消息 def device_send(devNo): while True: global devClientDict crc = crc16Add('2220000001' + devNo + '01020F30322E37302E3130000101010101010101010104') strSendMsg = '682220000001' + devNo + '01020F30322E37302E3130000101010101010101010104' + crc try: sendMsg = get_bytes_from_str(strSendMsg) # devClient = devClientDict.get(devNo,None) if devClient is None: devClient = socket.socket(socket.AF_INET, socket.SOCK_STREAM) devClient.connect((server, port)) devClientDict[devNo] = devClient devClient.sendall(sendMsg) time.sleep(random.randint(0,30)) except Exception, e: time.sleep(30) gclient = None print e import copy from bson.objectid import ObjectId from apps.web.device.models import Device #  打印收到消息的线程 obj = Device.objects(devNo = '32010600110308').first() devNo = '32010600110' devNos = [] start = 309 for ii in range(300): newDevNo = devNo+str(start+ii) devNos.append(newDevNo) devClientDict = {} for devNo in devNos: receiveThread = threading.Thread(target=device_send,args=(devNo,)) receiveThread.setDaemon(True) receiveThread.start() receiveThread = threading.Thread(target=device_receive,args=(devNo,)) receiveThread.setDaemon(True) receiveThread.start() # 登录请求:6822200000013201060011030801020F30322E37302E31300001010101010101010101045AC7 # 不存在的设备登录请求:6822000000015603141278230500020F56342E312E3530000101010101010101010101040CC2 # 心跳请求:680D00010003320106001103080100B83C 680D0001000332010600110308010178FD # 请求核对计费模型:680D000200055503141278230500014446 680D000200055503141278230500020447 # 请求新的计费模型:680B0200000955031412782305A451 # 订单实时信息:68401A0300130000000000000000000000000000000055031412782305010001010200000000000000000000000000000000000000000000000000000000000000005C7A # 刷卡启动:6837000400315503141278230501010000000000D14B0A5400000000000000000000000000000000000000000000000000000000000000000070DF # 订单结束: # 回复离线统计数据: 68401A0300130000000000000000000000000000000055031412782305010001010200000000000000000000000000000000000000000000000000000000000000005C7A while True: time.sleep(50) print '\nhello' # import socket # import sys # # receive_count = 0 # # def start_tcp_client(ip,port): # ###create socket # s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # # failed_count = 0 # while True: # try: # print("start connect to server ") # s.connect((ip,port)) # break # except socket.error: # failed_count += 1 # print("fail to connect to server %d times" % failed_count) # if failed_count == 100: return # # # send and receive # while True: # print("connect success") # # #get the socket send buffer size and receive buffer size # s_send_buffer_size = s.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF) # s_receive_buffer_size = s.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF) # # print("client TCP send buffer size is %d" % s_send_buffer_size) # print("client TCP receive buffer size is %d" %s_receive_buffer_size) # # receive_count = 0 # while True: # msg = raw_input(u"请输入设备主动上报给服务器的消息: ") # s.send(msg.encode('utf-8')) # print("send len is : [%d]" % len(msg)) # # msg = s.recv(1024) # print(msg.decode('utf-8')) # print("recv len is : [%d]" % len(msg)) # # receive_count+= 1 # # # if receive_count==14: # # msg = 'disconnect' # # print("total send times is : %d " % receive_count) # # s.send(msg.encode('utf-8')) # # break # break # # s.close() # # start_tcp_client('127.0.0.1',6000)