import ureimport netimport mathimport utimeimport _threadimport modemfrom machine import Timerfrom umqtt import MQTTClientfrom machine import UARTfrom machine import I2Cfrom machine import PinTEMPERATUR = None # 温度HUMIDITY = None # 湿度LIGHT = None # 光照GPSMSG = [] # gps数据class GetDeviceInfo():'''温湿度,GPS数据采集'''def __init__(self):self.uart = UART(UART.UART2, 9600, 8, 0, 1, 0)self.w_data = bytearray({0, 0})self.r_data = bytearray(2)self.I2C_SLAVE_ADDR_HDC1080 = 0x40self.HDC1080_TEMPERATURE = 0x00self.HDC1080_HUMIDITY = 0x01self.HDC1080_CONFIGURATION = 0x02self.HDC1080_MANUFACTURER_ID = 0xFEself.HDC1080_DEVICE_ID = 0xFFself.I2C_SLAVE_ADDR_BH1750 = 0x23self.BH1750_POWER_ON = 0x01self.BH1750_H_RE_MODE = 0x10self.gpio5 = Pin(Pin.GPIO5, Pin.OUT, Pin.PULL_DISABLE, 1)self.gpio5.write(0)self.i2c_obj = I2C(I2C.I2C0, I2C.STANDARD_MODE)reg_addr = bytearray({0x02, 0})self.i2c_obj.write(self.I2C_SLAVE_ADDR_HDC1080, reg_addr, 1, self.w_data, 2)utime.sleep_ms(10)def middle(self):global TEMPERATURglobal HUMIDITYglobal LIGHTglobal GPSMSGwhile True:reg_addr = bytearray({0xFE, 0xFE})self.i2c_obj.read(self.I2C_SLAVE_ADDR_HDC1080, reg_addr, 1, self.r_data, 2, 0)utime.sleep_ms(10)reg_addr = bytearray({0xFF, 0xFF})self.i2c_obj.read(self.I2C_SLAVE_ADDR_HDC1080, reg_addr, 1, self.r_data, 2, 0)utime.sleep_ms(10)reg_addr = bytearray({0x00, 0x00})ret = self.i2c_obj.read(self.I2C_SLAVE_ADDR_HDC1080, reg_addr, 1, self.r_data, 2, 10)if ret == 0:TEMPERATUR = ((self.r_data[0] * 256 + self.r_data[1]) / (2 ** 16)) * 165 - 40print('T', TEMPERATUR)utime.sleep_ms(10)reg_addr = bytearray({0x01, 0x01})ret = self.i2c_obj.read(self.I2C_SLAVE_ADDR_HDC1080, reg_addr, 1, self.r_data, 2, 10)if ret == 0:HUMIDITY = ((self.r_data[0] * 256 + self.r_data[1]) / (2 ** 16)) * 100print('H', HUMIDITY)reg_addr = bytearray({0x01, 0x01})self.i2c_obj.write(self.I2C_SLAVE_ADDR_BH1750, reg_addr, 1, self.w_data, 0)utime.sleep_ms(10)reg_addr = bytearray({0x10, 0x10})self.i2c_obj.write(self.I2C_SLAVE_ADDR_BH1750, reg_addr, 1, self.w_data, 0)utime.sleep_ms(200)reg_addr = bytearray({0x00, 0x00})ret = self.i2c_obj.read(self.I2C_SLAVE_ADDR_BH1750, reg_addr, 0, self.r_data, 2, 0)if ret == 0:LIGHT = (self.r_data[0] * 256 + self.r_data[1]) / 1.2print('L', LIGHT)len = self.uart.any()if len > 0:buf = self.uart.read(len)gps_data = buf.decode().strip("b")# print(gps_data)try:r = ure.search("GPRMC(.+?)M", gps_data)gps_msg = r.group(0).split(",")except Exception as e:continueprint("GPS", gps_msg)utime.sleep(1)def run(self):_thread.start_new_thread(self.middle, ())def lng_format(l):'''经纬度纠偏:param l::return:'''r = str(float(l) / 100)d, f = r.split(".")a = str(float("0." + f) * 100 / 60)res = a.split(".")[1][0:6]data = d + reslens = len(data)if lens < 9:if lens == 8:data = data + "0"elif lens == 7:data = data + "00"elif lens == 6:data = data + "000"return int(data)def lat_format(l):'''经纬度纠偏:param l::return:'''r = str(float(l) / 100)d, f = r.split(".")a = str(float("0." + f) * 100 / 60)res = a.split(".")[1][0:6]data = d + reslens = len(data)if lens < 8:if lens == 7:data = data + "0"elif lens == 6:data = data + "00"return int(data)# gps数据处理def gpsFormat(data_l):# print(data_l)try:lon = data_l[5]lat = data_l[3]lon_d = data_l[6]lat_d = data_l[4]lon = lng_format(lon) # 31492931lat = lat_format(lat) # 117069201except:return# print(lon, lat)if lon_d == "E":lon_d = "01" # 东经else:lon_d = "02" # 西经if lat_d == "N":lat_d = "02" # 北纬else:lat_d = "01" # 南纬lon = gpsIntTo16(lon)lat = gpsIntTo16(lat)print("GPS", lon, lat)gps_data = "{}{}{}{}".format(lon_d, lon, lat_d, lat)# print(gps_data)return gps_datadef gpsIntTo16(n):'''gps int to 16进制'''msg = hex(n)[2:]msg_len = len(msg)if msg_len < 8:if msg_len == 7:msg = "0" + msgelif msg_len == 6:msg = "00" + msgelif msg_len == 5:msg = "000" + msgreturn msgdef NumIntTo16(n):'''序号 csq int to 16进制'''if n == 16:return "10"msg = hex(n).strip("0x")if int(msg, 16) != n:msg = msg + "0"msg_len = len(msg)if msg_len < 2:msg = "0" + msgreturn msgdef timeIntTo16(n):'''时间戳转换16进制'''msg = hex(n).strip("0x")while int(msg, 16) != n:msg = msg + "0"msg_len = len(msg)if msg_len < 4:if msg_len == 3:msg = "0" + msgelif msg_len == 2:msg = "00" + msgelif msg_len == 1:msg = "000" + msgreturn msgdef l_IntTo16(n):'''光照 int to 16进制'''msg = hex(n).strip("0x")while int(msg, 16) != n:msg = msg + "0"msg_len = len(msg)if msg_len < 4:if msg_len == 3:msg = "0" + msgelif msg_len == 2:msg = "00" + msgelif msg_len == 1:msg = "000" + msgreturn msgdef t_h_format(n):'''温湿度 int To 16进制:param n::return:'''result = math.ceil(n * 100)ret = timeIntTo16(result)return retcount = 0def TrackerMsgFormat(temperature, humidity, light, gps, iccid):'''上传数据整合,按照要求格式凭接:param temperature::param humidity::param light::param gps::return:'''global countif count == 256:count = 0count += 1num = NumIntTo16(count)# 当前时间戳time_s = timeIntTo16(utime.mktime(utime.localtime()))# csqcsq = NumIntTo16(net.csqQueryPoll())# 温度t = t_h_format(temperature)# 湿度h = t_h_format(humidity)# 光照l = l_IntTo16(math.ceil(light))# gps数据gps_msg = gpsFormat(gps)imei = "3" + "3".join(modem.getDevImei())iccid = "3" + "3".join(iccid)# 拼接数据包TrackerMsgFormat = "fa{num}{time}{imei}004d0110001d{iccid}{csq}fcb000b60000003c200004{TH}220002{l}23001101{gps}00000000000013"# 383634343330303130303031303935 3839383631313138323832303039363539343531TrackerData = TrackerMsgFormat.format(num=num, time=time_s, imei=imei, iccid=iccid, csq=csq, TH=(t + h), l=l,gps=gps_msg)return TrackerDataclass MqttClient():'''mqtt init'''def __init__(self, clientid, server, port, pw):self.clientid = clientidself.pw = pwself.server = serverself.port = portself.uasename = clientidself.client = Nonedef connect(self):self.client = MQTTClient(self.clientid, self.server, self.port, self.uasename, self.pw, keepalive=300)self.client.set_callback(self.sub_cb)self.client.connect()def sub_cb(self, topic, msg):print("Subscribe Recv: %s, %s" % (topic.decode(), msg.decode()))def subscribe(self, topic, qos=0):self.client.subscribe(topic, qos)def publish(self, topic, msg, qos=0):self.client.publish(topic, msg, qos)def disconnect(self):self.disconnect()def __loop_forever(self, t):# print("loop_forever")try:self.client.ping()except:return -1def __listen(self):while True:try:self.client.wait_msg()except OSError as e:return -1def start(self):_thread.start_new_thread(self.__listen, ())t = Timer(1)t.start(period=20000, mode=t.PERIODIC, callback=self.__loop_forever)if __name__ == '__main__':print("############### GetDeviceInfo #############")g = GetDeviceInfo()g.run()# MQTT initclientid = "{imei}_1"pw = ""iccid = ""mqttServer = "220.180.239.212"c = MqttClient(clientid, mqttServer, 8420, pw)c.connect()sub_topic = "quec/{imei}/down"pub_topic = "quec/{imei}/up"c.subscribe(sub_topic)c.start()while 1:utime.sleep(3)if (TEMPERATUR != None) and (HUMIDITY != None) and (LIGHT != None) and (GPSMSG != []):if GPSMSG[3] != "":print("T", TEMPERATUR)print("H", HUMIDITY)print("L", LIGHT)print("G", GPSMSG)try:data = TrackerMsgFormat(TEMPERATUR, HUMIDITY, LIGHT, GPSMSG, iccid)c.publish(pub_topic, data) # 发布到云端except:continueelse:print("Get the GPS data")else:print("Get the GPS data")
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。