我的物联网笔记1——Python+MQTT利用阿里云物联网平台实现图传

最近实验有需要用到MQTT传输图像的需求,本人也不太会写除Python以外的代码,恰好今天读到嵌入式圈内的大佬@DS小龙哥的文章:基于阿里云物联网平台设计的实时图传系统 _ 采用 MQTT 协议传输图像
受大佬启发,今天利用Python写一个简单的MQTT图传程序。

软件:
Pycharm
MQTTX
Wireshark
手机端APP:IoT MQTT Panel

由于大佬在文章中已经写了关于在阿里云创建产品、设备及消息转发的相关设置,本文将不再赘述,添加设备后如下图所示:
在这里插入图片描述
我们利用Python脚本发送随机数检查设备接收信息的情况:

import time
import json
import random
import paho.mqtt.client as mqtt

#username和password
#可直接在设备页面一键复制
client_id = f"client_id"
timestamp = str(int(time.time()))
username = f"username"
password = f"password"

# MQTT连接地址
broker = f"mqtthosturl"
port = 1883

# 回调函数
def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    client.subscribe(f"/sys/${ProductKey}/${deviceName}/thing/event/property/post")
    #注意把自己的设备信息更换
def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))
# 创建客户端
client = mqtt.Client(client_id=client_id)
client.username_pw_set(username, password)
# 绑定回调函数
client.on_connect = on_connect
client.on_message = on_message
# 连接到阿里云物联网平台
client.connect(broker, port, 60)
# 启动MQTT客户端
client.loop_start()
# 发送随机数的函数
def publish_random_number():
    topic = f"/sys/${ProductKey}/${deviceName}/thing/event/property/post"
    while True:
        random_number = random.randint(1000000000, 9999999999)
        payload = {
            "method": "thing.event.property.post",
            "params": {
                "image": str(random_number)
            }
        }
        client.publish(topic, json.dumps(payload))
        print(f"Published: {json.dumps(payload)}")
        time.sleep(1)

# 启动发送随机数的循环
publish_random_number()


运行此脚本:
在这里插入图片描述
可以在平台的设备监测里看到:
在这里插入图片描述
OK,设备连接正常,下一步我们来搞一下图片传输
由于@DS小龙哥使用的是QT客户端
在这里插入图片描述
我们要用Python实现此功能需要 重新编写脚本,原理很简单,就是将图片转为base64编码,然后发送端建立与平台的连接,通过MQTT协议发送,平台中转给接收端,接收端可以解码此图片呈现。

直接上代码:

import os
import time
import json
import base64
import hmac
import hashlib
import paho.mqtt.client as mqtt

# 阿里云物联网平台的参数
product_key = "product_key"
device_name = "video_1"
device_secret = "device_secret"
region_id = "cn-shanghai"  # 选择你的阿里云区域

#username和password
#可直接在设备页面一键复制
client_id = f"client_id"
timestamp = str(int(time.time()))
username = f"username"
password = f"password"

# MQTT连接地址
broker = f"mqtthosturl"
port = 1883

# 回调函数
def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected successfully.")
    else:
        print(f"Connection failed with result code {rc}")
    client.subscribe(f"/sys/{product_key}/{device_name}/thing/event/property/post")

def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))

def on_publish(client, userdata, mid):
    print(f"Message {mid} published.")

def on_log(client, userdata, level, buf):
    print("log: ", buf)

# 创建客户端
client = mqtt.Client(client_id=client_id)
client.username_pw_set(username, password)

# 绑定回调函数
client.on_connect = on_connect
client.on_message = on_message
client.on_publish = on_publish
client.on_log = on_log

# 连接到阿里云物联网平台
print(f"Connecting to broker {broker} on port {port}")
client.connect(broker, port, 60)

# 启动MQTT客户端
client.loop_start()

# 读取图像并转换为 Base64 编码的块
def get_image_base64_chunks(image_path, chunk_size=102400):
    with open(image_path, "rb") as image_file:
        image_data = base64.b64encode(image_file.read()).decode('utf-8')
    for i in range(0, len(image_data), chunk_size):
        yield image_data[i:i + chunk_size]

# 发送 Base64 图像块的函数
def publish_image_chunk(image_chunk, chunk_index):
    topic = f"/{product_key}/{device_name}/user/update"
    payload = {
        "method": "thing.event.property.post",
        "params": {
            "image": image_chunk,
            "chunk_index": chunk_index
        }
    }
    result = client.publish(topic, json.dumps(payload))
    print(f"Publishing chunk {chunk_index}: {json.dumps(payload)} with result: {result}")

# 启动发送 Base64 图像块的循环
def publish_images_from_directory(directory):
    while True:  # 无限循环
        image_files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f)) and f.lower().endswith(('.png', '.jpg', '.jpeg'))]
        for image_file in image_files:
            image_path = os.path.join(directory, image_file)
            chunk_index = 0
            for image_chunk in get_image_base64_chunks(image_path):
                publish_image_chunk(image_chunk, chunk_index)
                chunk_index += 1
                time.sleep(1)  # 可以根据需要调整发送间隔时间
            time.sleep(2)  # 每秒发送一张图片

try:
    publish_images_from_directory(r"images direct")  # 替换为你的图像目录路径
except KeyboardInterrupt:
    print("Stopped by User")
    client.loop_stop()
    client.disconnect()

手机端查看接收的图片:
下载这个APP,安卓:IoT MQTT Panel,iOS:IoT MQTT Panel
网络问题自行解决哈
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
按照平台一键复制的数据填写

在这里插入图片描述
保存后自动连接成功了

添加一个面板
添加一个面板
在这里插入图片描述
面板设置如下:
在这里插入图片描述
在这里插入图片描述
让我们启动脚本:
在这里插入图片描述
图片以base64编码的形式发送了
在这里插入图片描述
手机端也接收到图片了

MQTTX看看收到的消息:
在这里插入图片描述
Wireshark抓包
在这里插入图片描述

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 你可以使用 Python 的 paho-mqtt 库来实现 MQTT 协议的数据传输。首先,需要安装 paho-mqtt 库,可以使用 pip 命令进行安装。然后,可以使用以下代码来实现 MQTT 的数据传输: ```python import paho.mqtt.client as mqtt # 连接到 MQTT 服务器 client = mqtt.Client() client.connect("mqtt.example.com", 1883) # 发布消息 client.publish("topic", "message") # 订阅消息 def on_message(client, userdata, message): print(message.topic, message.payload) client.subscribe("topic") client.on_message = on_message # 循环监听消息 client.loop_forever() ``` 其中,"mqtt.example.com" 是 MQTT 服务器的地址,"topic" 是消息的主题,"message" 是消息的内容。使用 publish 方法可以发布消息,使用 subscribe 方法可以订阅消息。在 on_message 方法中可以处理接收到的消息。最后,使用 loop_forever 方法可以循环监听消息。 ### 回答2: 使用Python中的MQTT库可以很容易地实现数据传输。下面是一个简单的步骤: 第一步:安装MQTT库 使用pip命令安装PythonMQTT库,例如paho-mqtt库: pip install paho-mqtt 第二步:引入MQTT库 在Python脚本的开头,引入MQTT库: import paho.mqtt.client as mqtt 第三步:创建MQTT客户端 创建一个MQTT客户端对象,并设置连接的参数: mqtt_client = mqtt.Client(client_id="Client1") # 设置客户端ID mqtt_client.username_pw_set(username="username", password="password") # 设置用户名和密码 mqtt_client.connect(host="mqtt.example.com", port=1883) # 连接到MQTT代理服务器 第四步:定义回调函数 定义一些回调函数,用于处理收到的消息、连接状态等: def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client.subscribe("topic/test") # 订阅主题 def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.payload)) # 处理收到的消息 mqtt_client.on_connect = on_connect mqtt_client.on_message = on_message 第五步:循环监听 使用mqtt_client.loop_forever()方法,持续监听来自MQTT代理服务器的消息并执行回调函数: mqtt_client.loop_forever() 第六步:发送消息 使用mqtt_client.publish()方法发送消息: mqtt_client.publish("topic/test", "Hello, MQTT!") # 发布消息到主题 通过以上步骤,就可以使用PythonMQTT实现数据传输了。注意,具体的配置参数和主题需要根据实际情况进行修改。 ### 回答3: 使用Python MQTT库可以轻松实现数据传输。以下是使用Python MQTT实现数据传输的步骤: 1. 安装MQTT库:使用pip命令安装Python MQTT库,例如paho-mqtt。 2. 导入MQTT库:在Python脚本中导入paho-mqtt库。 3. 建立MQTT连接:使用MQTT客户端对象建立与MQTT代理服务器的连接。可以指定代理服务器的地址和端口号以及可选的用户名和密码。 4. 订阅主题:使用MQTT客户端对象订阅一个或多个主题。主题是消息的目标地址,当代理服务器接收到相关消息时,将把该消息传递给所有订阅该主题的客户端。 5. 发布消息:使用MQTT客户端对象发布消息到一个特定的主题。消息可以是字符串、整数、浮点数等。 6. 处理接收到的消息:编写回调函数来处理接收到的消息。当客户端接收到消息时,回调函数将被触发并执行相应的操作。可以在回调函数中处理所接收到的消息数据。 7. 保持连接并处理循环:在连接建立后,使用MQTT客户端对象的循环函数来保持连接,并处理接收到的消息。循环函数将设置一个循环以等待新消息的到来,并且还会处理与MQTT代理服务器的连接状态。 8. 断开连接:在不需要继续使用MQTT连接时,使用MQTT客户端对象的断开连接函数来关闭与MQTT代理服务器的连接。 通过按照上述步骤,可以使用Python MQTT库来实现数据的传输。记住,在实际应用中,需要确定合适的MQTT代理服务器地址、主题名称和消息内容,以确保正确传输数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值