Javier Vargas
/
ControllerBLE
Test
source/main.cpp@78:bb7e309408a2, 2019-01-29 (annotated)
- 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?
User | Revision | Line number | New 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 | } |