fds

Dependencies:   BLE_API mbed nRF51822

Committer:
npap2309
Date:
Fri Oct 06 06:41:44 2017 +0000
Revision:
0:a18188c7a4ee
mjkl

Who changed what in which revision?

UserRevisionLine numberNew contents of line
npap2309 0:a18188c7a4ee 1 #include "ble/BLE.h"
npap2309 0:a18188c7a4ee 2 #include "mbed.h"
npap2309 0:a18188c7a4ee 3
npap2309 0:a18188c7a4ee 4 BLE ble;
npap2309 0:a18188c7a4ee 5 Timeout timeout;
npap2309 0:a18188c7a4ee 6
npap2309 0:a18188c7a4ee 7 #define TXRX_BUF_LEN 20
npap2309 0:a18188c7a4ee 8 Serial pc(USBTX, USBRX);
npap2309 0:a18188c7a4ee 9
npap2309 0:a18188c7a4ee 10 //**********TAG Personalization***********************
npap2309 0:a18188c7a4ee 11 //****************************************************
npap2309 0:a18188c7a4ee 12 char TAG_ADDRESS[]="D2:FB:BE:68:EF:5A";
npap2309 0:a18188c7a4ee 13 //char TAG_ADDRESS[]="EE:04:D4:1A:9C:16";
npap2309 0:a18188c7a4ee 14 //char TAG_ADDRESS[]="F6:99:64:A9:FD:6D";
npap2309 0:a18188c7a4ee 15 //char TAG_ADDRESS[]="D6:F7:8B:78:5D:BD";
npap2309 0:a18188c7a4ee 16 //char TAG_ADDRESS[]="D7:8F:65:5C:A0:B9";
npap2309 0:a18188c7a4ee 17 int password=135;
npap2309 0:a18188c7a4ee 18 //****************************************************
npap2309 0:a18188c7a4ee 19
npap2309 0:a18188c7a4ee 20
npap2309 0:a18188c7a4ee 21
npap2309 0:a18188c7a4ee 22 int stealthModeActive=0;
npap2309 0:a18188c7a4ee 23 uint8_t chars_value[TXRX_BUF_LEN] = {0,};
npap2309 0:a18188c7a4ee 24
npap2309 0:a18188c7a4ee 25 // The Nordic UART Service
npap2309 0:a18188c7a4ee 26 static const uint8_t cityRiskServiceUuid[] = {0x71, 0x3D, 0, 0, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
npap2309 0:a18188c7a4ee 27 static const uint8_t cityRiskCharacteristcUuid[] = {0x71, 0x3D, 0, 2, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
npap2309 0:a18188c7a4ee 28 static const uint8_t uart_base_uuid_rev[] = {0x1E, 0x94, 0x8D, 0xF1, 0x48, 0x31, 0x94, 0xBA, 0x75, 0x4C, 0x3E, 0x50, 0, 0, 0x3D, 0x71};
npap2309 0:a18188c7a4ee 29
npap2309 0:a18188c7a4ee 30
npap2309 0:a18188c7a4ee 31 GattCharacteristic cityRiskCharacteristic(cityRiskCharacteristcUuid, chars_value, 3, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE);
npap2309 0:a18188c7a4ee 32
npap2309 0:a18188c7a4ee 33 GattCharacteristic *cityRiskChars[] = {&cityRiskCharacteristic};
npap2309 0:a18188c7a4ee 34
npap2309 0:a18188c7a4ee 35 GattService cityRiskService(cityRiskServiceUuid, cityRiskChars, sizeof(cityRiskChars) / sizeof(GattCharacteristic *));
npap2309 0:a18188c7a4ee 36
npap2309 0:a18188c7a4ee 37
npap2309 0:a18188c7a4ee 38 //static void scanCallBack(const Gap::AdvertisementCallbackParams_t *params);
npap2309 0:a18188c7a4ee 39
npap2309 0:a18188c7a4ee 40 /*************************************************************************************
npap2309 0:a18188c7a4ee 41 *Function Name: autodisconnect
npap2309 0:a18188c7a4ee 42 **************************************************************************************
npap2309 0:a18188c7a4ee 43 * Summary: Function is called to disconnect automatically
npap2309 0:a18188c7a4ee 44 *
npap2309 0:a18188c7a4ee 45 *
npap2309 0:a18188c7a4ee 46 * Parameters:
npap2309 0:a18188c7a4ee 47 * None
npap2309 0:a18188c7a4ee 48 *
npap2309 0:a18188c7a4ee 49 * Return:
npap2309 0:a18188c7a4ee 50 * None
npap2309 0:a18188c7a4ee 51 *
npap2309 0:a18188c7a4ee 52 ************************************************************************************/
npap2309 0:a18188c7a4ee 53 void autodisconnect(){
npap2309 0:a18188c7a4ee 54
npap2309 0:a18188c7a4ee 55 if (ble.getGapState().connected){
npap2309 0:a18188c7a4ee 56 ble.gap().disconnect(Gap::LOCAL_HOST_TERMINATED_CONNECTION);
npap2309 0:a18188c7a4ee 57 // pc.printf("Autodisconnect\n");
npap2309 0:a18188c7a4ee 58 }
npap2309 0:a18188c7a4ee 59 }
npap2309 0:a18188c7a4ee 60 /*************************************************************************************
npap2309 0:a18188c7a4ee 61 *Function Name: beaconInit
npap2309 0:a18188c7a4ee 62 **************************************************************************************
npap2309 0:a18188c7a4ee 63 * Summary: Setup peripheral profile
npap2309 0:a18188c7a4ee 64 *
npap2309 0:a18188c7a4ee 65 *
npap2309 0:a18188c7a4ee 66 * Parameters:
npap2309 0:a18188c7a4ee 67 * None
npap2309 0:a18188c7a4ee 68 *
npap2309 0:a18188c7a4ee 69 * Return:
npap2309 0:a18188c7a4ee 70 * None
npap2309 0:a18188c7a4ee 71 *
npap2309 0:a18188c7a4ee 72 ************************************************************************************/
npap2309 0:a18188c7a4ee 73 void beaconInit (void){
npap2309 0:a18188c7a4ee 74 ble.gap().startAdvertising();
npap2309 0:a18188c7a4ee 75 // pc.printf("beacon Init\n");
npap2309 0:a18188c7a4ee 76 }
npap2309 0:a18188c7a4ee 77
npap2309 0:a18188c7a4ee 78 /*************************************************************************************
npap2309 0:a18188c7a4ee 79 *Function Name: ble_advdata_decode
npap2309 0:a18188c7a4ee 80 **************************************************************************************
npap2309 0:a18188c7a4ee 81 * Summary: Used by the scan call back function to declare a successful scan.
npap2309 0:a18188c7a4ee 82 *
npap2309 0:a18188c7a4ee 83 *
npap2309 0:a18188c7a4ee 84 * Parameters:
npap2309 0:a18188c7a4ee 85 * BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME, params->advertisingDataLen,
npap2309 0:a18188c7a4ee 86 * (uint8_t *)params->advertisingData, &len, adv_name : Parameters the adverising device sends
npap2309 0:a18188c7a4ee 87 * and the scan retrieves
npap2309 0:a18188c7a4ee 88 *
npap2309 0:a18188c7a4ee 89 * Return:
npap2309 0:a18188c7a4ee 90 * NRF Succes or not
npap2309 0:a18188c7a4ee 91 *
npap2309 0:a18188c7a4ee 92 ************************************************************************************/
npap2309 0:a18188c7a4ee 93 int ble_advdata_decode(uint8_t type, uint8_t advdata_len, uint8_t *p_advdata, uint8_t *len, uint8_t *p_field_data){
npap2309 0:a18188c7a4ee 94
npap2309 0:a18188c7a4ee 95 uint8_t index=0;
npap2309 0:a18188c7a4ee 96 uint8_t field_length, field_type;
npap2309 0:a18188c7a4ee 97
npap2309 0:a18188c7a4ee 98 while(index<advdata_len){
npap2309 0:a18188c7a4ee 99 field_length = p_advdata[index];
npap2309 0:a18188c7a4ee 100 field_type = p_advdata[index+1];
npap2309 0:a18188c7a4ee 101 if(field_type == type){
npap2309 0:a18188c7a4ee 102 memcpy(p_field_data, &p_advdata[index+2], (field_length-1));
npap2309 0:a18188c7a4ee 103 *len = field_length - 1;
npap2309 0:a18188c7a4ee 104 return 1;
npap2309 0:a18188c7a4ee 105 }
npap2309 0:a18188c7a4ee 106 index += field_length + 1;
npap2309 0:a18188c7a4ee 107 }
npap2309 0:a18188c7a4ee 108 return 0;
npap2309 0:a18188c7a4ee 109 }
npap2309 0:a18188c7a4ee 110 /*************************************************************************************
npap2309 0:a18188c7a4ee 111 *Function Name: scanCallBack
npap2309 0:a18188c7a4ee 112 **************************************************************************************
npap2309 0:a18188c7a4ee 113 * Summary: Start scan for a device. When a spesific device defined by a certain name
npap2309 0:a18188c7a4ee 114 * is scanned, the device changes from Central to Peripheral.
npap2309 0:a18188c7a4ee 115 *
npap2309 0:a18188c7a4ee 116 *
npap2309 0:a18188c7a4ee 117 * Parameters:
npap2309 0:a18188c7a4ee 118 * Gap::AdvertisementCallbackParams_t *params: The Params returned by the scan. The
npap2309 0:a18188c7a4ee 119 * Params are the ones the peripheral device advertises.
npap2309 0:a18188c7a4ee 120 *
npap2309 0:a18188c7a4ee 121 * Return:
npap2309 0:a18188c7a4ee 122 * None
npap2309 0:a18188c7a4ee 123 *
npap2309 0:a18188c7a4ee 124 ************************************************************************************/
npap2309 0:a18188c7a4ee 125 static void scanCallBack(const Gap::AdvertisementCallbackParams_t *params){
npap2309 0:a18188c7a4ee 126
npap2309 0:a18188c7a4ee 127 uint8_t len;
npap2309 0:a18188c7a4ee 128 uint8_t adv_name[31];
npap2309 0:a18188c7a4ee 129 // pc.printf("packetscanned\n");
npap2309 0:a18188c7a4ee 130 if( 1 == ble_advdata_decode(0x09, params->advertisingDataLen, (uint8_t *)params->advertisingData, &len, adv_name) ){
npap2309 0:a18188c7a4ee 131 // pc.printf("stage1\n");
npap2309 0:a18188c7a4ee 132 //pc.printf("%x",&adv_name,"\n");
npap2309 0:a18188c7a4ee 133 if (memcmp(TAG_ADDRESS, adv_name, len) == 0x00){
npap2309 0:a18188c7a4ee 134 ble.stopScan();
npap2309 0:a18188c7a4ee 135 stealthModeActive=0;
npap2309 0:a18188c7a4ee 136 beaconInit();
npap2309 0:a18188c7a4ee 137 // pc.printf("activation\n");
npap2309 0:a18188c7a4ee 138 }
npap2309 0:a18188c7a4ee 139 }
npap2309 0:a18188c7a4ee 140 }
npap2309 0:a18188c7a4ee 141 /*************************************************************************************
npap2309 0:a18188c7a4ee 142 *Function Name: stealthModeInit
npap2309 0:a18188c7a4ee 143 **************************************************************************************
npap2309 0:a18188c7a4ee 144 * Summary: Initiate central profile
npap2309 0:a18188c7a4ee 145 *
npap2309 0:a18188c7a4ee 146 *
npap2309 0:a18188c7a4ee 147 * Parameters:
npap2309 0:a18188c7a4ee 148 * None
npap2309 0:a18188c7a4ee 149 *
npap2309 0:a18188c7a4ee 150 * Return:
npap2309 0:a18188c7a4ee 151 * None
npap2309 0:a18188c7a4ee 152 *
npap2309 0:a18188c7a4ee 153 ************************************************************************************/
npap2309 0:a18188c7a4ee 154 void stealthModeInit(void){
npap2309 0:a18188c7a4ee 155 ble.gap().startScan(scanCallBack);
npap2309 0:a18188c7a4ee 156 pc.printf("stealthmode\n");
npap2309 0:a18188c7a4ee 157 }
npap2309 0:a18188c7a4ee 158
npap2309 0:a18188c7a4ee 159
npap2309 0:a18188c7a4ee 160
npap2309 0:a18188c7a4ee 161 /**************************************************************************************
npap2309 0:a18188c7a4ee 162 *Function Name: writtenHandle *
npap2309 0:a18188c7a4ee 163 ***************************************************************************************
npap2309 0:a18188c7a4ee 164 * Summary: GATT call back handle. When a write service is offered by the device this *
npap2309 0:a18188c7a4ee 165 * function handles the data the client sends. *
npap2309 0:a18188c7a4ee 166 * *
npap2309 0:a18188c7a4ee 167 * *
npap2309 0:a18188c7a4ee 168 * Parameters: *
npap2309 0:a18188c7a4ee 169 * GattWriteCallbackParams *Handler: The Params returned by a write action of the *
npap2309 0:a18188c7a4ee 170 * client. *
npap2309 0:a18188c7a4ee 171 * *
npap2309 0:a18188c7a4ee 172 * Return: *
npap2309 0:a18188c7a4ee 173 * None *
npap2309 0:a18188c7a4ee 174 * *
npap2309 0:a18188c7a4ee 175 **************************************************************************************/
npap2309 0:a18188c7a4ee 176 void gattServerWriteCallBack(const GattWriteCallbackParams *Handler) {
npap2309 0:a18188c7a4ee 177 uint8_t index;
npap2309 0:a18188c7a4ee 178 uint8_t buf[TXRX_BUF_LEN];
npap2309 0:a18188c7a4ee 179 uint16_t bytesRead;
npap2309 0:a18188c7a4ee 180 int code;
npap2309 0:a18188c7a4ee 181 /*if (Handler->handle == cityRiskCharacteristic.getValueAttribute().getHandle()){
npap2309 0:a18188c7a4ee 182
npap2309 0:a18188c7a4ee 183 }*/
npap2309 0:a18188c7a4ee 184 pc.printf("writecallback\n");
npap2309 0:a18188c7a4ee 185 ble.readCharacteristicValue(cityRiskCharacteristic.getValueAttribute().getHandle(), buf, &bytesRead);
npap2309 0:a18188c7a4ee 186 /*for( index=0; index<bytesRead; index++){
npap2309 0:a18188c7a4ee 187 code=buf[index];
npap2309 0:a18188c7a4ee 188 pc.printf(code,"\n");
npap2309 0:a18188c7a4ee 189 }*/
npap2309 0:a18188c7a4ee 190 code=Handler->data[0];
npap2309 0:a18188c7a4ee 191 // pc.printf("%d",code,"\n");
npap2309 0:a18188c7a4ee 192
npap2309 0:a18188c7a4ee 193 if (code==password){
npap2309 0:a18188c7a4ee 194 stealthModeActive=1;
npap2309 0:a18188c7a4ee 195 // pc.printf("Success\n");
npap2309 0:a18188c7a4ee 196 }
npap2309 0:a18188c7a4ee 197
npap2309 0:a18188c7a4ee 198 //ble.disconnect(Gap::LOCAL_HOST_TERMINATED_CONNECTION);
npap2309 0:a18188c7a4ee 199 }
npap2309 0:a18188c7a4ee 200
npap2309 0:a18188c7a4ee 201 /*************************************************************************************
npap2309 0:a18188c7a4ee 202 *Function Name: disconnectionCallBack
npap2309 0:a18188c7a4ee 203 **************************************************************************************
npap2309 0:a18188c7a4ee 204 * Summary: Function is called when our device disconnects from another device
npap2309 0:a18188c7a4ee 205 *
npap2309 0:a18188c7a4ee 206 *
npap2309 0:a18188c7a4ee 207 * Parameters:
npap2309 0:a18188c7a4ee 208 * Gap::Handle_t handle, Gap::DisconnectionReason_t reason
npap2309 0:a18188c7a4ee 209 *
npap2309 0:a18188c7a4ee 210 * Return:
npap2309 0:a18188c7a4ee 211 * None
npap2309 0:a18188c7a4ee 212 *
npap2309 0:a18188c7a4ee 213 ************************************************************************************/
npap2309 0:a18188c7a4ee 214 void disconnectionCallBack(const Gap::DisconnectionCallbackParams_t *params)
npap2309 0:a18188c7a4ee 215 {
npap2309 0:a18188c7a4ee 216 // pc.printf("disconnect\n");
npap2309 0:a18188c7a4ee 217 if (stealthModeActive==0){
npap2309 0:a18188c7a4ee 218 beaconInit();
npap2309 0:a18188c7a4ee 219 }
npap2309 0:a18188c7a4ee 220 else{
npap2309 0:a18188c7a4ee 221 stealthModeInit();
npap2309 0:a18188c7a4ee 222 }
npap2309 0:a18188c7a4ee 223 }
npap2309 0:a18188c7a4ee 224
npap2309 0:a18188c7a4ee 225 /*************************************************************************************
npap2309 0:a18188c7a4ee 226 *Function Name: ConnectionCallBack
npap2309 0:a18188c7a4ee 227 **************************************************************************************
npap2309 0:a18188c7a4ee 228 * Summary: Function is called when our device connects to another device
npap2309 0:a18188c7a4ee 229 *
npap2309 0:a18188c7a4ee 230 *
npap2309 0:a18188c7a4ee 231 * Parameters:
npap2309 0:a18188c7a4ee 232 * Gap::ConnectionCallbackParams_t
npap2309 0:a18188c7a4ee 233 *
npap2309 0:a18188c7a4ee 234 * Return:
npap2309 0:a18188c7a4ee 235 * None
npap2309 0:a18188c7a4ee 236 *
npap2309 0:a18188c7a4ee 237 ************************************************************************************/
npap2309 0:a18188c7a4ee 238 void connectionCallBack( const Gap::ConnectionCallbackParams_t *params ){
npap2309 0:a18188c7a4ee 239 // pc.printf("Connected\n");
npap2309 0:a18188c7a4ee 240 timeout.attach(autodisconnect, 3);
npap2309 0:a18188c7a4ee 241 //disconnection time out after 3 sec central device is get disconnected!
npap2309 0:a18188c7a4ee 242 }
npap2309 0:a18188c7a4ee 243 /*************************************************************************************
npap2309 0:a18188c7a4ee 244 *Function Name: setup
npap2309 0:a18188c7a4ee 245 **************************************************************************************
npap2309 0:a18188c7a4ee 246 * Summary: Basic setup for the SoC. Setup for central/peripheral roles
npap2309 0:a18188c7a4ee 247 *
npap2309 0:a18188c7a4ee 248 *
npap2309 0:a18188c7a4ee 249 * Parameters:
npap2309 0:a18188c7a4ee 250 * None
npap2309 0:a18188c7a4ee 251 *
npap2309 0:a18188c7a4ee 252 * Return:
npap2309 0:a18188c7a4ee 253 * None
npap2309 0:a18188c7a4ee 254 *
npap2309 0:a18188c7a4ee 255 ************************************************************************************/
npap2309 0:a18188c7a4ee 256 int main(void)
npap2309 0:a18188c7a4ee 257 {
npap2309 0:a18188c7a4ee 258 ble.init();
npap2309 0:a18188c7a4ee 259 ble.onConnection(connectionCallBack);
npap2309 0:a18188c7a4ee 260 ble.onDisconnection(disconnectionCallBack);
npap2309 0:a18188c7a4ee 261 ble.onDataWritten(gattServerWriteCallBack);
npap2309 0:a18188c7a4ee 262 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
npap2309 0:a18188c7a4ee 263 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME,
npap2309 0:a18188c7a4ee 264 (const uint8_t *)"Beacon02", sizeof("Beacon02") - 1);
npap2309 0:a18188c7a4ee 265 //change here complete local name
npap2309 0:a18188c7a4ee 266 // ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,(const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid_rev));
npap2309 0:a18188c7a4ee 267 // to check the operation commenting uart_base_uuid_rev
npap2309 0:a18188c7a4ee 268 // set adv_type
npap2309 0:a18188c7a4ee 269 //ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::DEVICE_ID);
npap2309 0:a18188c7a4ee 270 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
npap2309 0:a18188c7a4ee 271 // add service
npap2309 0:a18188c7a4ee 272 ble.addService(cityRiskService);
npap2309 0:a18188c7a4ee 273 ble.gap().setDeviceName((const uint8_t *)"Beacon02");
npap2309 0:a18188c7a4ee 274 // set tx power,valid values are -40, -20, -16, -12, -8, -4, 0, 4
npap2309 0:a18188c7a4ee 275 ble.gap().setTxPower(0);
npap2309 0:a18188c7a4ee 276 // set adv_interval, in ms
npap2309 0:a18188c7a4ee 277 ble.gap().setAdvertisingInterval(100);
npap2309 0:a18188c7a4ee 278 // set adv_timeout, in seconds
npap2309 0:a18188c7a4ee 279 ble.gap().setAdvertisingTimeout(0);
npap2309 0:a18188c7a4ee 280 ble.gap().setScanParams(1000,100,0,false);
npap2309 0:a18188c7a4ee 281 beaconInit();
npap2309 0:a18188c7a4ee 282 pc.printf("start\n");
npap2309 0:a18188c7a4ee 283 while (1){
npap2309 0:a18188c7a4ee 284 ble.waitForEvent();
npap2309 0:a18188c7a4ee 285 }
npap2309 0:a18188c7a4ee 286 }