diff --git a/example/T-keyboard client/include/TKeyboardClient.h b/example/T-keyboard client/include/TKeyboardClient.h new file mode 100644 index 0000000..da40070 --- /dev/null +++ b/example/T-keyboard client/include/TKeyboardClient.h @@ -0,0 +1,205 @@ + +const char keys[] = { + 0x0, 0x0, 0x0, 0x0, + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', + 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', + 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + '\n', 0x0, 0x0, // DEL + 0x0, // TAB + ' ', // SPACE + '-', '=', '[', ']', '\\', 0x0, ';', '\'', '`', ',', '.', '/', + 0x0, // CAPS LOCK + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, // R_ARROW + 0x0, // L_ARROW + 0x0, // D_ARROW + 0x0, // U_ARROW + 0x0, // NUM LOCK +}; + +const char shift_keys[] = { + 0x0, 0x0, 0x0, 0x0, + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', + 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', + 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', + '\n', 0x0, 0x0, // DEL + 0x0, // TAB + ' ', // SPACE + '_', '+', '{', '}', '|', 0x0, ':', '"', '~', '<', '>', '?', + 0x0, // CAPS LOCK + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, // R_ARROW + 0x0, // L_ARROW + 0x0, // D_ARROW + 0x0, // U_ARROW + 0x0, // NUM LOCK +}; + + +/** + * A BLE client example that is rich in capabilities. + * There is a lot new capabilities implemented. + * author unknown + * updated by chegewara + */ + +#include +#include "BLEDevice.h" + +// The remote service we wish to connect to. +static BLEUUID serviceUUID((uint16_t) 0x1812); +// The characteristic of the remote service we are interested in. +static BLEUUID charUUID((uint16_t) 0x2a4d); + +static bool doConnect = false; +static bool connected = false; +static bool doScan = false; +static BLERemoteCharacteristic* pRemoteCharacteristic; +static BLEAdvertisedDevice* myDevice; + +static void notifyCallback( + BLERemoteCharacteristic* pBLERemoteCharacteristic, + uint8_t* pData, + size_t length, + bool isNotify) { +#ifdef DEBUG + Serial.print("Notify callback for characteristic "); + Serial.print(pBLERemoteCharacteristic->getUUID().toString().c_str()); + Serial.print(" of data length "); + Serial.println(length); + Serial.print("data: "); + for (size_t i = 0; i < length; i++) + { + Serial.printf("%2x", pData[i]); + } + Serial.println(""); +#endif + if(pData[0] == 0x0 && pData[2] != 0x0) { + Serial.printf("%c", keys[pData[2]]); + } else if(pData[0] == 0x02 && pData[2] != 0x0) { + Serial.printf("%c", shift_keys[pData[2]]); + } +} + +class MyClientCallback : public BLEClientCallbacks { + void onConnect(BLEClient* pclient) { + connected = true; + } + + void onDisconnect(BLEClient* pclient) { + connected = false; + Serial.println("onDisconnect"); + } +}; + +bool connectToServer() { + Serial.print("Forming a connection to "); + Serial.println(myDevice->getAddress().toString().c_str()); + + BLEClient* pClient = BLEDevice::createClient(); + Serial.println(" - Created client"); + + pClient->setClientCallbacks(new MyClientCallback()); + + // Connect to the remove BLE Server. + if(!pClient->connect(myDevice)) { // if you pass BLEAdvertisedDevice instead of address, it will be recognized type of peer device address (public or private) + return false; + } + Serial.println(" - Connected to server"); + + // Obtain a reference to the service we are after in the remote BLE server. + BLERemoteService* pRemoteService = pClient->getService(serviceUUID); + if (pRemoteService == nullptr) { + Serial.print("Failed to find our service UUID: "); + Serial.println(serviceUUID.toString().c_str()); + pClient->disconnect(); + return false; + } + Serial.println(" - Found our service"); + + // Obtain a reference to the characteristic in the service of the remote BLE server. + do { + pRemoteCharacteristic = pRemoteService->getCharacteristic(charUUID); + if (pRemoteCharacteristic == nullptr) { + Serial.print("Failed to find our characteristic UUID: "); + Serial.println(charUUID.toString().c_str()); + pClient->disconnect(); + return false; + } + + if(pRemoteCharacteristic->canNotify()) + break; + } while(1); + Serial.println(" - Found our characteristic"); + + pRemoteCharacteristic->registerForNotify(notifyCallback); + + return true; +} +/** + * Scan for BLE servers and find the first one that advertises the service we are looking for. + */ +class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { + /** + * Called for each advertising BLE server. + */ +public: + void onResult(BLEAdvertisedDevice advertisedDevice) { + Serial.print("BLE Advertised Device found: "); + Serial.println(advertisedDevice.toString().c_str()); + + // We have found a device, let us now see if it contains the service we are looking for. + if (strstr(advertisedDevice.getName().c_str(), "T-Keyboard") != NULL) { + + BLEDevice::getScan()->stop(); + myDevice = new BLEAdvertisedDevice(advertisedDevice); + doConnect = true; + doScan = true; + + } // Found our server + } // onResult +}; // MyAdvertisedDeviceCallbacks + + +// void Start() { +// Serial.println("Starting Arduino BLE Client application..."); + +// // Retrieve a Scanner and set the callback we want to use to be informed when we +// // have detected a new device. Specify that we want active scanning and start the +// // scan to run for 5 seconds. +// BLEScan* pBLEScan = BLEDevice::getScan(); +// pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); +// pBLEScan->setInterval(1349); +// pBLEScan->setWindow(449); +// pBLEScan->setActiveScan(true); +// pBLEScan->start(5, false); +// } // End of setup. + + +// // This is the Arduino main loop function. +// void loop() { + +// // If the flag "doConnect" is true then we have scanned for and found the desired +// // BLE Server with which we wish to connect. Now we connect to it. Once we are +// // connected we set the connected flag to be true. +// if (doConnect == true) { +// if (connectToServer()) { +// Serial.println("We are now connected to the BLE Server."); +// } else { +// Serial.println("We have failed to connect to the server; there is nothin more we will do."); +// } +// doConnect = false; +// } + +// // If we are connected to a peer BLE Server, update the characteristic each time we are reached +// // with the current time since boot. +// if (connected) { +// // do nothing, all data is handled in notifications callback +// }else if(doScan){ +// BLEDevice::getScan()->start(0); // this is just eample to start scan after disconnect, most likely there is better way to do it in arduino +// } + +// delay(1000); // Delay a second between loops. +// } // End of loop \ No newline at end of file diff --git a/example/T-keyboard client/read.md b/example/T-keyboard client/read.md new file mode 100644 index 0000000..648d38a --- /dev/null +++ b/example/T-keyboard client/read.md @@ -0,0 +1,5 @@ +This is code for connecting to the T-keyboard through an esp32. +All you need to do is put the include in your librries folder and use the main.cpp as your project code. +It finds a ble device with the name of the T-keybaord connects to it and reads his input to the notify function in the TKeyboardClient.h. +you should modify that function for your needs. +creadit for [allthemod](https://github.com/allthemod) and for [chegewara](https://github.com/chegewara) \ No newline at end of file diff --git a/example/T-keyboard client/src/main.cpp b/example/T-keyboard client/src/main.cpp new file mode 100644 index 0000000..10b4fde --- /dev/null +++ b/example/T-keyboard client/src/main.cpp @@ -0,0 +1,35 @@ +#include +#include +#include +#include +#include "TKeyboardClient.h" + + +BLEClient* pClient = nullptr; + +void setup() { + Serial.begin(115200); + Serial.println("Starting..."); + MyAdvertisedDeviceCallbacks callbackDev = MyAdvertisedDeviceCallbacks(); + BLEDevice::init("T-Keyboard client"); + BLEScan* pBLEScan = BLEDevice::getScan(); + pBLEScan->setInterval(1349); + pBLEScan->setWindow(449); + pBLEScan->setActiveScan(true); + BLEScanResults res =pBLEScan->start(5, false); + int count = res.getCount(); + Serial.printf("count %1d \n", count); + for(int i=0; i < count; i++){ + Serial.print(i); + Serial.println(" checking..."); + callbackDev.onResult(res.getDevice(i)); + } + if(connectToServer()){ + Serial.println("We are now connected to the BLE Server."); + } + delay(5000); +} + +void loop() { + +}