123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- # -*- 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)
|