def __init__(self, usbdevice, post2OneNet, timesleep=2):
        threading.Thread.__init__(self)
        self.__flag = threading.Event()  # 用于暂停线程的标识
        self.__flag.set()  # 设置为True
        self.__running = threading.Event()  # 用于停止线程的标识
        self.__running.set()  # 将running设置为True
        #setDaemon(True)当主线程结束之后,会杀死子线程;如果加上join,并设置等待时间,就会等待线程一段时间再退出
        self.setDaemon(True)

        self.timesleep = timesleep
        #usb口转UART CH340
        self.device = usbdevice

        self.timestamp = None
        self.apm10 = 0
        self.apm25 = 0
        self.apm100 = 0
        self.pm25 = 0
        self.pm10 = 0
        self.pm100 = 0
        self.gt03um = 0
        self.gt05um = 0
        self.gt10um = 0
        self.gt25um = 0
        self.gt50um = 0
        self.gt100um = 0
        self.all_PMS = []

        self.pm_res = False
        self.is_device = True

        self.post2OneNet = post2OneNet
        if post2OneNet:
            self.onenet = OneNetApi()
    def __init__(self, timesleep, post2OneNet):
        threading.Thread.__init__(self)
        self.__flag = threading.Event()  # 用于暂停线程的标识
        self.__flag.set()  # 设置为True
        self.__running = threading.Event()  # 用于停止线程的标识
        self.__running.set()  # 将running设置为True
        #setDaemon(True)当主线程结束之后,会杀死子线程;如果加上join,并设置等待时间,就会等待线程一段时间再退出
        self.setDaemon(True)
        self.cpum = [0, 0]
        self.cputimesleep = 1
        self.timesleep = timesleep

        self.onenet = OneNetApi()
        self.post2OneNet = post2OneNet
	def __init__(self, pin, post2OneNet):
		threading.Thread.__init__(self)
		self.__flag = threading.Event()     # 用于暂停线程的标识
		self.__flag.set()       # 设置为True
		self.__running = threading.Event()      # 用于停止线程的标识
		self.__running.set()      # 将running设置为True
		#setDaemon(True)当主线程结束之后,会杀死子线程;如果加上join,并设置等待时间,就会等待线程一段时间再退出
		self.setDaemon(True)
		self.T_H = [0, 0]
		self.timesleep = 1
		#温湿度传感器DHT22
		self.sensor = Adafruit_DHT.DHT22
		self.pin = pin
		
		self.post2OneNet = post2OneNet
		if post2OneNet:
			self.onenet = OneNetApi()
class tcpu(threading.Thread):
    def __init__(self, timesleep, post2OneNet):
        threading.Thread.__init__(self)
        self.__flag = threading.Event()  # 用于暂停线程的标识
        self.__flag.set()  # 设置为True
        self.__running = threading.Event()  # 用于停止线程的标识
        self.__running.set()  # 将running设置为True
        #setDaemon(True)当主线程结束之后,会杀死子线程;如果加上join,并设置等待时间,就会等待线程一段时间再退出
        self.setDaemon(True)
        self.cpum = [0, 0]
        self.cputimesleep = 1
        self.timesleep = timesleep

        self.onenet = OneNetApi()
        self.post2OneNet = post2OneNet

    def run(self):
        while self.__running.isSet():
            time.sleep(self.cputimesleep)
            self.cpum = self.cpu_usage()
            if self.post2OneNet:
                self.onenet.num += 1
                if self.onenet.num >= 10:
                    if BasicDef.get_network_status():
                        self.onenet.set_post_data_flow("CPU", self.cpum[0])
                        r = self.onenet.post_data_flow()
                    self.onenet.num = 0

    def cpu_usage(self, interval=1):
        # load average, uptime
        uptime = datetime.datetime.now() - datetime.datetime.fromtimestamp(
            psutil.boot_time())
        cpu = psutil.cpu_percent(interval)

        return [cpu, uptime]

    def pause(self):
        self.__flag.clear()  # 设置为False, 让线程阻塞

    def resume(self):
        self.__flag.set()  # 设置为True, 让线程停止阻塞

    def stop(self):
        self.__flag.set()  # 将线程从暂停状态恢复, 如何已经暂停的话
        self.__running.clear()  # 设置为False
    def __init__(self, usbdevice, post2OneNet=False, timesleep=2):
        threading.Thread.__init__(self)
        self.__flag = threading.Event()  # 用于暂停线程的标识
        self.__flag.set()  # 设置为True
        self.__running = threading.Event()  # 用于停止线程的标识
        self.__running.set()  # 将running设置为True
        #setDaemon(True)当主线程结束之后,会杀死子线程;如果加上join,并设置等待时间,就会等待线程一段时间再退出
        self.setDaemon(True)

        self.timesleep = timesleep
        #usb口转UART CH340
        self.device = usbdevice
        self.client = None

        self.is_device = True

        self.post2OneNet = post2OneNet
        if post2OneNet:
            self.onenet = OneNetApi()
    def __init__(self, iface, post2OneNet, timesleep):
        self.timesleep = timesleep
        self.IFACE_INIT = iface
        #上一次时间间隔时网络发送总流量和接受总流量
        self.SEND_INIT = 0
        self.RECV_INIT = 0
        #当前时间间隔内的发送和接受流量(计算得到的实时网络流量)
        self.Rx = 0
        self.Tx = 0

        self.post2OneNet = post2OneNet
        if post2OneNet:
            self.onenet = OneNetApi()
class tdht22(threading.Thread):
	def __init__(self, pin, post2OneNet):
		threading.Thread.__init__(self)
		self.__flag = threading.Event()     # 用于暂停线程的标识
		self.__flag.set()       # 设置为True
		self.__running = threading.Event()      # 用于停止线程的标识
		self.__running.set()      # 将running设置为True
		#setDaemon(True)当主线程结束之后,会杀死子线程;如果加上join,并设置等待时间,就会等待线程一段时间再退出
		self.setDaemon(True)
		self.T_H = [0, 0]
		self.timesleep = 1
		#温湿度传感器DHT22
		self.sensor = Adafruit_DHT.DHT22
		self.pin = pin
		
		self.post2OneNet = post2OneNet
		if post2OneNet:
			self.onenet = OneNetApi()
	
	def run(self):
		while self.__running.isSet():
			time.sleep(self.timesleep)
			is_T_H = self.getTH()
			if is_T_H != False:
				self.T_H = is_T_H
				if self.post2OneNet:
					self.onenet.num += 1
					if self.onenet.num >= 1:
						if BasicDef.get_network_status():
							self.onenet.set_post_data_flow("T", self.T_H[0])
							self.onenet.set_post_data_flow("H", self.T_H[1])
							r = self.onenet.post_data_flow()
						self.onenet.num = 0

	def getTH(self):
		try:
			humidity, temperature = Adafruit_DHT.read_retry(self.sensor, self.pin)#24 是 GPIO 的引脚编号
			# print(humidity, end='')
			# print("   ", end='')
			# print(temperature)
		except OSError as e:
			print("Can't find DHT22")
			return False
		
		if humidity == None:
			return False
		if temperature == None:
			return False

		H = round(humidity,2)
		T = round(temperature,2)

		return [T, H]

	#传感器温度数据校验,将偏差值较大数据丢弃
	def checkT():
		return ""
	#传感器湿度数据校验,将偏差值较大数据丢弃
	def checkH():
		return ""

	def pause(self):
		self.__flag.clear()     # 设置为False, 让线程阻塞

	def resume(self):
		self.__flag.set()    # 设置为True, 让线程停止阻塞

	def stop(self):
		self.__flag.set()       # 将线程从暂停状态恢复, 如何已经暂停的话
		self.__running.clear()        # 设置为False
class ts80053(threading.Thread):
    def __init__(self, usbdevice, post2OneNet=False, timesleep=2):
        threading.Thread.__init__(self)
        self.__flag = threading.Event()  # 用于暂停线程的标识
        self.__flag.set()  # 设置为True
        self.__running = threading.Event()  # 用于停止线程的标识
        self.__running.set()  # 将running设置为True
        #setDaemon(True)当主线程结束之后,会杀死子线程;如果加上join,并设置等待时间,就会等待线程一段时间再退出
        self.setDaemon(True)

        self.timesleep = timesleep
        #usb口转UART CH340
        self.device = usbdevice
        self.client = None

        self.is_device = True

        self.post2OneNet = post2OneNet
        if post2OneNet:
            self.onenet = OneNetApi()

    def run(self):
        self.is_device = self.connect_s80053()
        while self.__running.isSet():
            time.sleep(self.timesleep)
            if self.is_device:
                self.co2 = self.read_CO2()

            if self.post2OneNet:
                self.onenet.num += 1
                if self.onenet.num >= 5:
                    if BasicDef.get_network_status():
                        self.onenet.set_post_data_flow("co2", self.co2)
                        r = self.onenet.post_data_flow()
                    self.onenet.num = 0

    def connect_s80053(self):
        self.client = ModbusSerialClient(method='rtu',
                                         port=self.device,
                                         stopbits=1,
                                         bytesize=8,
                                         baudrate=9600,
                                         timeout=0.5)
        if not self.client.connect():
            print("Unable to connect to %s", self.device)
            return False
        else:
            return True

    def close(self):
        self.client.close()

    def read_CO2(self):
        response = self.client.read_input_registers(address=3,
                                                    count=1,
                                                    unit=0xFE)
        co2 = response.getRegister(0)
        return co2

    #传感器XX数据校验,将偏差值较大数据丢弃
    def check():
        return ""

    def pause(self):
        self.__flag.clear()  # 设置为False, 让线程阻塞

    def resume(self):
        self.__flag.set()  # 设置为True, 让线程停止阻塞

    def stop(self):
        self.__flag.set()  # 将线程从暂停状态恢复, 如何已经暂停的话
        self.__running.clear()  # 设置为False
        self.close()


# def main():
# usbdevice = '/dev/ttyUSB0'
# s80053thread = ts80053(usbdevice)

# if not s80053thread.connect_s80053():
# sys.exit(0)
# else:
# s80053thread.start()
# while True:
# time.sleep(3)
# print(s80053thread.co2)

# if __name__ == "__main__":
# try:
# main()
# except KeyboardInterrupt:
# pass
class tpmsa003(threading.Thread):
    def __init__(self, usbdevice, post2OneNet, timesleep=2):
        threading.Thread.__init__(self)
        self.__flag = threading.Event()  # 用于暂停线程的标识
        self.__flag.set()  # 设置为True
        self.__running = threading.Event()  # 用于停止线程的标识
        self.__running.set()  # 将running设置为True
        #setDaemon(True)当主线程结束之后,会杀死子线程;如果加上join,并设置等待时间,就会等待线程一段时间再退出
        self.setDaemon(True)

        self.timesleep = timesleep
        #usb口转UART CH340
        self.device = usbdevice

        self.timestamp = None
        self.apm10 = 0
        self.apm25 = 0
        self.apm100 = 0
        self.pm25 = 0
        self.pm10 = 0
        self.pm100 = 0
        self.gt03um = 0
        self.gt05um = 0
        self.gt10um = 0
        self.gt25um = 0
        self.gt50um = 0
        self.gt100um = 0
        self.all_PMS = []

        self.pm_res = False
        self.is_device = True

        self.post2OneNet = post2OneNet
        if post2OneNet:
            self.onenet = OneNetApi()

    def run(self):
        #初始化pm传感器失败时
        try:
            self.open_pm_port()
        except OSError as e:
            self.is_device = False
            print("Unable to connect to %s", self.device)
            return self.is_device
        while self.__running.isSet():
            time.sleep(self.timesleep)
            self.pm_res = self.get_pm_data()
            if self.pm_res == False:
                continue

            self.timestamp = self.pm_res['timestamp']
            self.apm10 = self.pm_res['apm10']
            self.apm25 = self.pm_res['apm25']
            self.apm100 = self.pm_res['apm100']
            self.pm25 = self.pm_res['pm25']
            self.pm10 = self.pm_res['pm10']
            self.pm100 = self.pm_res['pm100']
            self.gt03um = self.pm_res['gt03um']
            self.gt05um = self.pm_res['gt05um']
            self.gt10um = self.pm_res['gt10um']
            self.gt25um = self.pm_res['gt25um']
            self.gt50um = self.pm_res['gt50um']
            self.gt100um = self.pm_res['gt100um']
            self.all_PMS = [
                self.apm10, self.apm25, self.apm100, self.pm10, self.pm25,
                self.pm100, self.gt03um, self.gt05um, self.gt10um, self.gt25um,
                self.gt50um, self.gt100um
            ]

            if self.post2OneNet:
                self.onenet.num += 1
                if self.onenet.num >= 10:
                    if BasicDef.get_network_status():
                        self.onenet.set_post_data_flow("apm10", self.apm10)
                        self.onenet.set_post_data_flow("apm25", self.apm25)
                        self.onenet.set_post_data_flow("pm10", self.pm10)
                        self.onenet.set_post_data_flow("pm25", self.pm25)
                        # self.onenet.set_post_data_flow("gt03um", self.gt03um)
                        # self.onenet.set_post_data_flow("gt05um", self.gt05um)
                        r = self.onenet.post_data_flow()
                    self.onenet.num = 0

    def open_pm_port(self):
        self.port = serial.Serial(self.device, baudrate=9600, timeout=2.0)
#默认主动模式,不需要发送数据
        #self.port.write(b'\x42\x4D\xE1\x00\x00\x01\x70')

    def read_pm_line(self):
        rv = b''
        while True:
            ch1 = self.port.read()
            if ch1 == b'\x42':
                ch2 = self.port.read()
                if ch2 == b'\x4d':
                    rv += ch1 + ch2
                    rv += self.port.read(30)
                    return rv

    def get_pm_data(self):
        rcv = self.read_pm_line()
        # print(rcv)
        if sum(rcv[:-2]) == rcv[-2] * 256 + rcv[-1]:
            res = {
                'timestamp': self.getDateTime(),
                'apm10': rcv[4] * 256 + rcv[5],
                'apm25': rcv[6] * 256 + rcv[7],
                'apm100': rcv[8] * 256 + rcv[9],
                'pm10': rcv[10] * 256 + rcv[11],
                'pm25': rcv[12] * 256 + rcv[13],
                'pm100': rcv[14] * 256 + rcv[15],
                'gt03um': rcv[16] * 256 + rcv[17],
                'gt05um': rcv[18] * 256 + rcv[19],
                'gt10um': rcv[20] * 256 + rcv[21],
                'gt25um': rcv[22] * 256 + rcv[23],
                'gt50um': rcv[24] * 256 + rcv[25],
                'gt100um': rcv[26] * 256 + rcv[27]
            }
            return res
        else:
            return False

    #传感器XX数据校验,将偏差值较大数据丢弃
    def checkT():
        return ""

    def getDateTime(self):
        dt = datetime.datetime.now()
        return dt.strftime('%x %H:%M:%S %p')

    def pause(self):
        self.__flag.clear()  # 设置为False, 让线程阻塞

    def resume(self):
        self.__flag.set()  # 设置为True, 让线程停止阻塞

    def stop(self):
        self.__flag.set()  # 将线程从暂停状态恢复, 如何已经暂停的话
        self.__running.clear()  # 设置为False