fds
Dependencies: BLE_API mbed nRF51822
main.cpp
- Committer:
- npap2309
- Date:
- 2017-10-06
- Revision:
- 0:a18188c7a4ee
File content as of revision 0:a18188c7a4ee:
#include "ble/BLE.h" #include "mbed.h" BLE ble; Timeout timeout; #define TXRX_BUF_LEN 20 Serial pc(USBTX, USBRX); //**********TAG Personalization*********************** //**************************************************** char TAG_ADDRESS[]="D2:FB:BE:68:EF:5A"; //char TAG_ADDRESS[]="EE:04:D4:1A:9C:16"; //char TAG_ADDRESS[]="F6:99:64:A9:FD:6D"; //char TAG_ADDRESS[]="D6:F7:8B:78:5D:BD"; //char TAG_ADDRESS[]="D7:8F:65:5C:A0:B9"; int password=135; //**************************************************** int stealthModeActive=0; uint8_t chars_value[TXRX_BUF_LEN] = {0,}; // The Nordic UART Service static const uint8_t cityRiskServiceUuid[] = {0x71, 0x3D, 0, 0, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E}; static const uint8_t cityRiskCharacteristcUuid[] = {0x71, 0x3D, 0, 2, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E}; static const uint8_t uart_base_uuid_rev[] = {0x1E, 0x94, 0x8D, 0xF1, 0x48, 0x31, 0x94, 0xBA, 0x75, 0x4C, 0x3E, 0x50, 0, 0, 0x3D, 0x71}; GattCharacteristic cityRiskCharacteristic(cityRiskCharacteristcUuid, chars_value, 3, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE); GattCharacteristic *cityRiskChars[] = {&cityRiskCharacteristic}; GattService cityRiskService(cityRiskServiceUuid, cityRiskChars, sizeof(cityRiskChars) / sizeof(GattCharacteristic *)); //static void scanCallBack(const Gap::AdvertisementCallbackParams_t *params); /************************************************************************************* *Function Name: autodisconnect ************************************************************************************** * Summary: Function is called to disconnect automatically * * * Parameters: * None * * Return: * None * ************************************************************************************/ void autodisconnect(){ if (ble.getGapState().connected){ ble.gap().disconnect(Gap::LOCAL_HOST_TERMINATED_CONNECTION); // pc.printf("Autodisconnect\n"); } } /************************************************************************************* *Function Name: beaconInit ************************************************************************************** * Summary: Setup peripheral profile * * * Parameters: * None * * Return: * None * ************************************************************************************/ void beaconInit (void){ ble.gap().startAdvertising(); // pc.printf("beacon Init\n"); } /************************************************************************************* *Function Name: ble_advdata_decode ************************************************************************************** * Summary: Used by the scan call back function to declare a successful scan. * * * Parameters: * BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME, params->advertisingDataLen, * (uint8_t *)params->advertisingData, &len, adv_name : Parameters the adverising device sends * and the scan retrieves * * Return: * NRF Succes or not * ************************************************************************************/ int ble_advdata_decode(uint8_t type, uint8_t advdata_len, uint8_t *p_advdata, uint8_t *len, uint8_t *p_field_data){ uint8_t index=0; uint8_t field_length, field_type; while(index<advdata_len){ field_length = p_advdata[index]; field_type = p_advdata[index+1]; if(field_type == type){ memcpy(p_field_data, &p_advdata[index+2], (field_length-1)); *len = field_length - 1; return 1; } index += field_length + 1; } return 0; } /************************************************************************************* *Function Name: scanCallBack ************************************************************************************** * Summary: Start scan for a device. When a spesific device defined by a certain name * is scanned, the device changes from Central to Peripheral. * * * Parameters: * Gap::AdvertisementCallbackParams_t *params: The Params returned by the scan. The * Params are the ones the peripheral device advertises. * * Return: * None * ************************************************************************************/ static void scanCallBack(const Gap::AdvertisementCallbackParams_t *params){ uint8_t len; uint8_t adv_name[31]; // pc.printf("packetscanned\n"); if( 1 == ble_advdata_decode(0x09, params->advertisingDataLen, (uint8_t *)params->advertisingData, &len, adv_name) ){ // pc.printf("stage1\n"); //pc.printf("%x",&adv_name,"\n"); if (memcmp(TAG_ADDRESS, adv_name, len) == 0x00){ ble.stopScan(); stealthModeActive=0; beaconInit(); // pc.printf("activation\n"); } } } /************************************************************************************* *Function Name: stealthModeInit ************************************************************************************** * Summary: Initiate central profile * * * Parameters: * None * * Return: * None * ************************************************************************************/ void stealthModeInit(void){ ble.gap().startScan(scanCallBack); pc.printf("stealthmode\n"); } /************************************************************************************** *Function Name: writtenHandle * *************************************************************************************** * Summary: GATT call back handle. When a write service is offered by the device this * * function handles the data the client sends. * * * * * * Parameters: * * GattWriteCallbackParams *Handler: The Params returned by a write action of the * * client. * * * * Return: * * None * * * **************************************************************************************/ void gattServerWriteCallBack(const GattWriteCallbackParams *Handler) { uint8_t index; uint8_t buf[TXRX_BUF_LEN]; uint16_t bytesRead; int code; /*if (Handler->handle == cityRiskCharacteristic.getValueAttribute().getHandle()){ }*/ pc.printf("writecallback\n"); ble.readCharacteristicValue(cityRiskCharacteristic.getValueAttribute().getHandle(), buf, &bytesRead); /*for( index=0; index<bytesRead; index++){ code=buf[index]; pc.printf(code,"\n"); }*/ code=Handler->data[0]; // pc.printf("%d",code,"\n"); if (code==password){ stealthModeActive=1; // pc.printf("Success\n"); } //ble.disconnect(Gap::LOCAL_HOST_TERMINATED_CONNECTION); } /************************************************************************************* *Function Name: disconnectionCallBack ************************************************************************************** * Summary: Function is called when our device disconnects from another device * * * Parameters: * Gap::Handle_t handle, Gap::DisconnectionReason_t reason * * Return: * None * ************************************************************************************/ void disconnectionCallBack(const Gap::DisconnectionCallbackParams_t *params) { // pc.printf("disconnect\n"); if (stealthModeActive==0){ beaconInit(); } else{ stealthModeInit(); } } /************************************************************************************* *Function Name: ConnectionCallBack ************************************************************************************** * Summary: Function is called when our device connects to another device * * * Parameters: * Gap::ConnectionCallbackParams_t * * Return: * None * ************************************************************************************/ void connectionCallBack( const Gap::ConnectionCallbackParams_t *params ){ // pc.printf("Connected\n"); timeout.attach(autodisconnect, 3); //disconnection time out after 3 sec central device is get disconnected! } /************************************************************************************* *Function Name: setup ************************************************************************************** * Summary: Basic setup for the SoC. Setup for central/peripheral roles * * * Parameters: * None * * Return: * None * ************************************************************************************/ int main(void) { ble.init(); ble.onConnection(connectionCallBack); ble.onDisconnection(disconnectionCallBack); ble.onDataWritten(gattServerWriteCallBack); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (const uint8_t *)"Beacon02", sizeof("Beacon02") - 1); //change here complete local name // ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,(const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid_rev)); // to check the operation commenting uart_base_uuid_rev // set adv_type //ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::DEVICE_ID); ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); // add service ble.addService(cityRiskService); ble.gap().setDeviceName((const uint8_t *)"Beacon02"); // set tx power,valid values are -40, -20, -16, -12, -8, -4, 0, 4 ble.gap().setTxPower(0); // set adv_interval, in ms ble.gap().setAdvertisingInterval(100); // set adv_timeout, in seconds ble.gap().setAdvertisingTimeout(0); ble.gap().setScanParams(1000,100,0,false); beaconInit(); pc.printf("start\n"); while (1){ ble.waitForEvent(); } }