many_device_simulate.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import os
  5. import simplejson as json
  6. import threading
  7. from gevent import socket
  8. import struct
  9. from contextlib import closing
  10. import time
  11. from binascii import *
  12. import crcmod
  13. import random
  14. def get_bytes_from_str(strMsg):
  15. result = bytes()
  16. if len(strMsg) % 2 != 0:
  17. return None
  18. for ii in range(len(strMsg) / 2):
  19. temp = int('%s%s' % (strMsg[2 * ii], strMsg[2 * ii + 1]), 16)
  20. result += struct.pack('B', temp)
  21. return result
  22. def crc16Add(read):
  23. crc16 = crcmod.mkCrcFun(0x18005, rev=True, initCrc=0xFFFF, xorOut=0x0000)
  24. data = read.replace(" ", "") #消除空格
  25. readcrcout = hex(crc16(unhexlify(data))).upper()
  26. str_list = list(readcrcout)
  27. # print(str_list)
  28. if len(str_list) == 5:
  29. str_list.insert(2, '0') # 位数不足补0,因为一般最少是5个
  30. crc_data = "".join(str_list) #用""把数组的每一位结合起来 组成新的字符串
  31. # print(crc_data)
  32. read = read.strip() + ' ' + crc_data[4:] + ' ' + crc_data[2:4] #把源代码和crc校验码连接起来
  33. # print('CRC16校验:', crc_data[4:] + ' ' + crc_data[2:4])
  34. print(read)
  35. return crc_data[2:4] + crc_data[4:]
  36. gclient = None
  37. server = '211.159.224.10'
  38. port = 8767
  39. def device_receive(devNo):
  40. global devClientDict
  41. while True:
  42. try:
  43. devClient = devClientDict.get(devNo,None)
  44. if devClient is None:
  45. time.sleep(10)
  46. continue
  47. data = devClient.recv(1024) # 这里是字节1k
  48. if not data:
  49. time.sleep(0.5)
  50. continue
  51. data = data.decode()
  52. print("receive msg:", data)
  53. # 根据服务器下发的指令,构造回复指令
  54. # cmdType = data[10:12]
  55. # if cmdType == '12': # 读取实时监测数据
  56. # sendMsg = '68401A0300130000000000000000000000000000000055031412782305010001010200000000000000000000000000000000000000000000000000000000000000005C7A'
  57. # elif cmdType == '34': # 运营平台远程控制启机
  58. # sendMsg = '681E1A03003332010200000000111511161555350260320102000000010101008643'
  59. # elif cmdType == '36':
  60. # sendMsg = '680E1A030035320102000000010101002704'
  61. # elif cmdType == '42':
  62. # sendMsg = '68130A0300415503141278230500000000D14B0A540198E2'
  63. # elif cmdType == '44':
  64. # sendMsg = '680D1A030043550314127823050100BD84'
  65. # elif cmdType == '46':
  66. # sendMsg = '680D1A0300455503141278230500000000D14B0A540000000000E14C0A5400'
  67. # elif cmdType == '48':
  68. # sendMsg = '680D1A0300475503141278230500000000D14B0A540100000000E14C0A54005DB3'
  69. # elif cmdType == '52':
  70. # sendMsg = '680C1A030051550314127823050125DC'
  71. # elif cmdType == '56':
  72. # sendMsg = '68121A0300555503141278230598B70E11100314ADAC'
  73. # elif cmdType == '58':
  74. # sendMsg = '680C1A03005755031412782305010E7C'
  75. # elif cmdType == '62':
  76. # sendMsg = '680D1A0300635503141278230501000000000045A5'
  77. # elif cmdType == '92':
  78. # sendMsg = '680C1A030091550314127823050175D9'
  79. # elif cmdType == '94':
  80. # sendMsg = '680C1A03009355031412782305016CB9'
  81. # elif cmdType == 'A4':
  82. # sendMsg = '68251A0300A3550314127823051151116155535026055031412782305010100002010291128018D3C'
  83. # else:
  84. # continue
  85. #
  86. # devClient.sendall(sendMsg)
  87. except Exception, e:
  88. time.sleep(1)
  89. continue
  90. # 设备发送消息
  91. def device_send(devNo):
  92. while True:
  93. global devClientDict
  94. crc = crc16Add('2220000001' + devNo + '01020F30322E37302E3130000101010101010101010104')
  95. strSendMsg = '682220000001' + devNo + '01020F30322E37302E3130000101010101010101010104' + crc
  96. try:
  97. sendMsg = get_bytes_from_str(strSendMsg) #
  98. devClient = devClientDict.get(devNo,None)
  99. if devClient is None:
  100. devClient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  101. devClient.connect((server, port))
  102. devClientDict[devNo] = devClient
  103. devClient.sendall(sendMsg)
  104. time.sleep(random.randint(0,30))
  105. except Exception, e:
  106. time.sleep(30)
  107. gclient = None
  108. print e
  109. import copy
  110. from bson.objectid import ObjectId
  111. from apps.web.device.models import Device
  112. #  打印收到消息的线程
  113. obj = Device.objects(devNo = '32010600110308').first()
  114. devNo = '32010600110'
  115. devNos = []
  116. start = 309
  117. for ii in range(300):
  118. newDevNo = devNo+str(start+ii)
  119. devNos.append(newDevNo)
  120. devClientDict = {}
  121. for devNo in devNos:
  122. receiveThread = threading.Thread(target=device_send,args=(devNo,))
  123. receiveThread.setDaemon(True)
  124. receiveThread.start()
  125. receiveThread = threading.Thread(target=device_receive,args=(devNo,))
  126. receiveThread.setDaemon(True)
  127. receiveThread.start()
  128. # 登录请求:6822200000013201060011030801020F30322E37302E31300001010101010101010101045AC7
  129. # 不存在的设备登录请求:6822000000015603141278230500020F56342E312E3530000101010101010101010101040CC2
  130. # 心跳请求:680D00010003320106001103080100B83C 680D0001000332010600110308010178FD
  131. # 请求核对计费模型:680D000200055503141278230500014446 680D000200055503141278230500020447
  132. # 请求新的计费模型:680B0200000955031412782305A451
  133. # 订单实时信息:68401A0300130000000000000000000000000000000055031412782305010001010200000000000000000000000000000000000000000000000000000000000000005C7A
  134. # 刷卡启动:6837000400315503141278230501010000000000D14B0A5400000000000000000000000000000000000000000000000000000000000000000070DF
  135. # 订单结束:
  136. # 回复离线统计数据: 68401A0300130000000000000000000000000000000055031412782305010001010200000000000000000000000000000000000000000000000000000000000000005C7A
  137. while True:
  138. time.sleep(50)
  139. print '\nhello'
  140. # import socket
  141. # import sys
  142. #
  143. # receive_count = 0
  144. #
  145. # def start_tcp_client(ip,port):
  146. # ###create socket
  147. # s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  148. #
  149. # failed_count = 0
  150. # while True:
  151. # try:
  152. # print("start connect to server ")
  153. # s.connect((ip,port))
  154. # break
  155. # except socket.error:
  156. # failed_count += 1
  157. # print("fail to connect to server %d times" % failed_count)
  158. # if failed_count == 100: return
  159. #
  160. # # send and receive
  161. # while True:
  162. # print("connect success")
  163. #
  164. # #get the socket send buffer size and receive buffer size
  165. # s_send_buffer_size = s.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
  166. # s_receive_buffer_size = s.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF)
  167. #
  168. # print("client TCP send buffer size is %d" % s_send_buffer_size)
  169. # print("client TCP receive buffer size is %d" %s_receive_buffer_size)
  170. #
  171. # receive_count = 0
  172. # while True:
  173. # msg = raw_input(u"请输入设备主动上报给服务器的消息: ")
  174. # s.send(msg.encode('utf-8'))
  175. # print("send len is : [%d]" % len(msg))
  176. #
  177. # msg = s.recv(1024)
  178. # print(msg.decode('utf-8'))
  179. # print("recv len is : [%d]" % len(msg))
  180. #
  181. # receive_count+= 1
  182. #
  183. # # if receive_count==14:
  184. # # msg = 'disconnect'
  185. # # print("total send times is : %d " % receive_count)
  186. # # s.send(msg.encode('utf-8'))
  187. # # break
  188. # break
  189. #
  190. # s.close()
  191. #
  192. # start_tcp_client('127.0.0.1',6000)