-
-
Save n0bisuke/98e386a316ea33fd47c873e768ed0391 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <BLEServer.h> | |
#include <BLEDevice.h> | |
#include <BLEUtils.h> | |
#include <BLE2902.h> | |
// Device Name: Maximum 30 bytes | |
#define DEVICE_NAME "LINE Things Trial ESP32" | |
// User service UUID: Change this to your generated service UUID | |
#define USER_SERVICE_UUID "自分のトライアルプロダクトのサービスUUID" | |
// User service characteristics | |
#define WRITE_CHARACTERISTIC_UUID "E9062E71-9E62-4BC6-B0D3-35CDCD9B027B" | |
#define NOTIFY_CHARACTERISTIC_UUID "62fbd229-6edd-4d1a-b554-5c4e1bb29169" | |
// PSDI Service UUID: Fixed value for Developer Trial | |
#define PSDI_SERVICE_UUID "E625601E-9E55-4597-A598-76018A0D293D" | |
#define PSDI_CHARACTERISTIC_UUID "26E2B12B-85F0-4F3F-9FDD-91D114270E6E" | |
#define BUTTON 0 | |
#define LED1 2 | |
BLEServer* thingsServer; | |
BLESecurity *thingsSecurity; | |
BLEService* userService; | |
BLEService* psdiService; | |
BLECharacteristic* psdiCharacteristic; | |
BLECharacteristic* writeCharacteristic; | |
BLECharacteristic* notifyCharacteristic; | |
bool deviceConnected = false; | |
bool oldDeviceConnected = false; | |
volatile int btnAction = 0; | |
volatile int btnCount = 0; | |
class serverCallbacks: public BLEServerCallbacks { | |
void onConnect(BLEServer* pServer) { | |
deviceConnected = true; | |
}; | |
void onDisconnect(BLEServer* pServer) { | |
deviceConnected = false; | |
} | |
}; | |
class writeCallback: public BLECharacteristicCallbacks { | |
void onWrite(BLECharacteristic *bleWriteCharacteristic) { | |
std::string value = bleWriteCharacteristic->getValue(); | |
if ((char)value[0] <= 1) { | |
digitalWrite(LED1, (char)value[0]); | |
} | |
} | |
}; | |
void setup() { | |
Serial.begin(115200); | |
pinMode(LED1, OUTPUT); | |
digitalWrite(LED1, 0); | |
pinMode(BUTTON, INPUT_PULLUP); | |
attachInterrupt(BUTTON, buttonAction, CHANGE); | |
BLEDevice::init(""); | |
BLEDevice::setEncryptionLevel(ESP_BLE_SEC_ENCRYPT_NO_MITM); | |
// Security Settings | |
BLESecurity *thingsSecurity = new BLESecurity(); | |
thingsSecurity->setAuthenticationMode(ESP_LE_AUTH_REQ_SC_ONLY); | |
thingsSecurity->setCapability(ESP_IO_CAP_NONE); | |
thingsSecurity->setInitEncryptionKey(ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK); | |
setupServices(); | |
startAdvertising(); | |
Serial.println("Ready to Connect"); | |
} | |
void loop() { | |
uint8_t btnValue; | |
//Serial.println(digitalRead(BUTTON)); | |
btnValue = digitalRead(BUTTON); //↑でINPUT_PULLUPしているのでデフォが1、ボタン押すと0になる | |
if(btnValue == 0 && deviceConnected) { | |
delay(200); | |
btnValue = 1; //フラグをすぐに戻すことで連続でボタン押されるのを防ぐ | |
Serial.println(btnCount); | |
btnAction = 0; | |
btnCount++; //合計カウントアップ | |
const char *newValue=((String)btnCount).c_str(); | |
notifyCharacteristic->setValue(newValue); | |
notifyCharacteristic->notify(); | |
delay(20); | |
} | |
// Disconnection | |
if (!deviceConnected && oldDeviceConnected) { | |
delay(500); // Wait for BLE Stack to be ready | |
thingsServer->startAdvertising(); // Restart advertising | |
oldDeviceConnected = deviceConnected; | |
} | |
// Connection | |
if (deviceConnected && !oldDeviceConnected) { | |
oldDeviceConnected = deviceConnected; | |
} | |
} | |
void setupServices(void) { | |
// Create BLE Server | |
thingsServer = BLEDevice::createServer(); | |
thingsServer->setCallbacks(new serverCallbacks()); | |
// Setup User Service | |
userService = thingsServer->createService(USER_SERVICE_UUID); | |
// Create Characteristics for User Service | |
writeCharacteristic = userService->createCharacteristic(WRITE_CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_WRITE); | |
writeCharacteristic->setAccessPermissions(ESP_GATT_PERM_READ_ENCRYPTED | ESP_GATT_PERM_WRITE_ENCRYPTED); | |
writeCharacteristic->setCallbacks(new writeCallback()); | |
notifyCharacteristic = userService->createCharacteristic(NOTIFY_CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_NOTIFY); | |
notifyCharacteristic->setAccessPermissions(ESP_GATT_PERM_READ_ENCRYPTED | ESP_GATT_PERM_WRITE_ENCRYPTED); | |
BLE2902* ble9202 = new BLE2902(); | |
ble9202->setNotifications(true); | |
ble9202->setAccessPermissions(ESP_GATT_PERM_READ_ENCRYPTED | ESP_GATT_PERM_WRITE_ENCRYPTED); | |
notifyCharacteristic->addDescriptor(ble9202); | |
// Setup PSDI Service | |
psdiService = thingsServer->createService(PSDI_SERVICE_UUID); | |
psdiCharacteristic = psdiService->createCharacteristic(PSDI_CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ); | |
psdiCharacteristic->setAccessPermissions(ESP_GATT_PERM_READ_ENCRYPTED | ESP_GATT_PERM_WRITE_ENCRYPTED); | |
// Set PSDI (Product Specific Device ID) value | |
uint64_t macAddress = ESP.getEfuseMac(); | |
psdiCharacteristic->setValue((uint8_t*) &macAddress, sizeof(macAddress)); | |
// Start BLE Services | |
userService->start(); | |
psdiService->start(); | |
} | |
void startAdvertising(void) { | |
// Start Advertising | |
BLEAdvertisementData scanResponseData = BLEAdvertisementData(); | |
scanResponseData.setFlags(0x06); // GENERAL_DISC_MODE 0x02 | BR_EDR_NOT_SUPPORTED 0x04 | |
scanResponseData.setName(DEVICE_NAME); | |
thingsServer->getAdvertising()->addServiceUUID(userService->getUUID()); | |
thingsServer->getAdvertising()->setScanResponseData(scanResponseData); | |
thingsServer->getAdvertising()->start(); | |
} | |
void buttonAction() { | |
btnAction++; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment