Advertisement
nomanwomman

pico will not run with this

Oct 29th, 2023 (edited)
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.24 KB | None | 0 0
  1. umqtt_simple.py
  2.  
  3. import usocket as socket
  4. import ustruct as struct
  5. from ubinascii import hexlify
  6.  
  7.  
  8. class MQTTException(Exception):
  9.     pass
  10.  
  11.  
  12. class MQTTClient:
  13.     def __init__(
  14.         self,
  15.         client_id,
  16.         server,
  17.         port=0,
  18.         user=None,
  19.         password=None,
  20.         keepalive=0,
  21.         ssl=False,
  22.         ssl_params={},
  23.     ):
  24.         if port == 0:
  25.             port = 8883 if ssl else 1883
  26.         self.client_id = client_id
  27.         self.sock = None
  28.         self.server = server
  29.         self.port = port
  30.         self.ssl = ssl
  31.         self.ssl_params = ssl_params
  32.         self.pid = 0
  33.         self.cb = None
  34.         self.user = user
  35.         self.pswd = password
  36.         self.keepalive = keepalive
  37.         self.lw_topic = None
  38.         self.lw_msg = None
  39.         self.lw_qos = 0
  40.         self.lw_retain = False
  41.  
  42.     def _send_str(self, s):
  43.         self.sock.write(struct.pack("!H", len(s)))
  44.         self.sock.write(s)
  45.  
  46.     def _recv_len(self):
  47.         n = 0
  48.         sh = 0
  49.         while 1:
  50.             b = self.sock.read(1)[0]
  51.             n |= (b & 0x7F) << sh
  52.             if not b & 0x80:
  53.                 return n
  54.             sh += 7
  55.  
  56.     def set_callback(self, f):
  57.         self.cb = f
  58.  
  59.     def set_last_will(self, topic, msg, retain=False, qos=0):
  60.         assert 0 <= qos <= 2
  61.         assert topic
  62.         self.lw_topic = topic
  63.         self.lw_msg = msg
  64.         self.lw_qos = qos
  65.         self.lw_retain = retain
  66.  
  67.     def connect(self, clean_session=True):
  68.         self.sock = socket.socket()
  69.         addr = socket.getaddrinfo(self.server, self.port)[0][-1]
  70.         self.sock.connect(addr)
  71.         if self.ssl:
  72.             import ussl
  73.  
  74.             self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
  75.         premsg = bytearray(b"\x10\0\0\0\0\0")
  76.         msg = bytearray(b"\x04MQTT\x04\x02\0\0")
  77.  
  78.         sz = 10 + 2 + len(self.client_id)
  79.         msg[6] = clean_session << 1
  80.         if self.user is not None:
  81.             sz += 2 + len(self.user) + 2 + len(self.pswd)
  82.             msg[6] |= 0xC0
  83.         if self.keepalive:
  84.             assert self.keepalive < 65536
  85.             msg[7] |= self.keepalive >> 8
  86.             msg[8] |= self.keepalive & 0x00FF
  87.         if self.lw_topic:
  88.             sz += 2 + len(self.lw_topic) + 2 + len(self.lw_msg)
  89.             msg[6] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3
  90.             msg[6] |= self.lw_retain << 5
  91.  
  92.         i = 1
  93.         while sz > 0x7F:
  94.             premsg[i] = (sz & 0x7F) | 0x80
  95.             sz >>= 7
  96.             i += 1
  97.         premsg[i] = sz
  98.  
  99.         self.sock.write(premsg, i + 2)
  100.         self.sock.write(msg)
  101.         # print(hex(len(msg)), hexlify(msg, ":"))
  102.         self._send_str(self.client_id)
  103.         if self.lw_topic:
  104.             self._send_str(self.lw_topic)
  105.             self._send_str(self.lw_msg)
  106.         if self.user is not None:
  107.             self._send_str(self.user)
  108.             self._send_str(self.pswd)
  109.         resp = self.sock.read(4)
  110.         assert resp[0] == 0x20 and resp[1] == 0x02
  111.         if resp[3] != 0:
  112.             raise MQTTException(resp[3])
  113.         return resp[2] & 1
  114.  
  115.     def disconnect(self):
  116.         self.sock.write(b"\xe0\0")
  117.         self.sock.close()
  118.  
  119.     def ping(self):
  120.         self.sock.write(b"\xc0\0")
  121.  
  122.     def publish(self, topic, msg, retain=False, qos=0):
  123.         pkt = bytearray(b"\x30\0\0\0")
  124.         pkt[0] |= qos << 1 | retain
  125.         sz = 2 + len(topic) + len(msg)
  126.         if qos > 0:
  127.             sz += 2
  128.         assert sz < 2097152
  129.         i = 1
  130.         while sz > 0x7F:
  131.             pkt[i] = (sz & 0x7F) | 0x80
  132.             sz >>= 7
  133.             i += 1
  134.         pkt[i] = sz
  135.         # print(hex(len(pkt)), hexlify(pkt, ":"))
  136.         self.sock.write(pkt, i + 1)
  137.         self._send_str(topic)
  138.         if qos > 0:
  139.             self.pid += 1
  140.             pid = self.pid
  141.             struct.pack_into("!H", pkt, 0, pid)
  142.             self.sock.write(pkt, 2)
  143.         self.sock.write(msg)
  144.         if qos == 1:
  145.             while 1:
  146.                 op = self.wait_msg()
  147.                 if op == 0x40:
  148.                     sz = self.sock.read(1)
  149.                     assert sz == b"\x02"
  150.                     rcv_pid = self.sock.read(2)
  151.                     rcv_pid = rcv_pid[0] << 8 | rcv_pid[1]
  152.                     if pid == rcv_pid:
  153.                         return
  154.         elif qos == 2:
  155.             assert 0
  156.  
  157.     def subscribe(self, topic, qos=0):
  158.         assert self.cb is not None, "Subscribe callback is not set"
  159.         pkt = bytearray(b"\x82\0\0\0")
  160.         self.pid += 1
  161.         struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid)
  162.         # print(hex(len(pkt)), hexlify(pkt, ":"))
  163.         self.sock.write(pkt)
  164.         self._send_str(topic)
  165.         self.sock.write(qos.to_bytes(1, "little"))
  166.         while 1:
  167.             op = self.wait_msg()
  168.             if op == 0x90:
  169.                 resp = self.sock.read(4)
  170.                 # print(resp)
  171.                 assert resp[1] == pkt[2] and resp[2] == pkt[3]
  172.                 if resp[3] == 0x80:
  173.                     raise MQTTException(resp[3])
  174.                 return
  175.  
  176.     # Wait for a single incoming MQTT message and process it.
  177.     # Subscribed messages are delivered to a callback previously
  178.     # set by .set_callback() method. Other (internal) MQTT
  179.     # messages processed internally.
  180.     def wait_msg(self):
  181.         res = self.sock.read(1)
  182.         self.sock.setblocking(True)
  183.         if res is None:
  184.             return None
  185.         if res == b"":
  186.             raise OSError(-1)
  187.         if res == b"\xd0":  # PINGRESP
  188.             sz = self.sock.read(1)[0]
  189.             assert sz == 0
  190.             return None
  191.         op = res[0]
  192.         if op & 0xF0 != 0x30:
  193.             return op
  194.         sz = self._recv_len()
  195.         topic_len = self.sock.read(2)
  196.         topic_len = (topic_len[0] << 8) | topic_len[1]
  197.         topic = self.sock.read(topic_len)
  198.         sz -= topic_len + 2
  199.         if op & 6:
  200.             pid = self.sock.read(2)
  201.             pid = pid[0] << 8 | pid[1]
  202.             sz -= 2
  203.         msg = self.sock.read(sz)
  204.         self.cb(topic, msg)
  205.         if op & 6 == 2:
  206.             pkt = bytearray(b"\x40\x02\0\0")
  207.             struct.pack_into("!H", pkt, 2, pid)
  208.             self.sock.write(pkt)
  209.         elif op & 6 == 4:
  210.             assert 0
  211.         return op
  212.  
  213.     # Checks whether a pending message from server is available.
  214.     # If not, returns immediately with None. Otherwise, does
  215.     # the same processing as wait_msg.
  216.     def check_msg(self):
  217.         self.sock.setblocking(False)
  218.         return self.wait_msg()
  219.  
  220.  
  221.  
  222.  
  223. main.py
  224.  
  225.  
  226.  
  227. # Bibliotheken laden
  228. from machine import Pin
  229. import network
  230. import time
  231. from onewire import OneWire
  232. from ds18x20 import DS18X20
  233. from time import sleep, sleep_ms
  234. from umqtt_simple import MQTTClient
  235.  
  236. # WLAN-Konfiguration
  237. wlanSSID = 'WLANNAME'
  238. wlanPW = 'WLANPASSWORD'
  239. network.country('DE')
  240.  
  241. # MQTT-Konfiguration
  242. mqttBroker = '192.168.188.20'
  243. mqttClient = 'pico'
  244. mqttUser = 'mqttuser'
  245. mqttPW = 'PASSWORD'
  246. mqttTopic = 'temp/draussen'
  247.  
  248. # Status-LED für die WLAN-Verbindung
  249. led_onboard = machine.Pin('LED', machine.Pin.OUT, value=0)
  250.  
  251. # Initialisierung GPIO, OneWire und DS18B20
  252. one_wire_bus = Pin(16)
  253. sensor_ds = DS18X20(OneWire(one_wire_bus))
  254.  
  255. # One-Wire-Geräte ermitteln
  256. devices = sensor_ds.scan()
  257. #print(devices)
  258.  
  259. # Funktion: WLAN-Verbindung herstellen
  260. def wlanConnect():
  261.     wlan = network.WLAN(network.STA_IF)
  262.     if not wlan.isconnected():
  263.         print('WLAN-Verbindung herstellen:', wlanSSID)
  264.         wlan.active(True)
  265.         wlan.connect(wlanSSID, wlanPW)
  266.         for i in range(10):
  267.             if wlan.status() < 0 or wlan.status() >= 3:
  268.                 break
  269.             led_onboard.toggle()
  270.             print('.')
  271.             time.sleep(1)
  272.     if wlan.isconnected():
  273.         print('WLAN-Verbindung hergestellt / WLAN-Status:', wlan.status())
  274.         print()
  275.         led_onboard.on()
  276.     else:
  277.         print('Keine WLAN-Verbindung / WLAN-Status:', wlan.status())
  278.         print()
  279.         led_onboard.off()
  280.  
  281. # Funktion: Verbindung zum MQTT-Server herstellen
  282. def mqttConnect():
  283.     if mqttUser != '' and mqttPW != '':
  284.         print("MQTT-Verbindung herstellen: %s mit %s als %s" % (mqttClient, mqttBroker, mqttUser))
  285.         client = MQTTClient(mqttClient, mqttBroker, user=mqttUser, password=mqttPW)
  286.     else:
  287.         print("MQTT-Verbindung herstellen: %s mit %s" % (mqttClient, mqttBroker))
  288.         client = MQTTClient(mqttClient, mqttBroker)
  289.     client.connect()
  290.     print()
  291.     print('MQTT-Verbindung hergestellt')
  292.     print()
  293.     return client
  294.  
  295. # WLAN-Verbindung herstellen
  296. wlanConnect()
  297.  
  298. # Funktion zur Taster-Auswertung
  299. while True:
  300.     # Temperatur messen
  301.     sensor_ds.convert_temp()
  302.     # Warten: min. 750 ms
  303.     sleep_ms(750)
  304.     # Sensoren abfragen
  305.     for device in devices:
  306.         client = mqttConnect()
  307.         temp_1 = float(sensor_ds.read_temp(device))
  308.         temp_2 = round(temp_1, 1)
  309.         temp = str(temp_2)
  310.         client.publish(mqttTopic, temp)
  311.         print("An Topic %s gesendet: %s" %  (mqttTopic, temp))
  312.         print()
  313.         client.disconnect()
  314.         print('MQTT-Verbindung beendet')
  315.         print()
  316.     # 60 Sekunden warten
  317.     time.sleep(60)
  318.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement