Peripheral_2

Dependencies:   BLE_API mbed nRF51822

Committer:
DDUdui
Date:
Tue Aug 18 07:07:06 2015 +0000
Revision:
0:4d3f585f5b00
Peripheral_2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DDUdui 0:4d3f585f5b00 1 /* mbed Microcontroller Library
DDUdui 0:4d3f585f5b00 2 * Copyright (c) 2006-2015 ARM Limited
DDUdui 0:4d3f585f5b00 3 *
DDUdui 0:4d3f585f5b00 4 * Licensed under the Apache License, Version 2.0 (the "License");
DDUdui 0:4d3f585f5b00 5 * you may not use this file except in compliance with the License.
DDUdui 0:4d3f585f5b00 6 * You may obtain a copy of the License at
DDUdui 0:4d3f585f5b00 7 *
DDUdui 0:4d3f585f5b00 8 * http://www.apache.org/licenses/LICENSE-2.0
DDUdui 0:4d3f585f5b00 9 *
DDUdui 0:4d3f585f5b00 10 * Unless required by applicable law or agreed to in writing, software
DDUdui 0:4d3f585f5b00 11 * distributed under the License is distributed on an "AS IS" BASIS,
DDUdui 0:4d3f585f5b00 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
DDUdui 0:4d3f585f5b00 13 * See the License for the specific language governing permissions and
DDUdui 0:4d3f585f5b00 14 * limitations under the License.
DDUdui 0:4d3f585f5b00 15 */
DDUdui 0:4d3f585f5b00 16
DDUdui 0:4d3f585f5b00 17 #include "mbed.h"
DDUdui 0:4d3f585f5b00 18 #include "ble/BLE.h"
DDUdui 0:4d3f585f5b00 19 #include "ble/DiscoveredCharacteristic.h"
DDUdui 0:4d3f585f5b00 20 #include "ble/DiscoveredService.h"
DDUdui 0:4d3f585f5b00 21 BLE ble;
DDUdui 0:4d3f585f5b00 22 DigitalOut led1(LED1);
DDUdui 0:4d3f585f5b00 23 Serial pc(USBTX, USBRX);
DDUdui 0:4d3f585f5b00 24
DDUdui 0:4d3f585f5b00 25
DDUdui 0:4d3f585f5b00 26 void periodicCallback(void)
DDUdui 0:4d3f585f5b00 27 {
DDUdui 0:4d3f585f5b00 28 led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
DDUdui 0:4d3f585f5b00 29 }
DDUdui 0:4d3f585f5b00 30
DDUdui 0:4d3f585f5b00 31 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) {
DDUdui 0:4d3f585f5b00 32 if (params->peerAddr[0] == 0xcb) { /* !ALERT! Alter this filter to suit your device. */
DDUdui 0:4d3f585f5b00 33 return;
DDUdui 0:4d3f585f5b00 34 }
DDUdui 0:4d3f585f5b00 35 pc.printf("Adv peerAddr: [%02x %02x %02x %02x %02x %02x] rssi %d, ScanResp: %u, AdvType: %u\r\n",
DDUdui 0:4d3f585f5b00 36 params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],
DDUdui 0:4d3f585f5b00 37 params->rssi, params->isScanResponse, params->type);
DDUdui 0:4d3f585f5b00 38
DDUdui 0:4d3f585f5b00 39 for (unsigned index = 0; index < params->advertisingDataLen; index++) {
DDUdui 0:4d3f585f5b00 40 pc.printf("%02x ", params->advertisingData[index]);
DDUdui 0:4d3f585f5b00 41 }
DDUdui 0:4d3f585f5b00 42 pc.printf("\r\n");
DDUdui 0:4d3f585f5b00 43 /* DUMP_ADV_DATA */
DDUdui 0:4d3f585f5b00 44 /*
DDUdui 0:4d3f585f5b00 45 ble.gap().connect(params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, NULL, NULL);
DDUdui 0:4d3f585f5b00 46 */
DDUdui 0:4d3f585f5b00 47 }
DDUdui 0:4d3f585f5b00 48
DDUdui 0:4d3f585f5b00 49 void serviceDiscoveryCallback(const DiscoveredService *service) {
DDUdui 0:4d3f585f5b00 50 if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
DDUdui 0:4d3f585f5b00 51 pc.printf("S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle());
DDUdui 0:4d3f585f5b00 52 } else {
DDUdui 0:4d3f585f5b00 53 printf("S UUID-");
DDUdui 0:4d3f585f5b00 54 const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID();
DDUdui 0:4d3f585f5b00 55 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
DDUdui 0:4d3f585f5b00 56 printf("%02x", longUUIDBytes[i]);
DDUdui 0:4d3f585f5b00 57 }
DDUdui 0:4d3f585f5b00 58 pc.printf(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle());
DDUdui 0:4d3f585f5b00 59 }
DDUdui 0:4d3f585f5b00 60 }
DDUdui 0:4d3f585f5b00 61
DDUdui 0:4d3f585f5b00 62 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) {
DDUdui 0:4d3f585f5b00 63
DDUdui 0:4d3f585f5b00 64 }
DDUdui 0:4d3f585f5b00 65
DDUdui 0:4d3f585f5b00 66 void discoveryTerminationCallback(Gap::Handle_t connectionHandle) {
DDUdui 0:4d3f585f5b00 67 pc.printf("terminated SD for handle %u\r\n", connectionHandle);
DDUdui 0:4d3f585f5b00 68 }
DDUdui 0:4d3f585f5b00 69
DDUdui 0:4d3f585f5b00 70 void connectionCallback(const Gap::ConnectionCallbackParams_t *params) {
DDUdui 0:4d3f585f5b00 71 pc.printf("Connected!!\r\n");
DDUdui 0:4d3f585f5b00 72 ble.stopAdvertising();
DDUdui 0:4d3f585f5b00 73 wait(1);
DDUdui 0:4d3f585f5b00 74 if (params->role == Gap::CENTRAL) {
DDUdui 0:4d3f585f5b00 75 ble.gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback);
DDUdui 0:4d3f585f5b00 76 ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, 0xa000, 0xa001);
DDUdui 0:4d3f585f5b00 77 }
DDUdui 0:4d3f585f5b00 78 ble.gap().disconnect(0,Gap::REMOTE_USER_TERMINATED_CONNECTION);
DDUdui 0:4d3f585f5b00 79 }
DDUdui 0:4d3f585f5b00 80 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
DDUdui 0:4d3f585f5b00 81 {
DDUdui 0:4d3f585f5b00 82 pc.printf("Disconnected\r\n");
DDUdui 0:4d3f585f5b00 83 pc.printf("Rescan\r\n");
DDUdui 0:4d3f585f5b00 84 ble.startScan(advertisementCallback);
DDUdui 0:4d3f585f5b00 85 ble.startAdvertising();
DDUdui 0:4d3f585f5b00 86 }
DDUdui 0:4d3f585f5b00 87
DDUdui 0:4d3f585f5b00 88
DDUdui 0:4d3f585f5b00 89 int main(void)
DDUdui 0:4d3f585f5b00 90 {
DDUdui 0:4d3f585f5b00 91 led1 = 1;
DDUdui 0:4d3f585f5b00 92 Ticker ticker;
DDUdui 0:4d3f585f5b00 93 ticker.attach(periodicCallback, 1);
DDUdui 0:4d3f585f5b00 94 ble.onConnection(connectionCallback);
DDUdui 0:4d3f585f5b00 95 ble.onDisconnection(disconnectionCallback);
DDUdui 0:4d3f585f5b00 96
DDUdui 0:4d3f585f5b00 97 ble.init();
DDUdui 0:4d3f585f5b00 98
DDUdui 0:4d3f585f5b00 99 pc.baud(9600);
DDUdui 0:4d3f585f5b00 100 pc.printf("Observer Init \r\n");
DDUdui 0:4d3f585f5b00 101
DDUdui 0:4d3f585f5b00 102
DDUdui 0:4d3f585f5b00 103 /* */
DDUdui 0:4d3f585f5b00 104 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
DDUdui 0:4d3f585f5b00 105 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
DDUdui 0:4d3f585f5b00 106 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
DDUdui 0:4d3f585f5b00 107 (const uint8_t *)"CHANGMO", sizeof("CHANGMO") - 1);
DDUdui 0:4d3f585f5b00 108
DDUdui 0:4d3f585f5b00 109 ble.gap().setAdvertisingInterval(100); /* 1second. */
DDUdui 0:4d3f585f5b00 110 ble.gap().startAdvertising();
DDUdui 0:4d3f585f5b00 111
DDUdui 0:4d3f585f5b00 112
DDUdui 0:4d3f585f5b00 113
DDUdui 0:4d3f585f5b00 114 while (true) {
DDUdui 0:4d3f585f5b00 115 ble.waitForEvent();
DDUdui 0:4d3f585f5b00 116 }
DDUdui 0:4d3f585f5b00 117 }