Test

Committer:
HelGast95
Date:
Thu Jan 31 12:55:00 2019 +0000
Revision:
79:9f3aca04de4e
Parent:
78:bb7e309408a2
Child:
80:5e52c5847273
Primera version de GATT Server

Who changed what in which revision?

UserRevisionLine numberNew contents of line
HelGast95 77:48c622bf903f 1 #define END_OF_JSON 0xFE
HelGast95 79:9f3aca04de4e 2 #define MAC_FILTER 0x8E
HelGast95 79:9f3aca04de4e 3 #define VERBOSE_MODE 1 // Habilita la generacion de logs por el puerto USB
mbed_official 1:72c60abef7e7 4
HelGast95 73:a91805f9e9f0 5 #include "mbed.h"
HelGast95 73:a91805f9e9f0 6 #include "picojson.h"
HelGast95 73:a91805f9e9f0 7 #include "stats_report.h"
HelGast95 73:a91805f9e9f0 8
HelGast95 73:a91805f9e9f0 9 /* Librerías para BLE - Servicio GATT */
mbed_official 1:72c60abef7e7 10 #include "ble/BLE.h"
mbed_official 1:72c60abef7e7 11 #include "ble/Gap.h"
HelGast95 79:9f3aca04de4e 12 #include "TOFService.h"
HelGast95 73:a91805f9e9f0 13 #include "ble/DiscoveredCharacteristic.h"
HelGast95 73:a91805f9e9f0 14 #include "ble/DiscoveredService.h"
HelGast95 73:a91805f9e9f0 15
HelGast95 79:9f3aca04de4e 16 const static char DEVICE_NAME[] = "BLE_CONTROLLER";
HelGast95 79:9f3aca04de4e 17 static const uint16_t uuid16_list[] = {TOFService::CUSTOM_TOF_SERVICE_UUID};
HelGast95 79:9f3aca04de4e 18
HelGast95 78:bb7e309408a2 19 bool serviceDiscovered = false;
HelGast95 77:48c622bf903f 20 char finalCharacterJSON = END_OF_JSON;
HelGast95 73:a91805f9e9f0 21
HelGast95 74:12b9444a2fb4 22 typedef struct {
HelGast95 79:9f3aca04de4e 23 string MAC; /* Dirección MAC */
HelGast95 79:9f3aca04de4e 24 float ToF; /* Tiempo de vuelo */
HelGast95 74:12b9444a2fb4 25 } BLEdata_t;
HelGast95 73:a91805f9e9f0 26
HelGast95 73:a91805f9e9f0 27 DigitalOut led3Test(LED3);
HelGast95 73:a91805f9e9f0 28 DigitalOut led4BLE(LED4);
HelGast95 73:a91805f9e9f0 29 Serial pcSerial(USBTX, USBRX); // Abrimos conexión serial con el puerto USB
HelGast95 79:9f3aca04de4e 30
HelGast95 79:9f3aca04de4e 31 TOFService* tofService;
HelGast95 73:a91805f9e9f0 32
HelGast95 73:a91805f9e9f0 33 EventQueue eventQueue;
HelGast95 74:12b9444a2fb4 34 Queue<BLEdata_t, 32> BLEqueue;
HelGast95 74:12b9444a2fb4 35 MemoryPool<BLEdata_t, 32> BLEmpool;
mbed_official 1:72c60abef7e7 36
HelGast95 79:9f3aca04de4e 37 Thread threadLED(osPriorityAboveNormal1, 1000);
HelGast95 74:12b9444a2fb4 38 Thread threadSerial(osPriorityAboveNormal2, 2500);
HelGast95 74:12b9444a2fb4 39 Thread threadBLE(osPriorityRealtime3, 1000);
HelGast95 73:a91805f9e9f0 40
HelGast95 79:9f3aca04de4e 41 template<typename arg>
HelGast95 79:9f3aca04de4e 42 void printLog(const char * log, arg data) {
HelGast95 79:9f3aca04de4e 43 if(VERBOSE_MODE) printf(log, data);
HelGast95 79:9f3aca04de4e 44 }
HelGast95 79:9f3aca04de4e 45
HelGast95 79:9f3aca04de4e 46 void printLog(const char * log) {
HelGast95 79:9f3aca04de4e 47 if(VERBOSE_MODE) printf(log);
HelGast95 79:9f3aca04de4e 48 }
HelGast95 79:9f3aca04de4e 49
HelGast95 73:a91805f9e9f0 50 /**
HelGast95 77:48c622bf903f 51 * Thread encargado de parpadear un LED continuamente
HelGast95 73:a91805f9e9f0 52 */
HelGast95 73:a91805f9e9f0 53 void blinkLED3() {
HelGast95 73:a91805f9e9f0 54 while(true) {
HelGast95 73:a91805f9e9f0 55 led3Test = !led3Test;
HelGast95 74:12b9444a2fb4 56 wait(0.8);
HelGast95 73:a91805f9e9f0 57 }
HelGast95 73:a91805f9e9f0 58 }
HelGast95 73:a91805f9e9f0 59
HelGast95 73:a91805f9e9f0 60 /**
HelGast95 73:a91805f9e9f0 61 * Método encargado de enviar un string por el puerto serie char a char
HelGast95 73:a91805f9e9f0 62 */
HelGast95 73:a91805f9e9f0 63 void sendCharArrayToSerial(char const *array, Serial *serial) {
HelGast95 74:12b9444a2fb4 64 uint32_t i = 0;
HelGast95 73:a91805f9e9f0 65 while(array[i] != '\0') {
HelGast95 73:a91805f9e9f0 66 serial->putc(array[i]);
HelGast95 73:a91805f9e9f0 67 i++;
HelGast95 73:a91805f9e9f0 68 }
HelGast95 73:a91805f9e9f0 69 serial->putc('\0');
HelGast95 73:a91805f9e9f0 70 }
mbed_official 1:72c60abef7e7 71
HelGast95 73:a91805f9e9f0 72 /**
HelGast95 74:12b9444a2fb4 73 * Thread encargado de enviar JSONs por el puerto serie
HelGast95 73:a91805f9e9f0 74 */
HelGast95 73:a91805f9e9f0 75 void sendJsonOverSerial() {
HelGast95 76:596c9924e51b 76 char tmp[512]; // Vble auxiliar para el tratamiento de cadenas de char.
HelGast95 74:12b9444a2fb4 77 string str;
HelGast95 74:12b9444a2fb4 78 while(true) {
HelGast95 74:12b9444a2fb4 79 // Esperamos a un mensaje en la cola
HelGast95 77:48c622bf903f 80 picojson::object json;
HelGast95 76:596c9924e51b 81 picojson::object event;
HelGast95 76:596c9924e51b 82 picojson::object extraInfo;
HelGast95 77:48c622bf903f 83
HelGast95 79:9f3aca04de4e 84 osEvent evt = BLEqueue.get();
HelGast95 79:9f3aca04de4e 85 if (evt.status == osEventMessage) {
HelGast95 79:9f3aca04de4e 86 BLEdata_t *BLEdata = (BLEdata_t*)evt.value.p;
HelGast95 79:9f3aca04de4e 87
HelGast95 79:9f3aca04de4e 88 BLEmpool.free(BLEdata);
HelGast95 79:9f3aca04de4e 89
HelGast95 79:9f3aca04de4e 90 int type = rand() % 4;
HelGast95 79:9f3aca04de4e 91 event["idEvent"] = picojson::value(BLEdata->MAC);
HelGast95 79:9f3aca04de4e 92 event["type"] = picojson::value((double) type);
HelGast95 79:9f3aca04de4e 93 str = "E9:ED:F4:AC:BF:8E";
HelGast95 79:9f3aca04de4e 94 extraInfo["hazardousDevice"] = picojson::value(str);
HelGast95 79:9f3aca04de4e 95 str = "D5:62:12:BF:B8:45";
HelGast95 79:9f3aca04de4e 96
HelGast95 79:9f3aca04de4e 97 if(type != 0) extraInfo["affectedDevice"] = picojson::value(str);
HelGast95 79:9f3aca04de4e 98 event["extraInfo"] = picojson::value(extraInfo);
HelGast95 79:9f3aca04de4e 99 json["Event"] = picojson::value(event);
HelGast95 79:9f3aca04de4e 100
HelGast95 79:9f3aca04de4e 101 str = picojson::value(json).serialize();
HelGast95 79:9f3aca04de4e 102
HelGast95 79:9f3aca04de4e 103 // Convertimos el string a char *
HelGast95 79:9f3aca04de4e 104 strncpy(tmp, str.c_str(), sizeof(tmp));
HelGast95 79:9f3aca04de4e 105 strncat(tmp, &finalCharacterJSON, sizeof(finalCharacterJSON)); // Añadimos el caracter al final
HelGast95 79:9f3aca04de4e 106 tmp[sizeof(tmp) - 1] = 0;
HelGast95 79:9f3aca04de4e 107
HelGast95 79:9f3aca04de4e 108 sendCharArrayToSerial(tmp, &pcSerial);
HelGast95 79:9f3aca04de4e 109 }
HelGast95 74:12b9444a2fb4 110 }
HelGast95 73:a91805f9e9f0 111 }
HelGast95 73:a91805f9e9f0 112
HelGast95 79:9f3aca04de4e 113 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) {
HelGast95 79:9f3aca04de4e 114 printLog("Desconectado. Se comienza la fase de Advertising de nuevo\r\n");
HelGast95 79:9f3aca04de4e 115 BLE::Instance(BLE::DEFAULT_INSTANCE).gap().startAdvertising();
HelGast95 73:a91805f9e9f0 116 }
HelGast95 73:a91805f9e9f0 117
HelGast95 73:a91805f9e9f0 118 void connectionCallback(const Gap::ConnectionCallbackParams_t *params) {
HelGast95 79:9f3aca04de4e 119 printLog("Conectado al servidor\r\n");
HelGast95 73:a91805f9e9f0 120 }
mbed_official 1:72c60abef7e7 121
HelGast95 79:9f3aca04de4e 122 void writeCharCallback(const GattWriteCallbackParams *params) {
HelGast95 79:9f3aca04de4e 123 if(params->handle == tofService->getValueHandle()) {
HelGast95 79:9f3aca04de4e 124 char toChar [TOFService::TOF_CHAR_ARRAY_SIZE + 1];
HelGast95 79:9f3aca04de4e 125 printLog("Data received: length = %d, data = 0x", params->len);
HelGast95 79:9f3aca04de4e 126 for(int x=0; x < params->len; x++) {
HelGast95 79:9f3aca04de4e 127 toChar[x] = (char) params->data[x];
HelGast95 79:9f3aca04de4e 128 printLog("%x", params->data[x]);
HelGast95 73:a91805f9e9f0 129 }
HelGast95 79:9f3aca04de4e 130 toChar[params->len] = '\0';
HelGast95 79:9f3aca04de4e 131 string str(toChar);
HelGast95 79:9f3aca04de4e 132 printLog("\n\r");
HelGast95 79:9f3aca04de4e 133 printLog("Dato parseado a string: %s\n\r", str);
mbed_official 1:72c60abef7e7 134 }
mbed_official 1:72c60abef7e7 135 }
mbed_official 1:72c60abef7e7 136
HelGast95 73:a91805f9e9f0 137 /**
HelGast95 73:a91805f9e9f0 138 * Esta función se llama si ha habido algún error en el proceso de inicialización del BLE
HelGast95 73:a91805f9e9f0 139 */
HelGast95 73:a91805f9e9f0 140 void onBleInitError(BLE &ble, ble_error_t error) {
HelGast95 79:9f3aca04de4e 141 printLog("Ha ocurrido un error al inicializar la configuracion del BLE\n");
mbed_official 1:72c60abef7e7 142 }
mbed_official 1:72c60abef7e7 143
HelGast95 73:a91805f9e9f0 144 void printMacAddress() {
mbed_official 43:fb2855f7754b 145 /* Print out device MAC address to the console*/
mbed_official 43:fb2855f7754b 146 Gap::AddressType_t addr_type;
mbed_official 43:fb2855f7754b 147 Gap::Address_t address;
mbed_official 43:fb2855f7754b 148 BLE::Instance().gap().getAddress(&addr_type, address);
HelGast95 79:9f3aca04de4e 149 printLog("DEVICE MAC ADDRESS: ");
mbed_official 43:fb2855f7754b 150 for (int i = 5; i >= 1; i--){
HelGast95 79:9f3aca04de4e 151 printLog("%02x:", address[i]);
mbed_official 43:fb2855f7754b 152 }
HelGast95 79:9f3aca04de4e 153 printLog("%02x\r\n", address[0]);
mbed_official 43:fb2855f7754b 154 }
mbed_official 43:fb2855f7754b 155
HelGast95 73:a91805f9e9f0 156 /**
HelGast95 73:a91805f9e9f0 157 * Callback triggered when the ble initialization process has finished
HelGast95 73:a91805f9e9f0 158 */
HelGast95 79:9f3aca04de4e 159 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) {
HelGast95 79:9f3aca04de4e 160 BLE &ble = params->ble;
mbed_official 1:72c60abef7e7 161 ble_error_t error = params->error;
HelGast95 79:9f3aca04de4e 162
mbed_official 1:72c60abef7e7 163 if (error != BLE_ERROR_NONE) {
mbed_official 1:72c60abef7e7 164 return;
mbed_official 1:72c60abef7e7 165 }
mbed_official 1:72c60abef7e7 166
HelGast95 79:9f3aca04de4e 167 ble.gap().onDisconnection(disconnectionCallback);
HelGast95 73:a91805f9e9f0 168 ble.gap().onConnection(connectionCallback);
HelGast95 79:9f3aca04de4e 169 ble.gattServer().onDataWritten(writeCharCallback);
HelGast95 79:9f3aca04de4e 170
HelGast95 79:9f3aca04de4e 171 tofService = new TOFService(ble);
HelGast95 79:9f3aca04de4e 172
HelGast95 79:9f3aca04de4e 173 /* Setup advertising */
HelGast95 79:9f3aca04de4e 174 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); // BLE only, no classic BT
HelGast95 79:9f3aca04de4e 175 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); // advertising type
HelGast95 79:9f3aca04de4e 176 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); // add name
HelGast95 79:9f3aca04de4e 177 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); // UUID's broadcast in advertising packet
HelGast95 79:9f3aca04de4e 178 ble.gap().setAdvertisingInterval(100); // 100ms.
mbed_official 1:72c60abef7e7 179
HelGast95 79:9f3aca04de4e 180 /* Start advertising */
HelGast95 79:9f3aca04de4e 181 ble.gap().startAdvertising();
mbed_official 1:72c60abef7e7 182 }
mbed_official 1:72c60abef7e7 183
mbed_official 1:72c60abef7e7 184 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
mbed_official 1:72c60abef7e7 185 BLE &ble = BLE::Instance();
mbed_official 10:ac3615194d04 186 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
HelGast95 73:a91805f9e9f0 187 }
HelGast95 73:a91805f9e9f0 188
HelGast95 73:a91805f9e9f0 189 void BLEServiceManagment() {
mbed_official 1:72c60abef7e7 190 BLE &ble = BLE::Instance();
HelGast95 73:a91805f9e9f0 191 ble.onEventsToProcess(scheduleBleEventsProcessing);
mbed_official 1:72c60abef7e7 192 ble.init(bleInitComplete);
HelGast95 73:a91805f9e9f0 193
mbed_official 10:ac3615194d04 194 eventQueue.dispatch_forever();
HelGast95 73:a91805f9e9f0 195 }
mbed_official 1:72c60abef7e7 196
HelGast95 73:a91805f9e9f0 197 int main() {
HelGast95 74:12b9444a2fb4 198 srand(time(NULL));
HelGast95 77:48c622bf903f 199 threadLED.start(callback(blinkLED3));
HelGast95 79:9f3aca04de4e 200 threadBLE.start(callback(BLEServiceManagment));
HelGast95 79:9f3aca04de4e 201 //threadSerial.start(callback(sendJsonOverSerial));
HelGast95 74:12b9444a2fb4 202
HelGast95 73:a91805f9e9f0 203 threadLED.join();
HelGast95 73:a91805f9e9f0 204 threadBLE.join();
HelGast95 79:9f3aca04de4e 205 //threadSerial.join();
HelGast95 73:a91805f9e9f0 206 }