- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从事一个涉及 2 个 ESP32 Wemos D1 迷你板的项目。我正在使用 BLE 功能将传感器读数从“服务器”传输到“客户端”。我向接收传感器读数的客户端使用特征通知。如果我想对服务器实现深度 sleep 功能,客户端会发生什么情况?客户端是否也必须在某个时候重置?另外,是否建议在深度 sleep 场景中使用 Characteristic.Notify?
谢谢。
服务器代码:
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include "DHT.h"
#define DHTPIN 4
#define DHTTYPE DHT22
#define uS_TO_S_FACTOR 1000000 //Conversion factor for micro seconds to seconds
#define TIME_TO_SLEEP 15 //Time ESP32 will go to sleep (in seconds)
RTC_DATA_ATTR int bootCount = 0;
DHT dht(DHTPIN, DHTTYPE);
BLECharacteristic *pCharacteristic;
bool deviceConnected = false;
uint8_t txValue = 50;
#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
}
};
//Function that prints the reason by which ESP32 has been awaken from sleep
void print_wakeup_reason(){
esp_sleep_wakeup_cause_t wakeup_reason;
wakeup_reason = esp_sleep_get_wakeup_cause();
switch(wakeup_reason)
{
case 1 : Serial.println("Wakeup caused by external signal using RTC_IO"); break;
case 2 : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
case 3 : Serial.println("Wakeup caused by timer"); break;
case 4 : Serial.println("Wakeup caused by touchpad"); break;
case 5 : Serial.println("Wakeup caused by ULP program"); break;
default : Serial.println("Wakeup was not caused by deep sleep"); break;
}
}
void setup() {
Serial.begin(115200);
Serial.println(F("initating DHT22..."));
dht.begin();
// Create the BLE Device
BLEDevice::init("UART"); // Name must not be longer than 5 chars!!!
// Create the BLE Server
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
// Create the BLE Service
BLEService *pService = pServer->createService(SERVICE_UUID);
// Create a BLE Characteristic
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID_TX,
BLECharacteristic::PROPERTY_NOTIFY|BLECharacteristic::PROPERTY_READ|BLECharacteristic::PROPERTY_WRITE
);
BLE2902 *desc = new BLE2902();
desc->setNotifications(true);
pCharacteristic->addDescriptor(desc);
// Start the service
pService->start();
pServer->getAdvertising()->addServiceUUID(SERVICE_UUID);
// Start advertising
pServer->getAdvertising()->start();
Serial.println(pService->getUUID().toString().c_str());
Serial.println("Waiting a client connection to notify...");
if (deviceConnected) {
float f = dht.readTemperature(true);
char fStr[10];
sprintf(fStr, "%4.4f", f);
Serial.print("Temperature reading: ");
Serial.println(fStr);
Serial.printf("*** Sent Value: %d ***\n", fStr);
pCharacteristic->setValue(fStr);
pCharacteristic->notify();
//Set timer to 5 seconds
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) +
" Seconds");
//Go to sleep now
esp_deep_sleep_start();
}
//delay(60000);
}
void loop() {}
客户端代码:
#include "BLEDevice.h"
#include <WiFi.h>
// The remote service we wish to connect to.
static BLEUUID serviceUUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E");
static BLEUUID charUUID("6E400003-B5A3-F393-E0A9-E50E24DCCA9E");
static BLEAddress *pServerAddress;
static boolean doConnect = false;
static boolean connected = false;
static BLERemoteCharacteristic* pRemoteCharacteristic;
const char* ssid = "Kings";
const char* password = "GoCanada";
const char* host = "menezes-service.herokuapp.com";
WiFiClient client;
static void notifyCallback(
BLERemoteCharacteristic* pBLERemoteCharacteristic,
uint8_t* pData,
size_t length,
bool isNotify) {
Serial.print(pBLERemoteCharacteristic->getUUID().toString().c_str());
Serial.print(" of data length ");
Serial.println(length);
//std::string value = pBLERemoteCharacteristic->readValue();
byte buffer[42];
Serial.print("The characteristic value sent was: ");
//Serial.println(pBLERemoteCharacteristic->readValue().c_str());
//Serial.println(pBLERemoteCharacteristic->readUInt8());
std::string farhenheight = pRemoteCharacteristic->readValue();
Serial.print("Farheinheight: ");
Serial.println(farhenheight.c_str());
Serial.println(F("Posting to api!"));
Serial.println();
Serial.println("closing connection");
}
class MyClientCallback : public BLEClientCallbacks {
void onConnect(BLEClient* pclient) {
Serial.println("connected again ... ");
}
void onDisconnect(BLEClient* pclient) {
connected = false;
Serial.println("onDisconnect");
}
};
bool connectToServer(BLEAddress pAddress) {
Serial.print("Forming a connection to ");
Serial.println(pAddress.toString().c_str());
BLEClient* pClient = BLEDevice::createClient();
Serial.println(" - Created client");
pClient->setClientCallbacks(new MyClientCallback());
// Connect to the remove BLE Server.
pClient->connect(pAddress);
Serial.println(" - Connected to server");
// Obtain a reference to the service we are after in the remote BLE server.
BLERemoteService* pRemoteService = pClient->getService(serviceUUID);
Serial.println(pRemoteService->toString().c_str());
if (pRemoteService == nullptr) {
Serial.print("Failed to find our service UUID: ");
Serial.println(serviceUUID.toString().c_str());
return false;
}
Serial.println(" - Found our service");
// Obtain a reference to the characteristic in the service of the remote BLE server.
pRemoteCharacteristic = pRemoteService->getCharacteristic(charUUID);
if (pRemoteCharacteristic == nullptr) {
Serial.print("Failed to find our characteristic UUID: ");
Serial.println(charUUID.toString().c_str());
return false;
}
Serial.println(" - Found our characteristic");
pRemoteCharacteristic->registerForNotify(notifyCallback);
}
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
Serial.print("BLE Advertised Device found: ");
Serial.println(advertisedDevice.toString().c_str());
//Serial.print(advertisedDevice.haveServiceUUID());
if(advertisedDevice.haveServiceUUID()){
Serial.println(advertisedDevice.getServiceUUID().toString().c_str());
}
// We have found a device, let us now see if it contains the service we are looking for.
if (advertisedDevice.haveServiceUUID() && advertisedDevice.getServiceUUID().equals(serviceUUID)) {
//
Serial.print("Found our device! address: ");
advertisedDevice.getScan()->stop();
pServerAddress = new BLEAddress(advertisedDevice.getAddress());
doConnect = true;
} // Found our server
} // onResult
}; // MyAdvertisedDeviceCallbacks
void setup() {
Serial.begin(115200);
Serial.println("Starting Arduino BLE Client application...");
BLEDevice::init("");
BLEScan* pBLEScan = BLEDevice::getScan();
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true);
pBLEScan->start(30);
} // End of setup.
// This is the Arduino main loop function.
void loop() {
if (doConnect == true) {
if (connectToServer(*pServerAddress)) {
Serial.println("We are now connected to the BLE Server.");
connected = true;
} else {
Serial.println("We have failed to connect to the server; there is nothin more we will do.");
}
//doConnect = false;
}
if (connected == false){
BLEDevice::getScan()->start(0);
}
else{
doConnect = false;
}
delay(1000); // Delay a second between loops.
} // End of loop
最佳答案
请在下面查看您的问题的答案:-
如果我想对服务器实现深度 sleep 功能,客户端会发生什么情况?客户端是否也必须在某个时候重置?
不,客户端不必重置,但您可能必须重新连接到服务器,因为在深度 sleep 中 BLE 连接丢失。如果您希望服务器一唤醒就自动建立连接,那么您必须更新客户端代码,以便它不断尝试重新连接到服务器。这样,一旦服务器唤醒,客户端就会连接到它并继续接收通知。
另外,是否建议在深度 sleep 场景中使用 Characteristic.Notify?
在深度 sleep 中,CPU 将关闭,因此您将无法在此状态下发送通知。在此模式下,您将只能通过定时器或外部外围设备(例如触摸引脚)唤醒 CPU。请参阅下面的链接以获取更多信息:-
希望对您有所帮助。
关于arduino - ESP32 Arduino BLE 深度 sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61811536/
我尝试使用键盘和 TVout 库制作一个简单的 arduino 计算机。 由于库不兼容,我想使用 arduino mega 作为主板,使用 arduino uno 作为图形芯片。 但它总是在电视上只显
我正在尝试学习如何评估一个值是增加还是减少。在这种情况下,我使用从 0 - 14 映射的电位计。基本上我需要它来查看当前值,如果当前值增加,则打印一件事,如果该值减小,则打印其他内容。 到目前为止,这
我曾尝试使用 Arduino IDE 中提供的标准草图测量模拟引脚值。然而,即使没有连接到引脚,它也会打印出随机值。有什么需要注意的吗? 我有一个从 5V+ 连接到模拟引脚 0 的 FSR 传感器 最
我正在尝试在字符串旁边打印一个整数,但它并没有真正起作用并且我感到困惑。 int cmdSeries = 3; Serial.println("Series : " + cmdSeries);// T
我有一个使用不同电源供电的设备,我正在尝试与其串行通信,它有 TX 和 RX 线、GND 和 2.7+ 线,它非常笨拙,所以它有自己的 PS。 目前我得到了一些奇怪的结果,所以想知道是否需要在 Ard
使用Arduino Blackwidow或Yellowjacket有运气吗?在评论方面,我找不到关于它们的在线信息。 我想连接到无线路由器,发送与已读取的电阻有关的小型POST请求,并以JSON格式接
我的 Arduino Uno 已全部设置完毕并且运行良好。 项目:Arduino 根据给定的命令控制 9v 电机。由于 Arduino 仅提供 5v,我通过晶体管为其添加了 9v 电池 我决定将新代码
我最近买了一个Arduino Uno ,现在我正在尝试一下。我有几个 18B20 传感器和一个连接到它的 ENC28J60 网络模块,然后我正在制作一个草图,以便我可以从浏览器连接到它,并以简单的网页
我有一个使用不同电源供电的设备,我正在尝试与其串行通信,它有 TX 和 RX 线、GND 和 2.7+ 线,它非常笨拙,所以它有自己的 PS。 目前我得到了一些奇怪的结果,所以想知道是否需要在 Ard
已结束。 这个问题是 off-topic .它目前不接受答案。 想要改进这个问题? Update the question所以它是on-topic堆栈溢出。 关闭 9 年前。 Improve this
我有一个 Arduino 入门套件,它带有主动和被动蜂鸣器。不幸的是,我似乎不知道哪个是哪个。我只知道一个比另一个长一点,我可以看到下面的绿色电路板。 最佳答案 有源蜂鸣器会自行发出声音。你基本上只是
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
我想从 Arduino 中的几个传感器获取一些数据,然后创建一些端点,以便我可以从 Web 应用程序中的传感器获取数据。那可能吗? 最佳答案 您可以使用 Firebase 或 Thingspeak 服
我正在创建一个新库来一起控制键盘和 LCD。大多数代码似乎都可以编译,但是当它到达我定义 LiquidCristal 变量的行时,它说: 'LiquidCrystal' does not name a
我从最近刚开始使用arduino的我的一个学生那里得到了一些代码。 他试图做一个中断,并且有点奏效。问题是它运行了两次(他调用了该函数),所以 bool 值被重置了。 我试图找到答案,但找不到任何答案
我最近开始了 Arduino 开发,在向 friend 和同事解释时,我收到的一个问题我没有答案,也想知道为什么微 Controller 运行的程序称为草图?这是从电气工程继承下来的惯例吗?我不熟悉这
如何在编译时确定 Arduino 的板类型(例如 Uno vs Nano)? 不要与确定处理器类型混淆。正如我所看到的那样,例如#如果定义(__AVR_ATmega32U4__)... 同样,我想要一
我已经看了很多,但还没有找到涵盖所有这些的好教程。因此,我需要将项目分成多个选项卡/ino 文件,只是为了使其更清晰。 所以当你打开一个新标签后,我想问几个问题: 如果主项目文件(例如 main)还有
您好,我正在使用 https://github.com/pubnub/arduino 中的 PubNubsubscriber 示例我能够接收消息,只要我收到消息,一切都运行正常,如果一段时间过去了,比
所以我的 arduino 正在从串行接收一个字符串,由三个用逗号分隔的值组成,我试图将这些值分成三个不同的变量,其余的我可以做。 字符串看起来像这样“1000,1.5,0.9”或“5000,20,0.
我是一名优秀的程序员,十分优秀!