Test

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?

UserRevisionLine numberNew 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 }