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.

Committer:
Marcomissyou
Date:
Thu Jul 16 01:18:16 2015 +0000
Revision:
1:51535675abf4
Parent:
0:b0fc0661c081
Child:
2:be04a220392e
Add WIFI function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Marcomissyou 0:b0fc0661c081 1 #include "mbed.h"
Marcomissyou 0:b0fc0661c081 2 #include "BLE.h"
Marcomissyou 0:b0fc0661c081 3 #include "BatteryService.h"
Marcomissyou 0:b0fc0661c081 4 #include "DeviceInformationService.h"
Marcomissyou 0:b0fc0661c081 5 #include "HIDService.h"
Marcomissyou 1:51535675abf4 6 #include "WIFIDevice.h"
Marcomissyou 1:51535675abf4 7 #include "EthernetInterface.h"
Marcomissyou 0:b0fc0661c081 8
Marcomissyou 0:b0fc0661c081 9 BLEDevice ble;
Marcomissyou 1:51535675abf4 10 DigitalOut led01(p7);
Marcomissyou 0:b0fc0661c081 11 Serial uart(p25,p23);
Marcomissyou 1:51535675abf4 12 DigitalOut RFSWIO(p19);
Marcomissyou 1:51535675abf4 13 Ticker flipper;
Marcomissyou 1:51535675abf4 14 WIFIDevice wifi;
Marcomissyou 1:51535675abf4 15 EthernetInterface eth;
Marcomissyou 1:51535675abf4 16
Marcomissyou 1:51535675abf4 17 void flip() {
Marcomissyou 1:51535675abf4 18 RFSWIO = !RFSWIO;
Marcomissyou 1:51535675abf4 19 }
Marcomissyou 0:b0fc0661c081 20
Marcomissyou 0:b0fc0661c081 21 unsigned char keyData;
Marcomissyou 0:b0fc0661c081 22 bool is_input = false;
Marcomissyou 1:51535675abf4 23 char ap_ssid[10] = {'H','T','C','8','2','0','\0'};
Marcomissyou 1:51535675abf4 24 char ap_pw[10] = {'1','1','1','1','1','1','1','1','\0'};
Marcomissyou 1:51535675abf4 25 const char* PC_SERVER_ADDRESS = "192.168.1.234";
Marcomissyou 1:51535675abf4 26 uint16_t PC_PORT = 5222;
Marcomissyou 1:51535675abf4 27
Marcomissyou 0:b0fc0661c081 28 static const char DEVICE_NAME[] = "HID_Keyboard";
Marcomissyou 0:b0fc0661c081 29 static const uint16_t uuid16_list[] = {GattService::UUID_HUMAN_INTERFACE_DEVICE_SERVICE};
Marcomissyou 0:b0fc0661c081 30 static volatile bool triggerSensorPolling = false;
Marcomissyou 0:b0fc0661c081 31
Marcomissyou 0:b0fc0661c081 32 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
Marcomissyou 0:b0fc0661c081 33 {
Marcomissyou 0:b0fc0661c081 34 ble.startAdvertising(); // restart advertising
Marcomissyou 0:b0fc0661c081 35 }
Marcomissyou 0:b0fc0661c081 36
Marcomissyou 1:51535675abf4 37 void passkeyDisplayCallback(Gap::Handle_t handle, const SecurityManager::Passkey_t passkey)
Marcomissyou 1:51535675abf4 38 {
Marcomissyou 1:51535675abf4 39 printf("Input passKey: ");
Marcomissyou 1:51535675abf4 40 for (unsigned i = 0; i < Gap::ADDR_LEN; i++) {
Marcomissyou 1:51535675abf4 41 printf("%c ", passkey[i]);
Marcomissyou 1:51535675abf4 42 }
Marcomissyou 1:51535675abf4 43 printf("\r\n");
Marcomissyou 1:51535675abf4 44 }
Marcomissyou 1:51535675abf4 45
Marcomissyou 1:51535675abf4 46 void securitySetupCompletedCallback(Gap::Handle_t handle, SecurityManager::SecurityCompletionStatus_t status)
Marcomissyou 1:51535675abf4 47 {
Marcomissyou 1:51535675abf4 48 if (status == SecurityManager::SEC_STATUS_SUCCESS) {
Marcomissyou 1:51535675abf4 49 printf("Security success\r\n", status);
Marcomissyou 1:51535675abf4 50 } else {
Marcomissyou 1:51535675abf4 51 printf("Security failed\r\n", status);
Marcomissyou 1:51535675abf4 52 }
Marcomissyou 1:51535675abf4 53 }
Marcomissyou 0:b0fc0661c081 54
Marcomissyou 1:51535675abf4 55
Marcomissyou 1:51535675abf4 56 static uint8_t key_press_scan_buff[50];
Marcomissyou 1:51535675abf4 57 static uint8_t modifyKey[50];
Marcomissyou 1:51535675abf4 58 char msg[25] = "NNN40 CONNECTED\n";
Marcomissyou 0:b0fc0661c081 59 int main(void)
Marcomissyou 1:51535675abf4 60 { NRF_CLOCK->XTALFREQ = 0x00; //Tsungta, Used to active radio correctly external when XTAL 32MHz is loaded
Marcomissyou 1:51535675abf4 61 uart.baud(115200);
Marcomissyou 0:b0fc0661c081 62 uart.printf("Starting HID Service\n");
Marcomissyou 1:51535675abf4 63 RFSWIO = 1;
Marcomissyou 1:51535675abf4 64 EthernetInterface eth;
Marcomissyou 1:51535675abf4 65 eth.init(); //Use DHCP
Marcomissyou 1:51535675abf4 66 wifi.setNetwork(ap_ssid, ap_pw, 0); // set given SSID and PW as the highest priority
Marcomissyou 1:51535675abf4 67 eth.connect(40000);
Marcomissyou 0:b0fc0661c081 68 led01 = 1;
Marcomissyou 1:51535675abf4 69 TCPSocketConnection socket;
Marcomissyou 1:51535675abf4 70 socket.connect(PC_SERVER_ADDRESS,PC_PORT);
Marcomissyou 1:51535675abf4 71 socket.send(msg, sizeof(msg));
Marcomissyou 1:51535675abf4 72 memset(msg, 0, 25);
Marcomissyou 1:51535675abf4 73 /*======BLE setup========*/
Marcomissyou 0:b0fc0661c081 74 ble.init();
Marcomissyou 1:51535675abf4 75 bool enableBonding = true;
Marcomissyou 1:51535675abf4 76 bool requireMITM = true;
Marcomissyou 1:51535675abf4 77 //const uint8_t passkeyValue[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
Marcomissyou 1:51535675abf4 78 ble.initializeSecurity(enableBonding, requireMITM, SecurityManager::IO_CAPS_DISPLAY_ONLY); //IO_CAPS_DISPLAY_ONLY, IO_CAPS_NONE
Marcomissyou 0:b0fc0661c081 79 ble.onDisconnection(disconnectionCallback);
Marcomissyou 1:51535675abf4 80 ble.securityManager().onPasskeyDisplay(passkeyDisplayCallback);
Marcomissyou 1:51535675abf4 81 ble.securityManager().onSecuritySetupCompleted(securitySetupCompletedCallback);
Marcomissyou 0:b0fc0661c081 82
Marcomissyou 0:b0fc0661c081 83 /* Setup primary service. */
Marcomissyou 0:b0fc0661c081 84 HIDService hidService(ble);
Marcomissyou 0:b0fc0661c081 85 /* Setup auxiliary service. */
Marcomissyou 0:b0fc0661c081 86 DeviceInformationService deviceInfo(ble, "ARM", "CYNTEC", "SN1", "hw-rev1", "fw-rev1", "soft-rev1");
Marcomissyou 0:b0fc0661c081 87 /* Setup advertising. */
Marcomissyou 0:b0fc0661c081 88 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
Marcomissyou 0:b0fc0661c081 89 ble.accumulateAdvertisingPayload(GapAdvertisingData::KEYBOARD);
Marcomissyou 0:b0fc0661c081 90 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
Marcomissyou 0:b0fc0661c081 91 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
Marcomissyou 0:b0fc0661c081 92 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
Marcomissyou 0:b0fc0661c081 93 ble.setAdvertisingInterval(1000);
Marcomissyou 1:51535675abf4 94
Marcomissyou 1:51535675abf4 95 RFSWIO = 1;
Marcomissyou 0:b0fc0661c081 96 ble.startAdvertising();
Marcomissyou 0:b0fc0661c081 97 uart.printf("Starting advertising\n");
Marcomissyou 1:51535675abf4 98 wait(5);
Marcomissyou 1:51535675abf4 99 flipper.attach(&flip, 0.15);
Marcomissyou 1:51535675abf4 100 int index_b = 0;
Marcomissyou 1:51535675abf4 101 int index_w = 0;
Marcomissyou 1:51535675abf4 102
Marcomissyou 0:b0fc0661c081 103 while (1) {
Marcomissyou 0:b0fc0661c081 104 if (uart.readable() == 1) {
Marcomissyou 0:b0fc0661c081 105 keyData = uart.getc();
Marcomissyou 0:b0fc0661c081 106 uart.putc(keyData);
Marcomissyou 1:51535675abf4 107 msg[index_w++] = keyData;
Marcomissyou 0:b0fc0661c081 108 if(keyData <= 0x39 && keyData >= 0x30){ //number
Marcomissyou 0:b0fc0661c081 109 if(keyData == 0x30){
Marcomissyou 1:51535675abf4 110 modifyKey[index_b] = 0x00;
Marcomissyou 1:51535675abf4 111 key_press_scan_buff[index_b] = 0x27;
Marcomissyou 1:51535675abf4 112 index_b++;
Marcomissyou 1:51535675abf4 113 key_press_scan_buff[index_b] = 0x73;
Marcomissyou 0:b0fc0661c081 114 } else {
Marcomissyou 1:51535675abf4 115 modifyKey[index_b] = 0x00;
Marcomissyou 1:51535675abf4 116 key_press_scan_buff[index_b] = keyData-0x13;
Marcomissyou 1:51535675abf4 117 index_b++;
Marcomissyou 1:51535675abf4 118 key_press_scan_buff[index_b] = 0x73;
Marcomissyou 0:b0fc0661c081 119 }
Marcomissyou 0:b0fc0661c081 120 } else if(keyData <= 0x7a && keyData >= 0x61 ){ //lowercase letters
Marcomissyou 1:51535675abf4 121 modifyKey[index_b] = 0x00;
Marcomissyou 1:51535675abf4 122 key_press_scan_buff[index_b] = keyData-0x5d;
Marcomissyou 1:51535675abf4 123 index_b++;
Marcomissyou 1:51535675abf4 124 key_press_scan_buff[index_b] = 0x73;
Marcomissyou 0:b0fc0661c081 125 } else if(keyData <= 0x5a && keyData >= 0x41){ //uppercase letters
Marcomissyou 1:51535675abf4 126 modifyKey[index_b] = 0x02;
Marcomissyou 1:51535675abf4 127 key_press_scan_buff[index_b] = keyData-0x3d;
Marcomissyou 1:51535675abf4 128 index_b++;
Marcomissyou 1:51535675abf4 129 key_press_scan_buff[index_b] = 0x73;
Marcomissyou 1:51535675abf4 130 } else if (keyData == 0x20) { //space
Marcomissyou 1:51535675abf4 131 modifyKey[index_b] = 0x00;
Marcomissyou 1:51535675abf4 132 key_press_scan_buff[index_b] = 0x2c;
Marcomissyou 1:51535675abf4 133 index_b++;
Marcomissyou 1:51535675abf4 134 key_press_scan_buff[index_b] = 0x73;
Marcomissyou 0:b0fc0661c081 135 } else {
Marcomissyou 1:51535675abf4 136 modifyKey[index_b] = 0x00;
Marcomissyou 1:51535675abf4 137 //key_press_scan_buff[index_b] = 0x73; //this is dummy data.
Marcomissyou 1:51535675abf4 138 //msg[index_w+1] = '\0';
Marcomissyou 0:b0fc0661c081 139 }
Marcomissyou 1:51535675abf4 140 index_b++;
Marcomissyou 0:b0fc0661c081 141 if(keyData == 0x0a && ble.getGapState().connected){
Marcomissyou 1:51535675abf4 142 for(int i = 0; i < index_b ; i++){
Marcomissyou 1:51535675abf4 143 hidService.updateReport(modifyKey[i], key_press_scan_buff[i]);
Marcomissyou 1:51535675abf4 144 wait(0.03);
Marcomissyou 0:b0fc0661c081 145 }
Marcomissyou 1:51535675abf4 146
Marcomissyou 1:51535675abf4 147 socket.send(msg, sizeof(msg));
Marcomissyou 1:51535675abf4 148 index_b = 0;
Marcomissyou 1:51535675abf4 149 index_w = 0;
Marcomissyou 1:51535675abf4 150 memset(modifyKey, 0, 50);
Marcomissyou 1:51535675abf4 151 memset(msg, 0, 25);
Marcomissyou 1:51535675abf4 152 memset(key_press_scan_buff, 0, 50);
Marcomissyou 0:b0fc0661c081 153 }
Marcomissyou 0:b0fc0661c081 154
Marcomissyou 0:b0fc0661c081 155 }
Marcomissyou 0:b0fc0661c081 156 }
Marcomissyou 0:b0fc0661c081 157 }