![](/media/cache/profiles/profile2.jpg.50x50_q85.jpg)
This software setup a central node of a star topology network
Dependencies: MQTT target_st_bluenrg
Fork of ble-star-mbed by
source/main.cpp@3:3f35e80ed848, 2018-03-13 (annotated)
- Committer:
- lorevee
- Date:
- Tue Mar 13 16:31:07 2018 +0000
- Revision:
- 3:3f35e80ed848
- Parent:
- 1:110b5e896bc9
- Child:
- 4:4af40af2530e
Bug fixing 1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lorevee | 0:1902469bdd2d | 1 | /* mbed Microcontroller Library |
lorevee | 0:1902469bdd2d | 2 | * Copyright (c) 2006-2015 ARM Limited |
lorevee | 0:1902469bdd2d | 3 | * |
lorevee | 0:1902469bdd2d | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
lorevee | 0:1902469bdd2d | 5 | * you may not use this file except in compliance with the License. |
lorevee | 0:1902469bdd2d | 6 | * You may obtain a copy of the License at |
lorevee | 0:1902469bdd2d | 7 | * |
lorevee | 0:1902469bdd2d | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
lorevee | 0:1902469bdd2d | 9 | * |
lorevee | 0:1902469bdd2d | 10 | * Unless required by applicable law or agreed to in writing, software |
lorevee | 0:1902469bdd2d | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
lorevee | 0:1902469bdd2d | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
lorevee | 0:1902469bdd2d | 13 | * See the License for the specific language governing permissions and |
lorevee | 0:1902469bdd2d | 14 | * limitations under the License. |
lorevee | 0:1902469bdd2d | 15 | */ |
lorevee | 0:1902469bdd2d | 16 | |
lorevee | 0:1902469bdd2d | 17 | #include <events/mbed_events.h> |
lorevee | 0:1902469bdd2d | 18 | #include <mbed.h> |
lorevee | 0:1902469bdd2d | 19 | #include "ble/BLE.h" |
lorevee | 0:1902469bdd2d | 20 | #include "ble/DiscoveredCharacteristic.h" |
lorevee | 0:1902469bdd2d | 21 | #include "ble/DiscoveredService.h" |
lorevee | 0:1902469bdd2d | 22 | #include <UUID.h> |
lorevee | 0:1902469bdd2d | 23 | #include <BleMasterService.h> |
lorevee | 0:1902469bdd2d | 24 | #include <BleSlaveService.h> |
lorevee | 0:1902469bdd2d | 25 | |
lorevee | 0:1902469bdd2d | 26 | const char NAME_BLESTAR1[] = "BleStar1"; |
lorevee | 0:1902469bdd2d | 27 | |
lorevee | 0:1902469bdd2d | 28 | /*----------------------------------------------------------------------------*/ |
lorevee | 0:1902469bdd2d | 29 | |
lorevee | 0:1902469bdd2d | 30 | |
lorevee | 0:1902469bdd2d | 31 | |
lorevee | 0:1902469bdd2d | 32 | |
lorevee | 0:1902469bdd2d | 33 | /* scheduleBleEventsProcessing */ |
lorevee | 0:1902469bdd2d | 34 | void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) { |
lorevee | 0:1902469bdd2d | 35 | BLE &ble = BLE::Instance(); |
lorevee | 0:1902469bdd2d | 36 | eventQ.call(Callback<void()>(&ble, &BLE::processEvents)); |
lorevee | 0:1902469bdd2d | 37 | } |
lorevee | 0:1902469bdd2d | 38 | /*----------------------------------------------------------------------------*/ |
lorevee | 0:1902469bdd2d | 39 | /* Complete the initialization of ble module */ |
lorevee | 0:1902469bdd2d | 40 | void bleInitComplete(BLE::InitializationCompleteCallbackContext *params){ |
lorevee | 0:1902469bdd2d | 41 | |
lorevee | 0:1902469bdd2d | 42 | |
lorevee | 0:1902469bdd2d | 43 | initProcess(); |
lorevee | 0:1902469bdd2d | 44 | ble_error_t a0, a1, a2, a3; |
lorevee | 0:1902469bdd2d | 45 | |
lorevee | 0:1902469bdd2d | 46 | BLE& ble = params->ble; |
lorevee | 0:1902469bdd2d | 47 | ble_error_t error = params->error; |
lorevee | 0:1902469bdd2d | 48 | |
lorevee | 0:1902469bdd2d | 49 | if (error != BLE_ERROR_NONE) { |
lorevee | 0:1902469bdd2d | 50 | /* In case of error, forward the error handling to onBleInitError */ |
lorevee | 0:1902469bdd2d | 51 | onBleInitError(ble, error); |
lorevee | 0:1902469bdd2d | 52 | return; |
lorevee | 0:1902469bdd2d | 53 | } |
lorevee | 0:1902469bdd2d | 54 | |
lorevee | 0:1902469bdd2d | 55 | |
lorevee | 0:1902469bdd2d | 56 | |
lorevee | 0:1902469bdd2d | 57 | /* Ensure that it is the default instance of BLE */ |
lorevee | 0:1902469bdd2d | 58 | if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { |
lorevee | 0:1902469bdd2d | 59 | return; |
lorevee | 0:1902469bdd2d | 60 | } |
lorevee | 0:1902469bdd2d | 61 | |
lorevee | 0:1902469bdd2d | 62 | printf("\r\nBLE Init Completed\n"); |
lorevee | 0:1902469bdd2d | 63 | |
lorevee | 0:1902469bdd2d | 64 | |
lorevee | 0:1902469bdd2d | 65 | /* notification */ |
lorevee | 0:1902469bdd2d | 66 | //ble.gattServer().onUpdatesEnabled(onUpdatesEnabledCallback); |
lorevee | 0:1902469bdd2d | 67 | //ble.gattServer().onUpdatesDisabled(onUpdatesDisabledCallback); |
lorevee | 0:1902469bdd2d | 68 | |
lorevee | 0:1902469bdd2d | 69 | /* notification + attr writing */ |
lorevee | 0:1902469bdd2d | 70 | ble.gattServer().onDataWritten(AttributeModified_CB); |
lorevee | 0:1902469bdd2d | 71 | /* data read */ |
lorevee | 0:1902469bdd2d | 72 | ble.gattClient().onDataRead(readCharacteristicCallback); |
lorevee | 0:1902469bdd2d | 73 | /* when a peripheral node characteristics change */ |
lorevee | 0:1902469bdd2d | 74 | ble.gattClient().onHVX(onNotificationCallback); |
lorevee | 0:1902469bdd2d | 75 | /* when a peripheral descriptor is written */ |
lorevee | 0:1902469bdd2d | 76 | ble.gattClient().onDataWritten(perDescriptorWrittenCallback); |
lorevee | 0:1902469bdd2d | 77 | |
lorevee | 0:1902469bdd2d | 78 | |
lorevee | 0:1902469bdd2d | 79 | /* disconnection */ |
lorevee | 0:1902469bdd2d | 80 | ble.gap().onDisconnection(disconnectionCallback); |
lorevee | 0:1902469bdd2d | 81 | /* connection */ |
lorevee | 0:1902469bdd2d | 82 | ble.gap().onConnection(connectionCallback); |
lorevee | 3:3f35e80ed848 | 83 | ble.gap().setScanParams(400, 200); //(scanInterval,scanWindow)ms |
lorevee | 1:110b5e896bc9 | 84 | ble.gap().setScanTimeout(0x0004); //stop scanning after N sec |
lorevee | 0:1902469bdd2d | 85 | ble.gap().onTimeout(onStopScan); //callback when scan stops |
lorevee | 0:1902469bdd2d | 86 | |
lorevee | 0:1902469bdd2d | 87 | |
lorevee | 0:1902469bdd2d | 88 | |
lorevee | 0:1902469bdd2d | 89 | |
lorevee | 0:1902469bdd2d | 90 | /* Setup adv */ |
lorevee | 0:1902469bdd2d | 91 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
lorevee | 0:1902469bdd2d | 92 | a0 = ble.gap().accumulateScanResponse(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, manuf_data, sizeof(manuf_data)); |
lorevee | 0:1902469bdd2d | 93 | a1 = ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::UNKNOWN); |
lorevee | 0:1902469bdd2d | 94 | a2 = ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)NAME_BLESTAR1, sizeof(NAME_BLESTAR1)); |
lorevee | 0:1902469bdd2d | 95 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); //Advertising_Event_Type |
lorevee | 0:1902469bdd2d | 96 | ble.gap().setAdvertisingInterval(1000); //Adv_Interval |
lorevee | 0:1902469bdd2d | 97 | a3 = ble.gap().setAdvertisingPolicyMode(Gap::ADV_POLICY_IGNORE_WHITELIST); //Adv_Filter_Policy |
lorevee | 0:1902469bdd2d | 98 | if ((a0 != BLE_ERROR_NONE) || (a1 != BLE_ERROR_NONE) || (a2 != BLE_ERROR_NONE) || (a3 != BLE_ERROR_NONE)){ |
lorevee | 0:1902469bdd2d | 99 | printf("\r\nError setup ADV\n"); |
lorevee | 0:1902469bdd2d | 100 | } |
lorevee | 0:1902469bdd2d | 101 | |
lorevee | 0:1902469bdd2d | 102 | |
lorevee | 0:1902469bdd2d | 103 | addAllServices(); |
lorevee | 0:1902469bdd2d | 104 | printMacAddress(); |
lorevee | 0:1902469bdd2d | 105 | |
lorevee | 0:1902469bdd2d | 106 | |
lorevee | 0:1902469bdd2d | 107 | /* Start connection, service/chars discovery and enable notification */ |
lorevee | 0:1902469bdd2d | 108 | connectionProcess(); |
lorevee | 0:1902469bdd2d | 109 | |
lorevee | 0:1902469bdd2d | 110 | /* Start advertising from this point */ |
lorevee | 0:1902469bdd2d | 111 | //setSlaveDiscoverable();//DEBUG_ONLY |
lorevee | 0:1902469bdd2d | 112 | |
lorevee | 0:1902469bdd2d | 113 | } |
lorevee | 0:1902469bdd2d | 114 | /*----------------------------------------------------------------------------*/ |
lorevee | 0:1902469bdd2d | 115 | |
lorevee | 0:1902469bdd2d | 116 | |
lorevee | 0:1902469bdd2d | 117 | |
lorevee | 0:1902469bdd2d | 118 | void onBleInitError(BLE &ble, ble_error_t error) {} |
lorevee | 0:1902469bdd2d | 119 | /*----------------------------------------------------------------------------*/ |
lorevee | 0:1902469bdd2d | 120 | |
lorevee | 0:1902469bdd2d | 121 | |
lorevee | 0:1902469bdd2d | 122 | |
lorevee | 0:1902469bdd2d | 123 | int main() |
lorevee | 0:1902469bdd2d | 124 | { |
lorevee | 0:1902469bdd2d | 125 | printf("\r\n\n/*******************************************************\n"); |
lorevee | 0:1902469bdd2d | 126 | printf("\r* *\n"); |
lorevee | 0:1902469bdd2d | 127 | printf("\r* FP-NET-BLESTAR1 (MBED) Expansion Software *\n"); |
lorevee | 0:1902469bdd2d | 128 | printf("\r* *\n"); |
lorevee | 0:1902469bdd2d | 129 | printf("\r*******************************************************/\n\n\n"); |
lorevee | 0:1902469bdd2d | 130 | |
lorevee | 0:1902469bdd2d | 131 | /* Create the ble instance */ |
lorevee | 0:1902469bdd2d | 132 | BLE &ble = BLE::Instance(); |
lorevee | 0:1902469bdd2d | 133 | |
lorevee | 0:1902469bdd2d | 134 | ble.onEventsToProcess(scheduleBleEventsProcessing); |
lorevee | 0:1902469bdd2d | 135 | |
lorevee | 0:1902469bdd2d | 136 | /* Uncommenting to debug the status*/ |
lorevee | 0:1902469bdd2d | 137 | //eventQ.call_every(20000, checkStatus); |
lorevee | 0:1902469bdd2d | 138 | |
lorevee | 0:1902469bdd2d | 139 | ble.init(bleInitComplete); |
lorevee | 0:1902469bdd2d | 140 | |
lorevee | 0:1902469bdd2d | 141 | |
lorevee | 0:1902469bdd2d | 142 | //dispatch events |
lorevee | 0:1902469bdd2d | 143 | eventQ.dispatch_forever(); |
lorevee | 0:1902469bdd2d | 144 | |
lorevee | 0:1902469bdd2d | 145 | return 0; |
lorevee | 0:1902469bdd2d | 146 | } |
lorevee | 0:1902469bdd2d | 147 | /*----------------------------------------------------------------------------*/ |
lorevee | 0:1902469bdd2d | 148 | |
lorevee | 0:1902469bdd2d | 149 | |
lorevee | 0:1902469bdd2d | 150 | |
lorevee | 0:1902469bdd2d | 151 | |
lorevee | 0:1902469bdd2d | 152 |