当前位置:   article > 正文

ESP32 蓝牙网关实践:BLE 设备数据采集与 MQTT 云平台发布(附代码示例)_蓝牙组建数据采集

蓝牙组建数据采集

摘要: 本文详细介绍了如何使用 ESP32 构建强大的蓝牙网关,实现蓝牙设备与 Wi-Fi/互联网之间的无缝连接和数据桥接。文章涵盖了连接和桥接功能、数据处理和分析能力,并提供了详细的代码示例和 Mermaid 生成的图表,助您轻松构建自己的蓝牙网关解决方案。

一、 引言

随着物联网 (IoT) 的快速发展,蓝牙技术凭借其低功耗、低成本和易用性,在连接各种传感器、设备和智能家居产品方面发挥着至关重要的作用。然而,蓝牙设备通常通信范围有限,且无法直接连接互联网。ESP32 是一款功能强大的微控制器,集成了 Wi-Fi 和蓝牙功能,使其成为构建蓝牙网关的理想选择,可以将蓝牙设备连接到互联网,实现远程监控和控制。

二、 ESP32 蓝牙网关功能

ESP32 蓝牙网关可以实现以下关键功能:

1. 连接和桥接:

  • 蓝牙到 Wi-Fi/互联网桥接: ESP32 可以连接到蓝牙传感器、设备或信标,并将收集的数据通过 Wi-Fi 传输到云平台或本地服务器,实现远程监控和控制。
  • 蓝牙到蓝牙桥接: 扩展蓝牙设备的通信范围,例如连接位于不同房间或楼层的蓝牙设备。
  • 支持多种蓝牙协议: ESP32 支持多种蓝牙协议,包括 Bluetooth Classic (SPP, HID) 和 Bluetooth Low Energy (BLE),以连接各种类型的蓝牙设备。

2. 数据处理和分析:

  • 数据过滤和聚合: ESP32 可以对从蓝牙设备收集的数据进行预处理,例如过滤噪声数据或聚合多个传感器的数据,以减少网络负载并提高效率。
  • 本地数据存储: 使用 SD 卡或外部存储器,ESP32 可以存储从蓝牙设备收集的数据,以便在网络连接不可用时进行缓存或离线分析。
  • 边缘计算: ESP32 可以执行简单的计算任务,例如数据转换、阈值警报和趋势分析,从而减少数据传输量并提高响应速度。

三、 系统架构

下图展示了 ESP32 蓝牙网关的典型系统架构:

架构说明:

  • 多个蓝牙设备(例如传感器、智能灯泡、智能门锁)通过蓝牙连接到 ESP32 蓝牙网关。
  • ESP32 蓝牙网关通过 Wi-Fi 或以太网连接到互联网或本地服务器。
  • ESP32 网关可以将数据转发到云平台或本地服务器,也可以在本地处理数据并执行边缘计算任务。

四、 代码示例

以下是一个简单的 ESP32 蓝牙网关代码示例,演示了如何使用 BLE 连接到蓝牙传感器并通过 Wi-Fi 将数据发送到 MQTT broker:

  1. #include <Arduino.h>
  2. #include <BLEDevice.h>
  3. #include <BLEUtils.h>
  4. #include <BLEScan.h>
  5. #include <BLEAdvertisedDevice.h>
  6. #include <WiFi.h>
  7. #include <PubSubClient.h>
  8. // 设置 Wi-Fi 和 MQTT broker 信息
  9. const char* ssid = "your_wifi_ssid";
  10. const char* password = "your_wifi_password";
  11. const char* mqtt_server = "your_mqtt_broker_ip";
  12. const int mqtt_port = 1883;
  13. // 设置蓝牙服务和特征 UUID
  14. static BLEUUID serviceUUID("your_service_uuid");
  15. static BLEUUID characteristicUUID("your_characteristic_uuid");
  16. // 创建 BLE 和 MQTT 客户端
  17. BLEAdvertisedDevice* myDevice;
  18. WiFiClient espClient;
  19. PubSubClient client(espClient);
  20. // 连接到 Wi-Fi
  21. void setupWifi() {
  22. delay(10);
  23. Serial.println();
  24. Serial.print("Connecting to ");
  25. Serial.println(ssid);
  26. WiFi.begin(ssid, password);
  27. while (WiFi.status() != WL_CONNECTED) {
  28. delay(500);
  29. Serial.print(".");
  30. }
  31. Serial.println("");
  32. Serial.println("WiFi connected!");
  33. Serial.println("IP address: ");
  34. Serial.println(WiFi.localIP());
  35. }
  36. // 连接到 MQTT broker
  37. void reconnect() {
  38. while (!client.connected()) {
  39. Serial.print("Attempting MQTT connection...");
  40. if (client.connect("ESP32Client")) {
  41. Serial.println("connected");
  42. } else {
  43. Serial.print("failed, rc=");
  44. Serial.print(client.state());
  45. Serial.println(" try again in 5 seconds");
  46. delay(5000);
  47. }
  48. }
  49. }
  50. // 扫描蓝牙设备
  51. class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
  52. void onResult(BLEAdvertisedDevice advertisedDevice) {
  53. if (advertisedDevice.haveServiceUUID() && advertisedDevice.isAdvertisingService(serviceUUID)) {
  54. BLEDevice::getScan()->stop();
  55. myDevice = new BLEAdvertisedDevice(advertisedDevice);
  56. }
  57. }
  58. };
  59. // 连接到蓝牙设备
  60. bool connectToSensor() {
  61. BLEClient* pClient = BLEDevice::createClient();
  62. Serial.println(" - Created client");
  63. // 连接到 GATT 服务器
  64. Serial.println(" - Connecting to server...");
  65. if (!pClient->connect(myDevice)) {
  66. Serial.println(" - Failed to connect to server");
  67. return false;
  68. }
  69. Serial.println(" - Connected to server");
  70. // 获取服务
  71. BLERemoteService* pRemoteService = pClient->getService(serviceUUID);
  72. if (pRemoteService == nullptr) {
  73. Serial.print(" - Failed to find our service UUID: ");
  74. Serial.println(serviceUUID.toString().c_str());
  75. return false;
  76. }
  77. Serial.println(" - Found our service");
  78. // 获取特征
  79. BLERemoteCharacteristic* pRemoteCharacteristic = pRemoteService->getCharacteristic(characteristicUUID);
  80. if (pRemoteCharacteristic == nullptr) {
  81. Serial.print(" - Failed to find our characteristic UUID: ");
  82. Serial.println(characteristicUUID.toString().c_str());
  83. return false;
  84. }
  85. Serial.println(" - Found our characteristic");
  86. // 读取特征值
  87. std::string value = pRemoteCharacteristic->readValue();
  88. Serial.print(" - The characteristic value was: ");
  89. Serial.println(value.c_str());
  90. // 发送数据到 MQTT broker
  91. if (client.connected()) {
  92. client.publish("sensor/data", value.c_str());
  93. }
  94. return true;
  95. }
  96. void setup() {
  97. Serial.begin(115200);
  98. setupWifi();
  99. client.setServer(mqtt_server, mqtt_port);
  100. client.setCallback(callback);
  101. // 初始化蓝牙
  102. BLEDevice::init("ESP32_Gateway");
  103. BLEScan* pBLEScan = BLEDevice::getScan();
  104. pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  105. pBLEScan->setInterval(2000);
  106. pBLEScan->start(60, false);
  107. }
  108. void loop() {
  109. if (!client.connected())
  110. {
  111. reconnect();
  112. }
  113. client.loop();
  114. if (myDevice) {
  115. if (connectToSensor()) {
  116. Serial.println("Data sent to MQTT broker!");
  117. } else {
  118. Serial.println("Failed to connect to sensor!");
  119. }
  120. myDevice = nullptr;
  121. delay(5000); // 等待 5 秒后再次扫描
  122. BLEDevice::getScan()->start(60, false);
  123. }
  124. }

代码说明:

  1. 设置 Wi-Fi 和 MQTT broker 信息: 替换 ssidpasswordmqtt_server 和 mqtt_port 为您的实际网络和 MQTT broker 信息。
  2. 设置蓝牙服务和特征 UUID: 替换 serviceUUID 和 characteristicUUID 为您要连接的蓝牙设备的服务和特征 UUID。
  3. 扫描蓝牙设备: 使用 BLEScan 类扫描附近的蓝牙设备,并查找与指定服务 UUID 匹配的设备。
  4. 连接到蓝牙设备: 使用 BLEClient 类连接到找到的蓝牙设备,并获取指定特征的值。
  5. 发送数据到 MQTT broker: 使用 PubSubClient 库将获取的蓝牙传感器数据发布到指定的 MQTT 主题。

五、 总结

本文介绍了如何使用 ESP32 构建蓝牙网关,实现蓝牙设备与 Wi-Fi/互联网之间的连接和数据桥接。通过结合 ESP32 强大的硬件功能和灵活的软件库,您可以轻松构建自定义的蓝牙网关解决方案,满足各种物联网应用的需求。

注意:

  • 本文提供的代码示例仅供参考,您需要根据实际需求进行修改和完善。
  • 在实际应用中,您可能需要考虑安全性、功耗优化和数据可靠性等方面的问题。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/1011550
推荐阅读
相关标签
  

闽ICP备14008679号