from umqtt.simple import MQTTClient
import ujson
import network
import time
import urequests
import binascii
img_url = "https://cdn.quotesgram.com/img/66/13/1384074739-bbIfOEI4RPmmmV89pyd2_res_circle_small.gif"
# WiFi Setup
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASSWORD = ""
# MQTT Setup
MQTT_BROKER = "mqtt-dashboard.com"
MQTT_CLIENT = "esp32"
MQTT_TOPIC = "test/image"
def mqtt_connect():
print("\nConnecting to MQTT broker ...", end="")
mqtt_client = MQTTClient(MQTT_CLIENT, MQTT_BROKER, user="", password="")
mqtt_client.connect()
print(". Connected!")
return mqtt_client
def mqtt_client_publish(topic, data):
print("\nUpdating MQTT Broker...")
mqtt_client.publish(topic, data)
print(data + "\n")
def downlod_image(img_url):
img_data = None
print("\nDownloading Image")
# Make an HTTP GET request to download the image
response = urequests.get(img_url)
if response.status_code == 200:
# Image successfully downloaded
print("Image downloaded successfully")
img_data = response.content
print(type(img_data))
else:
# Image download failed
print("Failed to download the image. Status Code:", response.status_code)
response.close()
return img_data
# Connect to WiFi
wifi_client = network.WLAN(network.STA_IF)
wifi_client.active(True)
print("\nConnecting device to WiFi")
wifi_client.connect(WIFI_SSID, WIFI_PASSWORD)
# Wait until WiFi is Connected
while not wifi_client.isconnected():
print(".", end="")
time.sleep(0.1)
print(". Connected!")
print(wifi_client.ifconfig())
# Connect to MQTT
mqtt_client = mqtt_connect()
img = downlod_image(img_url)
# https://stackoverflow.com/questions/68020777/how-do-i-send-an-image-as-a-json-element-using-mqtt-and-python
# data = binascii.b2a_base64(img).decode()
# json_data = ujson.dumps({"image": data})
# if img is not None:
# mqtt_client_publish(MQTT_TOPIC, json_data)
# mqtt_client.disconnect()
chunk_size = 64
try:
# Split the image into chunks and publish each chunk
for i in range(0, len(img), chunk_size):
chunk = img[i:i + chunk_size]
data = binascii.b2a_base64(chunk).decode()
json_data = ujson.dumps({"image": data})
mqtt_client_publish(MQTT_TOPIC, json_data)
print("Published!")
time.sleep(0.5) # Add a delay to avoid overwhelming the MQTT broker
finally:
print("Complete !")
mqtt_client.disconnect()