HID scanner demo
Dependencies: BLE_API WIFI_API_32kRAM nRF51822 mbed
BLE HID function in this demo is temporary working with Android phone ONLY. Will be fixed to support iOS device in next update.
Diff: main.cpp
- Revision:
- 1:51535675abf4
- Parent:
- 0:b0fc0661c081
- Child:
- 2:be04a220392e
--- a/main.cpp Thu Jul 02 01:35:08 2015 +0000
+++ b/main.cpp Thu Jul 16 01:18:16 2015 +0000
@@ -3,13 +3,28 @@
#include "BatteryService.h"
#include "DeviceInformationService.h"
#include "HIDService.h"
+#include "WIFIDevice.h"
+#include "EthernetInterface.h"
BLEDevice ble;
-DigitalOut led01(LED1);
+DigitalOut led01(p7);
Serial uart(p25,p23);
+DigitalOut RFSWIO(p19);
+Ticker flipper;
+WIFIDevice wifi;
+EthernetInterface eth;
+
+void flip() {
+ RFSWIO = !RFSWIO;
+}
unsigned char keyData;
bool is_input = false;
+char ap_ssid[10] = {'H','T','C','8','2','0','\0'};
+char ap_pw[10] = {'1','1','1','1','1','1','1','1','\0'};
+const char* PC_SERVER_ADDRESS = "192.168.1.234";
+uint16_t PC_PORT = 5222;
+
static const char DEVICE_NAME[] = "HID_Keyboard";
static const uint16_t uuid16_list[] = {GattService::UUID_HUMAN_INTERFACE_DEVICE_SERVICE};
static volatile bool triggerSensorPolling = false;
@@ -19,19 +34,51 @@
ble.startAdvertising(); // restart advertising
}
+void passkeyDisplayCallback(Gap::Handle_t handle, const SecurityManager::Passkey_t passkey)
+{
+ printf("Input passKey: ");
+ for (unsigned i = 0; i < Gap::ADDR_LEN; i++) {
+ printf("%c ", passkey[i]);
+ }
+ printf("\r\n");
+}
+
+void securitySetupCompletedCallback(Gap::Handle_t handle, SecurityManager::SecurityCompletionStatus_t status)
+{
+ if (status == SecurityManager::SEC_STATUS_SUCCESS) {
+ printf("Security success\r\n", status);
+ } else {
+ printf("Security failed\r\n", status);
+ }
+}
-static uint8_t key_press_scan_buff[30];
-static uint8_t modifyKey[30];
+
+static uint8_t key_press_scan_buff[50];
+static uint8_t modifyKey[50];
+char msg[25] = "NNN40 CONNECTED\n";
int main(void)
-{ uart.baud(9600);
+{ NRF_CLOCK->XTALFREQ = 0x00; //Tsungta, Used to active radio correctly external when XTAL 32MHz is loaded
+ uart.baud(115200);
uart.printf("Starting HID Service\n");
- //uart.attach(&uart_rx);
+ RFSWIO = 1;
+ EthernetInterface eth;
+ eth.init(); //Use DHCP
+ wifi.setNetwork(ap_ssid, ap_pw, 0); // set given SSID and PW as the highest priority
+ eth.connect(40000);
led01 = 1;
+ TCPSocketConnection socket;
+ socket.connect(PC_SERVER_ADDRESS,PC_PORT);
+ socket.send(msg, sizeof(msg));
+ memset(msg, 0, 25);
+ /*======BLE setup========*/
ble.init();
- bool enableBonding = false;
- bool requireMITM = false;
- ble.initializeSecurity(enableBonding, requireMITM);
+ bool enableBonding = true;
+ bool requireMITM = true;
+ //const uint8_t passkeyValue[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
+ ble.initializeSecurity(enableBonding, requireMITM, SecurityManager::IO_CAPS_DISPLAY_ONLY); //IO_CAPS_DISPLAY_ONLY, IO_CAPS_NONE
ble.onDisconnection(disconnectionCallback);
+ ble.securityManager().onPasskeyDisplay(passkeyDisplayCallback);
+ ble.securityManager().onSecuritySetupCompleted(securitySetupCompletedCallback);
/* Setup primary service. */
HIDService hidService(ble);
@@ -44,46 +91,65 @@
ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
ble.setAdvertisingInterval(1000);
+
+ RFSWIO = 1;
ble.startAdvertising();
uart.printf("Starting advertising\n");
- int index = 0;
+ wait(5);
+ flipper.attach(&flip, 0.15);
+ int index_b = 0;
+ int index_w = 0;
+
while (1) {
if (uart.readable() == 1) {
keyData = uart.getc();
uart.putc(keyData);
+ msg[index_w++] = keyData;
if(keyData <= 0x39 && keyData >= 0x30){ //number
if(keyData == 0x30){
- modifyKey[index] = 0x00;
- key_press_scan_buff[index] = 0x27;
+ modifyKey[index_b] = 0x00;
+ key_press_scan_buff[index_b] = 0x27;
+ index_b++;
+ key_press_scan_buff[index_b] = 0x73;
} else {
- modifyKey[index] = 0x00;
- key_press_scan_buff[index] = keyData-0x13;
+ modifyKey[index_b] = 0x00;
+ key_press_scan_buff[index_b] = keyData-0x13;
+ index_b++;
+ key_press_scan_buff[index_b] = 0x73;
}
} else if(keyData <= 0x7a && keyData >= 0x61 ){ //lowercase letters
- modifyKey[index] = 0x00;
- key_press_scan_buff[index] = keyData-0x5d;
+ modifyKey[index_b] = 0x00;
+ key_press_scan_buff[index_b] = keyData-0x5d;
+ index_b++;
+ key_press_scan_buff[index_b] = 0x73;
} else if(keyData <= 0x5a && keyData >= 0x41){ //uppercase letters
- modifyKey[index] = 0x02;
- key_press_scan_buff[index] = keyData-0x3d;
- } else if (keyData == 0x20) {
- modifyKey[index] = 0x00;
- key_press_scan_buff[index] = 0x2c;
+ modifyKey[index_b] = 0x02;
+ key_press_scan_buff[index_b] = keyData-0x3d;
+ index_b++;
+ key_press_scan_buff[index_b] = 0x73;
+ } else if (keyData == 0x20) { //space
+ modifyKey[index_b] = 0x00;
+ key_press_scan_buff[index_b] = 0x2c;
+ index_b++;
+ key_press_scan_buff[index_b] = 0x73;
} else {
- modifyKey[index] = 0x00;
- //key_press_scan_buff[index] = 0x28;
- //key_press_scan_buff[index++] = 0x73;
- key_press_scan_buff[index] = 0x73;
+ modifyKey[index_b] = 0x00;
+ //key_press_scan_buff[index_b] = 0x73; //this is dummy data.
+ //msg[index_w+1] = '\0';
}
- index++;
+ index_b++;
if(keyData == 0x0a && ble.getGapState().connected){
- for(int i = 0; i < index; i++){
- //uart.putc(key_press_scan_buff[i]);
- hidService.updateReport(modifyKey[i], key_press_scan_buff[i]);
- wait(0.1);
+ for(int i = 0; i < index_b ; i++){
+ hidService.updateReport(modifyKey[i], key_press_scan_buff[i]);
+ wait(0.03);
}
- index = 0;
- memset(modifyKey, 0, 30);
- memset(key_press_scan_buff, 0, 30);
+
+ socket.send(msg, sizeof(msg));
+ index_b = 0;
+ index_w = 0;
+ memset(modifyKey, 0, 50);
+ memset(msg, 0, 25);
+ memset(key_press_scan_buff, 0, 50);
}
}