# ==============================
# RASPERITY : IoT Security System
# Secure Temperature & Humidity Monitor with MQTT + HMAC
# ==============================
import network, time, ubinascii, machine, ujson, hashlib
from umqtt.simple import MQTTClient
from machine import Pin
import dht
# ---------- CONFIG -------------
WIFI_SSID = "your_wifi_name"
WIFI_PASS = "your_wifi_password"
MQTT_BROKER = "broker.hivemq.com" # Public free broker
MQTT_PORT = 1883
MQTT_TOPIC = b"rasperity/data"
CLIENT_ID = ubinascii.hexlify(machine.unique_id())
SECRET_KEY = b"supersecretkey" # Shared secret for HMAC
# DHT11 sensor on GP15 (change if needed)
sensor = dht.DHT11(Pin(15))
# ---------- WIFI CONNECTION -------------
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print("š Connecting to Wi-Fi...", end="")
wlan.connect(WIFI_SSID, WIFI_PASS)
while not wlan.isconnected():
print(".", end="")
time.sleep(1)
print("\nā
Wi-Fi connected:", wlan.ifconfig())
# ---------- MQTT COMMUNICATION ----------
def connect_mqtt():
try:
client = MQTTClient(CLIENT_ID, MQTT_BROKER, port=MQTT_PORT)
client.connect()
print("ā
Connected to MQTT broker:", MQTT_BROKER)
return client
except Exception as e:
print("ā MQTT connect failed:", e)
return None
def publish_mqtt(client, temp, hum):
try:
payload = {"temp": temp, "hum": hum}
msg = ujson.dumps(payload)
# Calculate HMAC signature
signature = hmac.new(SECRET_KEY, msg.encode(), hashlib.sha256).hexdigest()
secure_payload = ujson.dumps({"data": payload, "hmac": signature})
client.publish(MQTT_TOPIC, secure_payload)
print("š¤ Published:", secure_payload)
except Exception as e:
print("ā ļø Publish error:", e)
# ---------- MAIN LOOP -------------
connect_wifi()
client = connect_mqtt()
while True:
try:
sensor.measure()
temp = sensor.temperature()
hum = sensor.humidity()
print(f"š” Temp: {temp}°C š§ Hum: {hum}%")
if client:
publish_mqtt(client, temp, hum)
else:
print("ā ļø MQTT not connected, retrying...")
client = connect_mqtt()
except Exception as e:
print("ā ļø Sensor/MQTT Error:", e)
time.sleep(5)