Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 /* mbed Microcontroller Library 00002 * Copyright (c) 2006-2015 ARM Limited 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00017 #include <events/mbed_events.h> 00018 #include <mbed.h> 00019 #include "ble/BLE.h" 00020 #include "ble/DiscoveredCharacteristic.h" 00021 #include "ble/DiscoveredService.h" 00022 00023 DigitalOut alivenessLED(LED1, 1); 00024 static DiscoveredCharacteristic ledCharacteristic; 00025 static bool triggerLedCharacteristic; 00026 static const char PEER_NAME[] = "LED_BP"; 00027 static uint8_t toggledValue = 0; 00028 InterruptIn button(USER_BUTTON); 00029 00030 static EventQueue eventQueue(/* event count */ 16 * EVENTS_EVENT_SIZE); 00031 00032 void periodicCallback(void) { 00033 alivenessLED = !alivenessLED; /* Do blinky on LED1 while we're waiting for BLE events */ 00034 00035 } 00036 00037 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) { 00038 // parse the advertising payload, looking for data type COMPLETE_LOCAL_NAME 00039 // The advertising payload is a collection of key/value records where 00040 // byte 0: length of the record excluding this byte 00041 // byte 1: The key, it is the type of the data 00042 // byte [2..N] The value. N is equal to byte0 - 1 00043 for (uint8_t i = 0; i < params->advertisingDataLen; ++i) { 00044 00045 const uint8_t record_length = params->advertisingData[i]; 00046 if (record_length == 0) { 00047 continue; 00048 } 00049 const uint8_t type = params->advertisingData[i + 1]; 00050 const uint8_t* value = params->advertisingData + i + 2; 00051 const uint8_t value_length = record_length - 1; 00052 00053 if(type == GapAdvertisingData::COMPLETE_LOCAL_NAME) { 00054 if ((value_length == sizeof(PEER_NAME)) && (memcmp(value, PEER_NAME, value_length) == 0)) { 00055 printf( 00056 "adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n", 00057 params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], 00058 params->peerAddr[1], params->peerAddr[0], params->rssi, params->isScanResponse, params->type 00059 ); 00060 BLE::Instance().gap().connect(params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, NULL, NULL); 00061 break; 00062 } 00063 } 00064 i += record_length; 00065 } 00066 } 00067 00068 void serviceDiscoveryCallback(const DiscoveredService *service) { 00069 if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) { 00070 printf("S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle()); 00071 } else { 00072 printf("S UUID-"); 00073 const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID(); 00074 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) { 00075 printf("%02x", longUUIDBytes[i]); 00076 } 00077 printf(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle()); 00078 } 00079 } 00080 00081 void updateLedCharacteristic(void) { 00082 if (!BLE::Instance().gattClient().isServiceDiscoveryActive()) { 00083 ledCharacteristic.read(); 00084 } 00085 } 00086 00087 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) { 00088 printf(" C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getUUID().getShortUUID(), characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast()); 00089 if (characteristicP->getUUID().getShortUUID() == 0xa001) { /* !ALERT! Alter this filter to suit your device. */ 00090 ledCharacteristic = *characteristicP; 00091 triggerLedCharacteristic = true; 00092 } 00093 } 00094 00095 void discoveryTerminationCallback(Gap::Handle_t connectionHandle) { 00096 printf("terminated SD for handle %u\r\n", connectionHandle); 00097 if (triggerLedCharacteristic) { 00098 triggerLedCharacteristic = false; 00099 eventQueue.call(updateLedCharacteristic); 00100 } 00101 } 00102 00103 void connectionCallback(const Gap::ConnectionCallbackParams_t *params) { 00104 if (params->role == Gap::CENTRAL) { 00105 BLE &ble = BLE::Instance(); 00106 ble.gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback); 00107 ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, 0xa000, 0xa001); 00108 } 00109 } 00110 00111 void triggerToggledWrite(const GattReadCallbackParams *response) { 00112 if (response->handle == ledCharacteristic.getValueHandle()) { 00113 printf("triggerToggledWrite: handle %u, offset %u, len %u\r\n", response->handle, response->offset, response->len); 00114 for (unsigned index = 0; index < response->len; index++) { 00115 printf("%c[%02x]", response->data[index], response->data[index]); 00116 } 00117 printf("\r\n"); 00118 ledCharacteristic.write(1, &toggledValue); 00119 } 00120 } 00121 00122 void triggerRead(const GattWriteCallbackParams *response) { 00123 if (response->handle == ledCharacteristic.getValueHandle()) { 00124 ledCharacteristic.read(); 00125 } 00126 } 00127 00128 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *) { 00129 printf("disconnected\r\n"); 00130 /* Start scanning and try to connect again */ 00131 BLE::Instance().gap().startScan(advertisementCallback); 00132 } 00133 00134 void onBleInitError(BLE &ble, ble_error_t error) 00135 { 00136 /* Initialization error handling should go here */ 00137 } 00138 00139 void printMacAddress() 00140 { 00141 /* Print out device MAC address to the console*/ 00142 Gap::AddressType_t addr_type; 00143 Gap::Address_t address; 00144 BLE::Instance().gap().getAddress(&addr_type, address); 00145 printf("DEVICE MAC ADDRESS: "); 00146 for (int i = 5; i >= 1; i--){ 00147 printf("%02x:", address[i]); 00148 } 00149 printf("%02x\r\n", address[0]); 00150 } 00151 00152 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) 00153 { 00154 BLE& ble = params->ble; 00155 ble_error_t error = params->error; 00156 00157 if (error != BLE_ERROR_NONE) { 00158 /* In case of error, forward the error handling to onBleInitError */ 00159 onBleInitError(ble, error); 00160 return; 00161 } 00162 00163 /* Ensure that it is the default instance of BLE */ 00164 if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { 00165 return; 00166 } 00167 00168 ble.gap().onDisconnection(disconnectionCallback); 00169 ble.gap().onConnection(connectionCallback); 00170 00171 ble.gattClient().onDataRead(triggerToggledWrite); 00172 ble.gattClient().onDataWrite(triggerRead); 00173 00174 // scan interval: 400ms and scan window: 400ms. 00175 // Every 400ms the device will scan for 400ms 00176 // This means that the device will scan continuously. 00177 ble.gap().setScanParams(400, 400); 00178 ble.gap().startScan(advertisementCallback); 00179 00180 printMacAddress(); 00181 } 00182 00183 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) { 00184 BLE &ble = BLE::Instance(); 00185 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents)); 00186 } 00187 00188 void riseHandlerIterruptContext(void) { 00189 toggledValue = 0; 00190 } 00191 00192 void fallHandlerIterruptContext(void) { 00193 toggledValue = 1; 00194 } 00195 00196 int main() 00197 { 00198 00199 triggerLedCharacteristic = false; 00200 eventQueue.call_every(500, periodicCallback); 00201 00202 BLE &ble = BLE::Instance(); 00203 ble.onEventsToProcess(scheduleBleEventsProcessing); 00204 ble.init(bleInitComplete); 00205 button.rise(riseHandlerIterruptContext); 00206 button.fall(fallHandlerIterruptContext); 00207 00208 eventQueue.dispatch_forever(); 00209 00210 // ciaone 00211 00212 return 0; 00213 }
Generated on Wed Jul 13 2022 10:17:05 by
1.7.2