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