動作テスト用

Dependencies:   BLE_API mbed nRF51822

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?

UserRevisionLine numberNew 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 }