esp32 client for T-keyboard
This commit is contained in:
parent
6367192e4d
commit
1192cbadf8
|
|
@ -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 <Arduino.h>
|
||||
#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
|
||||
|
|
@ -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)
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
#include <BLEDevice.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <Arduino.h>
|
||||
#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() {
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue