Test

Committer:
HelGast95
Date:
Tue Jan 29 09:26:59 2019 +0000
Revision:
78:bb7e309408a2
Parent:
77:48c622bf903f
Child:
79:9f3aca04de4e
Define filtro para la MAC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
HelGast95 77:48c622bf903f 1 #define END_OF_JSON 0xFE
HelGast95 78:bb7e309408a2 2 #define MAC_FILTER 0x8E
mbed_official 1:72c60abef7e7 3
HelGast95 73:a91805f9e9f0 4 #include "mbed.h"
HelGast95 73:a91805f9e9f0 5 #include "picojson.h"
HelGast95 73:a91805f9e9f0 6 #include "stats_report.h"
HelGast95 73:a91805f9e9f0 7
HelGast95 73:a91805f9e9f0 8 /* Librerías para BLE - Servicio GATT */
mbed_official 1:72c60abef7e7 9 #include "ble/BLE.h"
mbed_official 1:72c60abef7e7 10 #include "ble/Gap.h"
HelGast95 73:a91805f9e9f0 11 #include "ble/DiscoveredCharacteristic.h"
HelGast95 73:a91805f9e9f0 12 #include "ble/DiscoveredService.h"
HelGast95 73:a91805f9e9f0 13
HelGast95 78:bb7e309408a2 14 bool serviceDiscovered = false;
HelGast95 77:48c622bf903f 15 char finalCharacterJSON = END_OF_JSON;
HelGast95 73:a91805f9e9f0 16
HelGast95 74:12b9444a2fb4 17 typedef struct {
HelGast95 74:12b9444a2fb4 18 string id; /* Id */
HelGast95 74:12b9444a2fb4 19 float voltaje; /* Voltaje */
HelGast95 74:12b9444a2fb4 20 } BLEdata_t;
HelGast95 73:a91805f9e9f0 21
HelGast95 73:a91805f9e9f0 22 DigitalOut led3Test(LED3);
HelGast95 73:a91805f9e9f0 23 DigitalOut led4BLE(LED4);
HelGast95 73:a91805f9e9f0 24 Serial pcSerial(USBTX, USBRX); // Abrimos conexión serial con el puerto USB
HelGast95 74:12b9444a2fb4 25 DiscoveredCharacteristic testServiceptr;
HelGast95 73:a91805f9e9f0 26
HelGast95 73:a91805f9e9f0 27 EventQueue eventQueue;
HelGast95 74:12b9444a2fb4 28 Queue<BLEdata_t, 32> BLEqueue;
HelGast95 74:12b9444a2fb4 29 MemoryPool<BLEdata_t, 32> BLEmpool;
mbed_official 1:72c60abef7e7 30
HelGast95 73:a91805f9e9f0 31 Thread threadLED(osPriorityAboveNormal1, 400);
HelGast95 74:12b9444a2fb4 32 Thread threadSerial(osPriorityAboveNormal2, 2500);
HelGast95 74:12b9444a2fb4 33 Thread threadBLE(osPriorityRealtime3, 1000);
HelGast95 73:a91805f9e9f0 34
HelGast95 73:a91805f9e9f0 35 /**
HelGast95 77:48c622bf903f 36 * Thread encargado de parpadear un LED continuamente
HelGast95 73:a91805f9e9f0 37 */
HelGast95 73:a91805f9e9f0 38 void blinkLED3() {
HelGast95 73:a91805f9e9f0 39 while(true) {
HelGast95 73:a91805f9e9f0 40 led3Test = !led3Test;
HelGast95 74:12b9444a2fb4 41 wait(0.8);
HelGast95 73:a91805f9e9f0 42 }
HelGast95 73:a91805f9e9f0 43 }
HelGast95 73:a91805f9e9f0 44
HelGast95 73:a91805f9e9f0 45 /**
HelGast95 73:a91805f9e9f0 46 * Método encargado de enviar un string por el puerto serie char a char
HelGast95 73:a91805f9e9f0 47 */
HelGast95 73:a91805f9e9f0 48 void sendCharArrayToSerial(char const *array, Serial *serial) {
HelGast95 74:12b9444a2fb4 49 uint32_t i = 0;
HelGast95 73:a91805f9e9f0 50 while(array[i] != '\0') {
HelGast95 73:a91805f9e9f0 51 serial->putc(array[i]);
HelGast95 73:a91805f9e9f0 52 i++;
HelGast95 73:a91805f9e9f0 53 }
HelGast95 73:a91805f9e9f0 54 serial->putc('\0');
HelGast95 73:a91805f9e9f0 55 }
mbed_official 1:72c60abef7e7 56
HelGast95 73:a91805f9e9f0 57 /**
HelGast95 74:12b9444a2fb4 58 * Thread encargado de enviar JSONs por el puerto serie
HelGast95 73:a91805f9e9f0 59 */
HelGast95 73:a91805f9e9f0 60 void sendJsonOverSerial() {
HelGast95 77:48c622bf903f 61
HelGast95 76:596c9924e51b 62 char tmp[512]; // Vble auxiliar para el tratamiento de cadenas de char.
HelGast95 74:12b9444a2fb4 63 string str;
HelGast95 77:48c622bf903f 64
HelGast95 74:12b9444a2fb4 65 while(true) {
HelGast95 77:48c622bf903f 66
HelGast95 74:12b9444a2fb4 67 // Esperamos a un mensaje en la cola
HelGast95 77:48c622bf903f 68 picojson::object json;
HelGast95 76:596c9924e51b 69 picojson::object event;
HelGast95 76:596c9924e51b 70 picojson::object extraInfo;
HelGast95 77:48c622bf903f 71
HelGast95 76:596c9924e51b 72 int type = rand() % 3;
HelGast95 76:596c9924e51b 73 int idEvent = rand() % 500;
HelGast95 76:596c9924e51b 74 event["idEvent"] = picojson::value((double) idEvent);
HelGast95 76:596c9924e51b 75 event["type"] = picojson::value((double) type);
HelGast95 76:596c9924e51b 76 str = "E9:ED:F4:AC:BF:8E";
HelGast95 76:596c9924e51b 77 extraInfo["hazardousDevice"] = picojson::value(str);
HelGast95 76:596c9924e51b 78 str = "D5:62:12:BF:B8:45";
HelGast95 77:48c622bf903f 79
HelGast95 76:596c9924e51b 80 if(type != 0) extraInfo["affectedDevice"] = picojson::value(str);
HelGast95 76:596c9924e51b 81 event["extraInfo"] = picojson::value(extraInfo);
HelGast95 77:48c622bf903f 82 json["Event"] = picojson::value(event);
HelGast95 75:6606a580ebc4 83
HelGast95 77:48c622bf903f 84 str = picojson::value(json).serialize();
HelGast95 76:596c9924e51b 85
HelGast95 76:596c9924e51b 86 // Convertimos el string a char *
HelGast95 76:596c9924e51b 87 strncpy(tmp, str.c_str(), sizeof(tmp));
HelGast95 77:48c622bf903f 88 strncat(tmp, &finalCharacterJSON, sizeof(finalCharacterJSON)); // Añadimos el caracter al final
HelGast95 76:596c9924e51b 89 tmp[sizeof(tmp) - 1] = 0;
HelGast95 76:596c9924e51b 90
HelGast95 76:596c9924e51b 91 sendCharArrayToSerial(tmp, &pcSerial);
HelGast95 76:596c9924e51b 92
HelGast95 77:48c622bf903f 93 wait(10);
HelGast95 74:12b9444a2fb4 94 }
HelGast95 73:a91805f9e9f0 95 }
HelGast95 73:a91805f9e9f0 96
HelGast95 74:12b9444a2fb4 97 void scanCallback(const Gap::AdvertisementCallbackParams_t *params) {
HelGast95 78:bb7e309408a2 98 if (params->peerAddr[0] != MAC_FILTER) return;
HelGast95 76:596c9924e51b 99 /*
HelGast95 73:a91805f9e9f0 100 printf("adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n",
HelGast95 73:a91805f9e9f0 101 params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],
HelGast95 73:a91805f9e9f0 102 params->rssi, params->isScanResponse, params->type);
HelGast95 76:596c9924e51b 103 */
HelGast95 73:a91805f9e9f0 104
HelGast95 73:a91805f9e9f0 105 BLE::Instance().gap().connect(params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, NULL, NULL);
HelGast95 73:a91805f9e9f0 106 }
mbed_official 1:72c60abef7e7 107
HelGast95 73:a91805f9e9f0 108 void serviceDiscoveryCallback(const DiscoveredService *service) {
HelGast95 73:a91805f9e9f0 109 if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
HelGast95 76:596c9924e51b 110 //printf("S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle());
HelGast95 73:a91805f9e9f0 111 } else {
HelGast95 76:596c9924e51b 112 //printf("S UUID-");
HelGast95 73:a91805f9e9f0 113 const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID();
HelGast95 73:a91805f9e9f0 114 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
HelGast95 76:596c9924e51b 115 //printf("%02x", longUUIDBytes[i]);
HelGast95 73:a91805f9e9f0 116 }
HelGast95 76:596c9924e51b 117 //printf(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle());
HelGast95 73:a91805f9e9f0 118 }
HelGast95 73:a91805f9e9f0 119 }
HelGast95 73:a91805f9e9f0 120
HelGast95 73:a91805f9e9f0 121 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) {
HelGast95 76:596c9924e51b 122 //printf(" C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getUUID().getShortUUID(), characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast());
HelGast95 74:12b9444a2fb4 123 if (characteristicP->getUUID().getShortUUID() == 0xa001) {
HelGast95 73:a91805f9e9f0 124 testServiceptr = *characteristicP;
HelGast95 73:a91805f9e9f0 125 serviceDiscovered = true;
HelGast95 73:a91805f9e9f0 126 }
HelGast95 73:a91805f9e9f0 127 }
HelGast95 73:a91805f9e9f0 128
HelGast95 73:a91805f9e9f0 129 void discoveryTerminationCallback(Gap::Handle_t connectionHandle) {
HelGast95 76:596c9924e51b 130 //printf("terminated SD for handle %u\r\n", connectionHandle);
HelGast95 73:a91805f9e9f0 131 }
HelGast95 73:a91805f9e9f0 132
HelGast95 73:a91805f9e9f0 133 void connectionCallback(const Gap::ConnectionCallbackParams_t *params) {
HelGast95 73:a91805f9e9f0 134 if (params->role == Gap::CENTRAL) {
HelGast95 73:a91805f9e9f0 135 BLE::Instance().gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback);
HelGast95 73:a91805f9e9f0 136 BLE::Instance().gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, 0xA000, 0xA001);
HelGast95 73:a91805f9e9f0 137 }
HelGast95 73:a91805f9e9f0 138 }
mbed_official 1:72c60abef7e7 139
mbed_official 1:72c60abef7e7 140 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
mbed_official 1:72c60abef7e7 141 {
HelGast95 73:a91805f9e9f0 142 /* Si se desconecta el dispositivo, volvemos a entrar en estado Advertising*/
HelGast95 76:596c9924e51b 143 //printf("Desconectado. Se comienza la fase de escaneo de nuevo\n\r");
HelGast95 73:a91805f9e9f0 144 serviceDiscovered = false;
HelGast95 74:12b9444a2fb4 145 BLE::Instance().gap().startScan(scanCallback);
mbed_official 1:72c60abef7e7 146 }
HelGast95 75:6606a580ebc4 147
HelGast95 73:a91805f9e9f0 148 void onDataReadClientCallback(const GattReadCallbackParams *response) {
HelGast95 73:a91805f9e9f0 149 if (response->handle == testServiceptr.getValueHandle()) {
HelGast95 76:596c9924e51b 150 //printf("\r\n\r\nonDataReadClientCallback: handle %u, offset %u, len %u\r\n", response->handle, response->offset, response->len);
HelGast95 73:a91805f9e9f0 151 for (unsigned index = 0; index < response->len; index++) {
HelGast95 76:596c9924e51b 152 //printf("[%02x]", response->data[index]);
HelGast95 73:a91805f9e9f0 153 }
HelGast95 76:596c9924e51b 154 //printf("\r\n");
HelGast95 75:6606a580ebc4 155
HelGast95 74:12b9444a2fb4 156 BLEdata_t *BLEdata = BLEmpool.alloc();
HelGast95 74:12b9444a2fb4 157 int r = rand() % 500;
HelGast95 74:12b9444a2fb4 158 char str[12];
HelGast95 74:12b9444a2fb4 159 sprintf(str, "%d", r);
HelGast95 74:12b9444a2fb4 160 BLEdata->id = str;
HelGast95 74:12b9444a2fb4 161 uint16_t tensionaux;
HelGast95 74:12b9444a2fb4 162 tensionaux = ((response->data[1]) << 8) + (response->data[0]);
HelGast95 75:6606a580ebc4 163 BLEdata->voltaje = (tensionaux * 1.0 )/100;
HelGast95 76:596c9924e51b 164 BLEqueue.put(BLEdata);
mbed_official 1:72c60abef7e7 165 }
mbed_official 1:72c60abef7e7 166 }
mbed_official 1:72c60abef7e7 167
HelGast95 73:a91805f9e9f0 168 /**
HelGast95 73:a91805f9e9f0 169 * Esta función se llama si ha habido algún error en el proceso de inicialización del BLE
HelGast95 73:a91805f9e9f0 170 */
HelGast95 73:a91805f9e9f0 171 void onBleInitError(BLE &ble, ble_error_t error) {
HelGast95 76:596c9924e51b 172 //printf("Ha ocurrido un error al inicializar la configuracion del BLE\n");
mbed_official 1:72c60abef7e7 173 }
mbed_official 1:72c60abef7e7 174
HelGast95 73:a91805f9e9f0 175 void printMacAddress() {
mbed_official 43:fb2855f7754b 176 /* Print out device MAC address to the console*/
mbed_official 43:fb2855f7754b 177 Gap::AddressType_t addr_type;
mbed_official 43:fb2855f7754b 178 Gap::Address_t address;
mbed_official 43:fb2855f7754b 179 BLE::Instance().gap().getAddress(&addr_type, address);
mbed_official 43:fb2855f7754b 180 printf("DEVICE MAC ADDRESS: ");
mbed_official 43:fb2855f7754b 181 for (int i = 5; i >= 1; i--){
mbed_official 43:fb2855f7754b 182 printf("%02x:", address[i]);
mbed_official 43:fb2855f7754b 183 }
mbed_official 43:fb2855f7754b 184 printf("%02x\r\n", address[0]);
mbed_official 43:fb2855f7754b 185 }
mbed_official 43:fb2855f7754b 186
HelGast95 73:a91805f9e9f0 187 /**
HelGast95 73:a91805f9e9f0 188 * Callback triggered when the ble initialization process has finished
HelGast95 73:a91805f9e9f0 189 */
mbed_official 1:72c60abef7e7 190 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
mbed_official 1:72c60abef7e7 191 {
mbed_official 1:72c60abef7e7 192 BLE& ble = params->ble;
mbed_official 1:72c60abef7e7 193 ble_error_t error = params->error;
mbed_official 1:72c60abef7e7 194
mbed_official 1:72c60abef7e7 195 if (error != BLE_ERROR_NONE) {
HelGast95 73:a91805f9e9f0 196 /* In case of error, forward the error handling to onBleInitError */
mbed_official 1:72c60abef7e7 197 onBleInitError(ble, error);
mbed_official 1:72c60abef7e7 198 return;
mbed_official 1:72c60abef7e7 199 }
mbed_official 1:72c60abef7e7 200
HelGast95 73:a91805f9e9f0 201 /* Ensure that it is the default instance of BLE */
HelGast95 73:a91805f9e9f0 202 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
mbed_official 1:72c60abef7e7 203 return;
mbed_official 1:72c60abef7e7 204 }
HelGast95 73:a91805f9e9f0 205
HelGast95 73:a91805f9e9f0 206 ble.gap().onConnection(connectionCallback);
mbed_official 1:72c60abef7e7 207 ble.gap().onDisconnection(disconnectionCallback);
mbed_official 1:72c60abef7e7 208
HelGast95 73:a91805f9e9f0 209 ble.gattClient().onDataRead(onDataReadClientCallback);
mbed_official 1:72c60abef7e7 210
HelGast95 73:a91805f9e9f0 211 ble.gap().setScanParams(500, 400);
HelGast95 75:6606a580ebc4 212 ble.gap().startScan(scanCallback);
mbed_official 1:72c60abef7e7 213 }
mbed_official 1:72c60abef7e7 214
mbed_official 1:72c60abef7e7 215 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
mbed_official 1:72c60abef7e7 216 BLE &ble = BLE::Instance();
mbed_official 10:ac3615194d04 217 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
HelGast95 73:a91805f9e9f0 218 }
HelGast95 73:a91805f9e9f0 219
HelGast95 73:a91805f9e9f0 220 void readVoltageValue() {
HelGast95 73:a91805f9e9f0 221 BLE &ble = BLE::Instance();
HelGast95 73:a91805f9e9f0 222 if (serviceDiscovered && !ble.gattClient().isServiceDiscoveryActive()) {
HelGast95 73:a91805f9e9f0 223 testServiceptr.read();
HelGast95 73:a91805f9e9f0 224 }
mbed_official 1:72c60abef7e7 225 }
mbed_official 1:72c60abef7e7 226
HelGast95 73:a91805f9e9f0 227 void BLEServiceManagment() {
HelGast95 75:6606a580ebc4 228 eventQueue.call_every(2000, readVoltageValue);
HelGast95 73:a91805f9e9f0 229
mbed_official 1:72c60abef7e7 230 BLE &ble = BLE::Instance();
HelGast95 73:a91805f9e9f0 231 ble.onEventsToProcess(scheduleBleEventsProcessing);
mbed_official 1:72c60abef7e7 232 ble.init(bleInitComplete);
HelGast95 73:a91805f9e9f0 233
mbed_official 10:ac3615194d04 234 eventQueue.dispatch_forever();
HelGast95 73:a91805f9e9f0 235 }
mbed_official 1:72c60abef7e7 236
HelGast95 73:a91805f9e9f0 237 int main() {
HelGast95 74:12b9444a2fb4 238 srand(time(NULL));
HelGast95 77:48c622bf903f 239 threadLED.start(callback(blinkLED3));
HelGast95 77:48c622bf903f 240 //threadBLE.start(callback(BLEServiceManagment));
HelGast95 77:48c622bf903f 241 threadSerial.start(callback(sendJsonOverSerial));
HelGast95 74:12b9444a2fb4 242
HelGast95 73:a91805f9e9f0 243 threadLED.join();
HelGast95 73:a91805f9e9f0 244 threadBLE.join();
HelGast95 74:12b9444a2fb4 245 threadSerial.join();
HelGast95 73:a91805f9e9f0 246 }