Working program for data sending over BLE

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_GAP_Example by Bluetooth Low Energy

Committer:
Eevee
Date:
Fri Apr 28 12:47:23 2017 +0000
Revision:
16:9d681e53f310
Parent:
15:7e06fce6e4f8
TADAAAAAAAAA

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Eevee 16:9d681e53f310 1
mbedAustin 0:5375be4301ed 2 #include "mbed.h"
andresag 14:1c15d473b42f 3 #include "ble/BLE.h"
Eevee 16:9d681e53f310 4 #include "ble/Gap.h"
Eevee 16:9d681e53f310 5 #include "ble/UUID.h"
Eevee 16:9d681e53f310 6 #include "ble/GattCharacteristic.h"
andresag 14:1c15d473b42f 7
Eevee 16:9d681e53f310 8 BLEDevice ble;
Eevee 16:9d681e53f310 9
Eevee 16:9d681e53f310 10 /* Device Name, simpel discovey */
Eevee 16:9d681e53f310 11 const static char DEVICE_NAME[] = "ThisIsBLE1";
Eevee 16:9d681e53f310 12
Eevee 16:9d681e53f310 13 /*SET UUID*/
Eevee 16:9d681e53f310 14 const UUID GATT_SERVICE = "88888888-5555-4444-1111-777777777777";
Eevee 16:9d681e53f310 15 const UUID ADV_DATA = "11001100-2200-3300-4400-550055005500";
Eevee 16:9d681e53f310 16
Eevee 16:9d681e53f310 17 #define CHARACT_DATA 0
Eevee 16:9d681e53f310 18
Eevee 16:9d681e53f310 19
andresag 14:1c15d473b42f 20
andresag 14:1c15d473b42f 21 /* You have up to 26 bytes of advertising data to use. */
Eevee 16:9d681e53f310 22 // for
Eevee 16:9d681e53f310 23 uint8_t AdvData[] = {0x43,0x10,'d','u','m','m','y',0x02,0x02,0,1,7,81}; /* Example of hex data */
Eevee 16:9d681e53f310 24 uint8_t *datapointer = &AdvData[2];
Eevee 16:9d681e53f310 25
Eevee 16:9d681e53f310 26 GattCharacteristic gatt_characteristics(ADV_DATA,AdvData,(sizeof(AdvData)-2),26,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
Eevee 16:9d681e53f310 27
Eevee 16:9d681e53f310 28 GattCharacteristic *CHARACT_ARRAY[] = {&gatt_characteristics};
mbedAustin 0:5375be4301ed 29
Eevee 16:9d681e53f310 30 GattService gatt_service(GATT_SERVICE,CHARACT_ARRAY,1);
Eevee 16:9d681e53f310 31 // end
Eevee 16:9d681e53f310 32 const BLEProtocol::AddressBytes_t peerAddr = {0xb8, 0x27, 0xeb, 0x25, 0x00, 0xc4};
Eevee 16:9d681e53f310 33 BLEProtocol::AddressType_t peerAddrType = (BLEProtocol::AddressType::RANDOM_STATIC);
Eevee 16:9d681e53f310 34 //const ConnectionParams_t *connectionParams;
Eevee 16:9d681e53f310 35 //const GapScanningParams *scanParams;
Eevee 16:9d681e53f310 36
Eevee 16:9d681e53f310 37
Eevee 16:9d681e53f310 38 /* Restart advertising when the peer disconnects */
andresag 14:1c15d473b42f 39 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
andresag 14:1c15d473b42f 40 {
andresag 14:1c15d473b42f 41 BLE::Instance().gap().startAdvertising();
andresag 14:1c15d473b42f 42 }
Eevee 16:9d681e53f310 43
Eevee 16:9d681e53f310 44 /*This function is called when the ble initialization process has failed*/
andresag 14:1c15d473b42f 45 void onBleInitError(BLE &ble, ble_error_t error)
andresag 14:1c15d473b42f 46 {
Eevee 16:9d681e53f310 47 /* Avoid compiler warnings, library said to do this */
andresag 14:1c15d473b42f 48 (void) ble;
andresag 14:1c15d473b42f 49 (void) error;
andresag 14:1c15d473b42f 50
andresag 14:1c15d473b42f 51 /* Initialization error handling should go here */
andresag 14:1c15d473b42f 52 }
mbedAustin 0:5375be4301ed 53
Eevee 16:9d681e53f310 54 /*Callback triggered when ble initialization process has finished*/
andresag 14:1c15d473b42f 55 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
andresag 14:1c15d473b42f 56 {
andresag 14:1c15d473b42f 57 BLE& ble = params->ble;
andresag 14:1c15d473b42f 58 ble_error_t error = params->error;
andresag 14:1c15d473b42f 59
Eevee 16:9d681e53f310 60 /* In case of error, forward the error handling to onBleInitError */
andresag 14:1c15d473b42f 61 if (error != BLE_ERROR_NONE) {
andresag 14:1c15d473b42f 62 onBleInitError(ble, error);
andresag 14:1c15d473b42f 63 return;
andresag 14:1c15d473b42f 64 }
mbedAustin 5:fff16d283dcf 65
andresag 14:1c15d473b42f 66 /* Ensure that it is the default instance of BLE */
andresag 14:1c15d473b42f 67 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
andresag 14:1c15d473b42f 68 return;
andresag 14:1c15d473b42f 69 }
andresag 14:1c15d473b42f 70
andresag 14:1c15d473b42f 71 /* Set device name characteristic data */
andresag 14:1c15d473b42f 72 ble.gap().setDeviceName((const uint8_t *) DEVICE_NAME);
Eevee 16:9d681e53f310 73
Eevee 16:9d681e53f310 74
Eevee 16:9d681e53f310 75 /* callback when disconnected */
andresag 14:1c15d473b42f 76 ble.gap().onDisconnection(disconnectionCallback);
mbedAustin 1:0692bee84264 77
Eevee 16:9d681e53f310 78 /* Sacrifice 3B of 31B to some Advertising Flags (see nrfconnect toolbox for flag parameters :) ) */
Eevee 16:9d681e53f310 79 // for
Eevee 16:9d681e53f310 80 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);// say this device can be discovered by other BLE supportingdevices
Eevee 16:9d681e53f310 81 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); // say that a connection can be set ( connectable) and that it does not matter with who it connects (unidirected)
andresag 14:1c15d473b42f 82
Eevee 16:9d681e53f310 83
Eevee 16:9d681e53f310 84 /* Sacrifice another 2B of 31B (actually 29B) to AdvType overhead, rest goes to AdvData array --> about 26B of actual sendable data :o */
Eevee 16:9d681e53f310 85 //Overhead = 1B Length, 1B Type
Eevee 16:9d681e53f310 86 //Type = AdvData
Eevee 16:9d681e53f310 87 //Length = sizeof(AdvData)
Eevee 16:9d681e53f310 88 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, AdvData, sizeof(AdvData));
andresag 14:1c15d473b42f 89
Eevee 16:9d681e53f310 90 /*fill in device name as local name*/
Eevee 16:9d681e53f310 91 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
Eevee 16:9d681e53f310 92
Eevee 16:9d681e53f310 93 /* Set advertising interval. Longer interval == Less radiothingies use == longer battery life :) */
Eevee 16:9d681e53f310 94 ble.gap().setAdvertisingInterval(100); /* 100ms */
Eevee 16:9d681e53f310 95
Eevee 16:9d681e53f310 96
andresag 14:1c15d473b42f 97
Eevee 16:9d681e53f310 98 ble.addService(gatt_service);
andresag 14:1c15d473b42f 99
Eevee 16:9d681e53f310 100 //ble.gap().addData(GapAdvertisingData::SERVICE_DATA, (uint8_t *)AdvData, sizeof(AdvData));
andresag 14:1c15d473b42f 101 /* Start advertising */
Eevee 16:9d681e53f310 102 ble.gap().startAdvertising(); //start sending advertising packets
Eevee 16:9d681e53f310 103
Eevee 16:9d681e53f310 104 ble.initializeSecurity();
Eevee 16:9d681e53f310 105 //end
mbedAustin 8:5442739198ec 106 }
mbedAustin 8:5442739198ec 107
mbedAustin 1:0692bee84264 108 int main(void)
mbedAustin 0:5375be4301ed 109 {
Eevee 16:9d681e53f310 110 // VERSPILT ENERGIE wait(1);
andresag 14:1c15d473b42f 111 BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE);
andresag 14:1c15d473b42f 112
Eevee 16:9d681e53f310 113 /* Initialize BLE baselayer, library said : "always do this first!" so we will do */
andresag 14:1c15d473b42f 114 ble.init(bleInitComplete);
mbedAustin 1:0692bee84264 115
andresag 14:1c15d473b42f 116 /* Infinite loop waiting for BLE events */
andresag 14:1c15d473b42f 117 while (true) {
andresag 14:1c15d473b42f 118 /* Save power while waiting for callback events */
Eevee 16:9d681e53f310 119 ble.waitForEvent(); //this is like a sleep function, waking up on interrupts like disconnection or so
mbedAustin 1:0692bee84264 120 }
mbedAustin 1:0692bee84264 121 }