WS_Bluetooth.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #include "BLEUUID.h"
  2. #include "BLEAdvertising.h"
  3. #include "WS_Bluetooth.h"
  4. #include <ArduinoJson.h>
  5. BLEServer* pServer;
  6. BLEService* pConfigService;
  7. BLECharacteristic* pConfigCharacteristic;
  8. BLEService* pControlService;
  9. BLECharacteristic* pControlCharacteristic;
  10. bool requiresrestart = false;
  11. bool isBluetoothConnected = false;
  12. /********************************************************** Bluetooth *********************************************************/
  13. class ServerCallbacks : public BLEServerCallbacks {
  14. void onConnect(BLEServer* pServer) {
  15. BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  16. pAdvertising->stop();
  17. isBluetoothConnected = true;
  18. }
  19. void onDisconnect(BLEServer* pServer) {
  20. isBluetoothConnected = false;
  21. BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  22. // String devicename = GetDeviceName().substring(0,30);
  23. // BLEAdvertisementData data;
  24. // data.setName(devicename);
  25. // pAdvertising->addServiceUUID(CONFIG_SERVICE_UUID);
  26. // if (pControlService)
  27. // pAdvertising->addServiceUUID(pControlService->getUUID());
  28. // pAdvertising->setScanResponse(true);
  29. // pAdvertising->setMinPreferred(0x06);
  30. // pAdvertising->setMinPreferred(0x12);
  31. BLEDevice::startAdvertising();
  32. pConfigCharacteristic->notify();
  33. if (pControlService)
  34. pControlCharacteristic->notify();
  35. pAdvertising->start();
  36. if (requiresrestart)
  37. Restart();
  38. }
  39. };
  40. class ConfigCharacteristicCallback : public BLECharacteristicCallbacks
  41. {
  42. // char json[] = "{ \"warning\" : "", \"contact\" : "" }"
  43. void onRead(BLECharacteristic* pCharacteristic, esp_ble_gatts_cb_param_t* param)
  44. {
  45. Serial.println("into writeConfig");
  46. JsonDocument doc;
  47. doc["warning"] = GetWarningNotice();
  48. doc["contact"] = GetContactInfo();
  49. String json = "";
  50. serializeJson(doc,json);
  51. Serial.println("serialised");
  52. Serial.println(json);
  53. pCharacteristic->setValue(json);
  54. Serial.println("done");
  55. }
  56. // char json[] = "{ \"name\" : "PRS Digital Key", \"warning\" : "", \"contact\" : "" \"id\" : "00000000-0000-0000-0000-000000000000" }"
  57. void onWrite(BLECharacteristic* pCharacteristic)
  58. {
  59. String json = pCharacteristic->getValue();
  60. Serial.println(json);
  61. JsonDocument doc;
  62. deserializeJson(doc, json);
  63. String name = doc["name"];
  64. String warning = doc["warning"];
  65. String contact = doc["contact"];
  66. String equipmentid = doc["id"];
  67. Configure(name,warning,contact,equipmentid);
  68. pCharacteristic->setValue("");
  69. requiresrestart = true;
  70. }
  71. };
  72. // char json[] = "{ \"Relay00\" : 15000, \"Relay01\" : 0, \"Relay02\" : 0, \"Relay03\" : 0, \"Relay04\" : 0, \"Relay05\" : 0 }"
  73. class ControlCharacteristicCallback : public BLECharacteristicCallbacks
  74. {
  75. // char json[] = "{\"Relay01\"="15000"
  76. void onWrite(BLECharacteristic* pCharacteristic)
  77. {
  78. String json = pCharacteristic->getValue();
  79. JsonDocument doc;
  80. deserializeJson(doc, json);
  81. char name[10];
  82. for (int i=0; i<6; i++)
  83. {
  84. sprintf(name,"Relay%02D",i);
  85. long time = doc[name];
  86. SetRelay(i,time);
  87. }
  88. pCharacteristic->setValue("");
  89. }
  90. // char json[] = "{ \"Relay00\" : true, \"Relay01\" : false, \"Relay02\" : false, \"Relay03\" : false, \"Relay04\" : false, \"Relay05\" : false }"
  91. void onRead(BLECharacteristic* pCharacteristic, esp_ble_gatts_cb_param_t* param)
  92. {
  93. JsonDocument doc;
  94. char name[10];
  95. for (int i=0; i<6; i++)
  96. {
  97. sprintf(name,"Relay%02d",i);
  98. doc[name] = GetRelay(i);
  99. }
  100. String json;
  101. serializeJson(doc,json);
  102. pCharacteristic->setValue(json);
  103. }
  104. };
  105. bool IsConnected()
  106. {
  107. return isBluetoothConnected;
  108. }
  109. void Bluetooth_Init()
  110. {
  111. /*************************************************************************
  112. Bluetooth
  113. *************************************************************************/
  114. String devicename = GetDeviceName().substring(0,30);
  115. // Initialise the Device
  116. BLEDevice::init(devicename);
  117. pServer = BLEDevice::createServer();
  118. pServer->setCallbacks(new ServerCallbacks());
  119. BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  120. // Set up the Configuration interface (always)
  121. pConfigService = pServer->createService(CONFIG_SERVICE_UUID);
  122. pConfigCharacteristic = pConfigService->createCharacteristic(CONFIG_CHARACTERISTIC_UUID,
  123. BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE);
  124. pConfigCharacteristic->setCallbacks(new ConfigCharacteristicCallback());
  125. pConfigService->start();
  126. pAdvertising->addServiceUUID(CONFIG_SERVICE_UUID);
  127. String equipmentid = GetEquipmentId();
  128. if (!equipmentid.isEmpty() && !equipmentid.equalsIgnoreCase("00000000-0000-0000-0000-000000000000"))
  129. {
  130. BLEService* pControlService = pServer->createService(equipmentid);
  131. pControlCharacteristic = pControlService->createCharacteristic(CONTROL_CHARACTERISTIC_UUID,
  132. BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE);
  133. pControlCharacteristic->setCallbacks(new ControlCharacteristicCallback());
  134. pControlService->start();
  135. pAdvertising->addServiceUUID(equipmentid);
  136. }
  137. pAdvertising->setScanResponse(true);
  138. pAdvertising->setMinPreferred(0x06);
  139. pAdvertising->setMinPreferred(0x12);
  140. BLEDevice::startAdvertising();
  141. pConfigCharacteristic->notify();
  142. if (pControlCharacteristic)
  143. pControlCharacteristic->notify();
  144. pAdvertising->start();
  145. }