動作テスト用
Dependencies: BLE_API mbed nRF51822
main.cpp@0:0a44e398fe09, 2015-07-03 (annotated)
- Committer:
- kyowa_watanabe
- Date:
- Fri Jul 03 00:37:59 2015 +0000
- Revision:
- 0:0a44e398fe09
????; UUID?0x3A01???0.5sec??????????0x00?0xFF???????????;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kyowa_watanabe | 0:0a44e398fe09 | 1 | // ヘッダのインクルード |
kyowa_watanabe | 0:0a44e398fe09 | 2 | #include "mbed.h" |
kyowa_watanabe | 0:0a44e398fe09 | 3 | #include "BLEDevice.h" |
kyowa_watanabe | 0:0a44e398fe09 | 4 | #include "ble_gap.h" |
kyowa_watanabe | 0:0a44e398fe09 | 5 | #include "Gap.h" |
kyowa_watanabe | 0:0a44e398fe09 | 6 | |
kyowa_watanabe | 0:0a44e398fe09 | 7 | #define CHARACTERISTIC_LEN 100 |
kyowa_watanabe | 0:0a44e398fe09 | 8 | |
kyowa_watanabe | 0:0a44e398fe09 | 9 | // デバイス名の登録 |
kyowa_watanabe | 0:0a44e398fe09 | 10 | const static char DEVICE_NAME[] = "mbed_HRM1017"; |
kyowa_watanabe | 0:0a44e398fe09 | 11 | |
kyowa_watanabe | 0:0a44e398fe09 | 12 | // UUIDの登録 |
kyowa_watanabe | 0:0a44e398fe09 | 13 | static const uint8_t UUID_BRIL_SERVICE[] = {0x4d,0x92,0x37,0xc0,0xbd,0x5b,0x45,0x93,0xad,0x55,0xd8,0xf5,0x95,0xcf,0xe2,0xea}; |
kyowa_watanabe | 0:0a44e398fe09 | 14 | static const uint8_t UUID_CHAR_DATA[] = {0xe5,0xc1,0xcf,0x6e,0xe0,0x57,0x40,0x08,0x98,0x21,0x17,0x71,0x10,0x24,0xe8,0x85}; |
kyowa_watanabe | 0:0a44e398fe09 | 15 | |
kyowa_watanabe | 0:0a44e398fe09 | 16 | // ble_gap_evt_scan_req_report_t report_rssi; |
kyowa_watanabe | 0:0a44e398fe09 | 17 | // |
kyowa_watanabe | 0:0a44e398fe09 | 18 | uint8_t gRwData[CHARACTERISTIC_LEN] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; |
kyowa_watanabe | 0:0a44e398fe09 | 19 | uint8_t g_txdata[100]; |
kyowa_watanabe | 0:0a44e398fe09 | 20 | uint8_t g_rxdata[100]; |
kyowa_watanabe | 0:0a44e398fe09 | 21 | |
kyowa_watanabe | 0:0a44e398fe09 | 22 | BLEDevice ble; |
kyowa_watanabe | 0:0a44e398fe09 | 23 | Serial pc(USBTX, USBRX); |
kyowa_watanabe | 0:0a44e398fe09 | 24 | |
kyowa_watanabe | 0:0a44e398fe09 | 25 | GattCharacteristic gDataCharacteristic ( UUID_CHAR_DATA, gRwData, sizeof(gRwData), sizeof(gRwData), |
kyowa_watanabe | 0:0a44e398fe09 | 26 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE); |
kyowa_watanabe | 0:0a44e398fe09 | 27 | |
kyowa_watanabe | 0:0a44e398fe09 | 28 | // 送信用バッファ |
kyowa_watanabe | 0:0a44e398fe09 | 29 | uint8_t txTempPayload[100]; |
kyowa_watanabe | 0:0a44e398fe09 | 30 | |
kyowa_watanabe | 0:0a44e398fe09 | 31 | // タイマ送信用バッファ |
kyowa_watanabe | 0:0a44e398fe09 | 32 | uint8_t txUpdate[5] = { 0, 0, 0, 0, 0 }; |
kyowa_watanabe | 0:0a44e398fe09 | 33 | |
kyowa_watanabe | 0:0a44e398fe09 | 34 | // 送信用GATTの宣言 |
kyowa_watanabe | 0:0a44e398fe09 | 35 | GattCharacteristic txChar( 0x3A01, txTempPayload, 100, 100, |
kyowa_watanabe | 0:0a44e398fe09 | 36 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE | |
kyowa_watanabe | 0:0a44e398fe09 | 37 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | |
kyowa_watanabe | 0:0a44e398fe09 | 38 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE ); |
kyowa_watanabe | 0:0a44e398fe09 | 39 | |
kyowa_watanabe | 0:0a44e398fe09 | 40 | // 受信用バッファ |
kyowa_watanabe | 0:0a44e398fe09 | 41 | uint8_t rxTempPayload[100]; |
kyowa_watanabe | 0:0a44e398fe09 | 42 | |
kyowa_watanabe | 0:0a44e398fe09 | 43 | // 受信用GATTの宣言 |
kyowa_watanabe | 0:0a44e398fe09 | 44 | GattCharacteristic rxChar( 0x3A02, rxTempPayload, 100, 100, |
kyowa_watanabe | 0:0a44e398fe09 | 45 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | |
kyowa_watanabe | 0:0a44e398fe09 | 46 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | |
kyowa_watanabe | 0:0a44e398fe09 | 47 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE ); |
kyowa_watanabe | 0:0a44e398fe09 | 48 | |
kyowa_watanabe | 0:0a44e398fe09 | 49 | // RSSI値用変数 |
kyowa_watanabe | 0:0a44e398fe09 | 50 | int8_t g_rssi; |
kyowa_watanabe | 0:0a44e398fe09 | 51 | |
kyowa_watanabe | 0:0a44e398fe09 | 52 | // RSSI値用GATTの宣言 |
kyowa_watanabe | 0:0a44e398fe09 | 53 | GattCharacteristic rssiChar( 0x3A03, (uint8_t *)g_rssi, 1, 1, |
kyowa_watanabe | 0:0a44e398fe09 | 54 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | |
kyowa_watanabe | 0:0a44e398fe09 | 55 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | |
kyowa_watanabe | 0:0a44e398fe09 | 56 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE ); |
kyowa_watanabe | 0:0a44e398fe09 | 57 | |
kyowa_watanabe | 0:0a44e398fe09 | 58 | GattCharacteristic *txChars[] = {&txChar, }; |
kyowa_watanabe | 0:0a44e398fe09 | 59 | GattCharacteristic *rxChars[] = {&rxChar, }; |
kyowa_watanabe | 0:0a44e398fe09 | 60 | GattCharacteristic *rssiChars[] = {&rssiChar, }; |
kyowa_watanabe | 0:0a44e398fe09 | 61 | GattCharacteristic *RwDataChars[] = {&gDataCharacteristic}; |
kyowa_watanabe | 0:0a44e398fe09 | 62 | |
kyowa_watanabe | 0:0a44e398fe09 | 63 | GattService txService( 0x181C, txChars, sizeof(txChars) / sizeof( GattCharacteristic * ) ); |
kyowa_watanabe | 0:0a44e398fe09 | 64 | GattService rxService( 0x181C, rxChars, sizeof(rxChars) / sizeof( GattCharacteristic * ) ); |
kyowa_watanabe | 0:0a44e398fe09 | 65 | GattService rssiService( 0x181C, rssiChars, sizeof(rssiChars) / sizeof( GattCharacteristic * ) ); |
kyowa_watanabe | 0:0a44e398fe09 | 66 | |
kyowa_watanabe | 0:0a44e398fe09 | 67 | GattService gBrilService = GattService(UUID_BRIL_SERVICE, RwDataChars, sizeof(RwDataChars) / sizeof(GattCharacteristic *)); |
kyowa_watanabe | 0:0a44e398fe09 | 68 | |
kyowa_watanabe | 0:0a44e398fe09 | 69 | uint16_t uuid16_list[] = { 0x181C, }; |
kyowa_watanabe | 0:0a44e398fe09 | 70 | |
kyowa_watanabe | 0:0a44e398fe09 | 71 | static Gap::ConnectionParams_t connectionParams; |
kyowa_watanabe | 0:0a44e398fe09 | 72 | |
kyowa_watanabe | 0:0a44e398fe09 | 73 | void onDisconnectionCallback( Gap::Handle_t handle, Gap::DisconnectionReason_t reason ){ |
kyowa_watanabe | 0:0a44e398fe09 | 74 | |
kyowa_watanabe | 0:0a44e398fe09 | 75 | ble.startAdvertising(); |
kyowa_watanabe | 0:0a44e398fe09 | 76 | pc.printf( "Disconnect!!\r\n" ); |
kyowa_watanabe | 0:0a44e398fe09 | 77 | |
kyowa_watanabe | 0:0a44e398fe09 | 78 | } |
kyowa_watanabe | 0:0a44e398fe09 | 79 | |
kyowa_watanabe | 0:0a44e398fe09 | 80 | void onConnectionCallback( Gap::Handle_t handle, Gap::addr_type_t type, const Gap::address_t addr, |
kyowa_watanabe | 0:0a44e398fe09 | 81 | Gap::addr_type_t addr_type_townAddrType, const Gap::address_t ownAddr, |
kyowa_watanabe | 0:0a44e398fe09 | 82 | const Gap::ConnectionParams_t *params ){ |
kyowa_watanabe | 0:0a44e398fe09 | 83 | |
kyowa_watanabe | 0:0a44e398fe09 | 84 | pc.printf( "Connect!!\r\n" ); |
kyowa_watanabe | 0:0a44e398fe09 | 85 | |
kyowa_watanabe | 0:0a44e398fe09 | 86 | } |
kyowa_watanabe | 0:0a44e398fe09 | 87 | |
kyowa_watanabe | 0:0a44e398fe09 | 88 | void onDataWrittenCallback( const GattCharacteristicWriteCBParams *params ){ |
kyowa_watanabe | 0:0a44e398fe09 | 89 | int i; |
kyowa_watanabe | 0:0a44e398fe09 | 90 | int8_t p_rssi=0; |
kyowa_watanabe | 0:0a44e398fe09 | 91 | int error = 0; |
kyowa_watanabe | 0:0a44e398fe09 | 92 | |
kyowa_watanabe | 0:0a44e398fe09 | 93 | uint16_t bytesread = params->len; |
kyowa_watanabe | 0:0a44e398fe09 | 94 | |
kyowa_watanabe | 0:0a44e398fe09 | 95 | pc.printf( "Written: %d Bytes.\r\n", bytesread ); |
kyowa_watanabe | 0:0a44e398fe09 | 96 | for( i = 0; i < bytesread; i++ ){ |
kyowa_watanabe | 0:0a44e398fe09 | 97 | pc.printf( "%02x",params->data[i] ); |
kyowa_watanabe | 0:0a44e398fe09 | 98 | if( ( i + 1 ) < bytesread ){ |
kyowa_watanabe | 0:0a44e398fe09 | 99 | pc.printf( ", " ); |
kyowa_watanabe | 0:0a44e398fe09 | 100 | } |
kyowa_watanabe | 0:0a44e398fe09 | 101 | } |
kyowa_watanabe | 0:0a44e398fe09 | 102 | |
kyowa_watanabe | 0:0a44e398fe09 | 103 | // ble.updateCharacteristicValue( txChar.getValueAttribute().getHandle(), params->data, bytesread ); |
kyowa_watanabe | 0:0a44e398fe09 | 104 | |
kyowa_watanabe | 0:0a44e398fe09 | 105 | error = sd_ble_gap_rssi_get( rxChar.getValueAttribute().getHandle(), ( int8_t * )p_rssi ); |
kyowa_watanabe | 0:0a44e398fe09 | 106 | sd_ble_gap_rssi_stop( rxChar.getValueAttribute().getHandle() ); |
kyowa_watanabe | 0:0a44e398fe09 | 107 | sd_ble_gap_rssi_start( rxChar.getValueAttribute().getHandle(), 0x00, 0x00 ); |
kyowa_watanabe | 0:0a44e398fe09 | 108 | |
kyowa_watanabe | 0:0a44e398fe09 | 109 | pc.printf( " RSSI: %d, ", p_rssi ); |
kyowa_watanabe | 0:0a44e398fe09 | 110 | pc.printf( "ERROR: %d\r\n", error ); |
kyowa_watanabe | 0:0a44e398fe09 | 111 | |
kyowa_watanabe | 0:0a44e398fe09 | 112 | ble.updateCharacteristicValue( rssiChar.getValueAttribute().getHandle(), (uint8_t *)p_rssi, sizeof( p_rssi ) ); |
kyowa_watanabe | 0:0a44e398fe09 | 113 | |
kyowa_watanabe | 0:0a44e398fe09 | 114 | |
kyowa_watanabe | 0:0a44e398fe09 | 115 | } |
kyowa_watanabe | 0:0a44e398fe09 | 116 | |
kyowa_watanabe | 0:0a44e398fe09 | 117 | void tickerCallback( void ){ |
kyowa_watanabe | 0:0a44e398fe09 | 118 | uint16_t byteswrite = 1; |
kyowa_watanabe | 0:0a44e398fe09 | 119 | |
kyowa_watanabe | 0:0a44e398fe09 | 120 | ble.updateCharacteristicValue( txChar.getValueAttribute().getHandle(), txUpdate, byteswrite ); |
kyowa_watanabe | 0:0a44e398fe09 | 121 | |
kyowa_watanabe | 0:0a44e398fe09 | 122 | txUpdate[0]++; |
kyowa_watanabe | 0:0a44e398fe09 | 123 | } |
kyowa_watanabe | 0:0a44e398fe09 | 124 | |
kyowa_watanabe | 0:0a44e398fe09 | 125 | int main( void ) |
kyowa_watanabe | 0:0a44e398fe09 | 126 | { |
kyowa_watanabe | 0:0a44e398fe09 | 127 | |
kyowa_watanabe | 0:0a44e398fe09 | 128 | // 初期設定 |
kyowa_watanabe | 0:0a44e398fe09 | 129 | ble.init(); |
kyowa_watanabe | 0:0a44e398fe09 | 130 | // コールバック関数の設定 |
kyowa_watanabe | 0:0a44e398fe09 | 131 | ble.onDisconnection( onDisconnectionCallback ); |
kyowa_watanabe | 0:0a44e398fe09 | 132 | ble.onConnection( onConnectionCallback ); |
kyowa_watanabe | 0:0a44e398fe09 | 133 | ble.onDataWritten(onDataWrittenCallback); |
kyowa_watanabe | 0:0a44e398fe09 | 134 | |
kyowa_watanabe | 0:0a44e398fe09 | 135 | ble.getPreferredConnectionParams( &connectionParams ); |
kyowa_watanabe | 0:0a44e398fe09 | 136 | |
kyowa_watanabe | 0:0a44e398fe09 | 137 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
kyowa_watanabe | 0:0a44e398fe09 | 138 | // ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t*)uuid16_list, sizeof(uuid16_list)); |
kyowa_watanabe | 0:0a44e398fe09 | 139 | // ble.accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_THERMOMETER); |
kyowa_watanabe | 0:0a44e398fe09 | 140 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
kyowa_watanabe | 0:0a44e398fe09 | 141 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
kyowa_watanabe | 0:0a44e398fe09 | 142 | ble.setAdvertisingInterval(160); // 100ms; in multiples of 0.625ms |
kyowa_watanabe | 0:0a44e398fe09 | 143 | ble.setAdvertisingTimeout(0); // アドバタイジングモードのタイムアウト無効 |
kyowa_watanabe | 0:0a44e398fe09 | 144 | |
kyowa_watanabe | 0:0a44e398fe09 | 145 | sd_ble_gap_rssi_start( rxChar.getValueAttribute().getHandle(), 0x00, 0x00 ); |
kyowa_watanabe | 0:0a44e398fe09 | 146 | |
kyowa_watanabe | 0:0a44e398fe09 | 147 | // アドバタイズモード開始 |
kyowa_watanabe | 0:0a44e398fe09 | 148 | ble.startAdvertising(); |
kyowa_watanabe | 0:0a44e398fe09 | 149 | |
kyowa_watanabe | 0:0a44e398fe09 | 150 | // サービスの追加 |
kyowa_watanabe | 0:0a44e398fe09 | 151 | ble.addService( txService ); |
kyowa_watanabe | 0:0a44e398fe09 | 152 | ble.addService( rxService ); |
kyowa_watanabe | 0:0a44e398fe09 | 153 | ble.addService( rssiService ); |
kyowa_watanabe | 0:0a44e398fe09 | 154 | |
kyowa_watanabe | 0:0a44e398fe09 | 155 | // タイマーの設定 |
kyowa_watanabe | 0:0a44e398fe09 | 156 | Ticker ticker; |
kyowa_watanabe | 0:0a44e398fe09 | 157 | ticker.attach( tickerCallback, 0.5 ); |
kyowa_watanabe | 0:0a44e398fe09 | 158 | |
kyowa_watanabe | 0:0a44e398fe09 | 159 | while(1){ |
kyowa_watanabe | 0:0a44e398fe09 | 160 | |
kyowa_watanabe | 0:0a44e398fe09 | 161 | ble.waitForEvent(); |
kyowa_watanabe | 0:0a44e398fe09 | 162 | |
kyowa_watanabe | 0:0a44e398fe09 | 163 | } |
kyowa_watanabe | 0:0a44e398fe09 | 164 | } |