BLE nano(nRF51822)の使い方を学んでいます。
インターネットにて、BLEnanoとスマートフォンの接続は目にするのですが、BLEnanoとBLEnano間のデバイス間の通信があまり記載されていないため残しておきます。
はじめに、BLEにはCentral と Peripheral があります。
Central:デバイスを見つける側
Peripheral デバイスを見つけられる側 という意味があります。
BLEnanoには(Arduino済み)、両方のサンプルファイルがあるのでそれを見ながら進んでいきます。
Peripheralについて
サンプルプログラムである、BLE_SimplePeripheral.inoを開きます。
void setAdvertisement(void) の関数がすごく重要です。
SHORTENED_LOCAL_NAMEに名前を与えてあげます。
以前にBluetooth通信を行いましたが、そのときは、BDアドレスで接続をしていました。(BLEもBDアドレスで接続するのかと思いかなり苦労しました・・・)
クラアンととサーバという立場で見ればすこしおかしいような気がする??
void setAdvertisement(void) { ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); //SHORTENED_LOCAL_NAMEを指定することでデバイスを認識する(デバイス名の長さも指定すること!) ここでは"TXRX"を名前にしている ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,(const uint8_t *)"TXRX", 4); ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,(const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid_rev)); ble.accumulateScanResponse(GapAdvertisingData::COMPLETE_LOCAL_NAME,(const uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME) - 1); }
Centralについて
サンプルプログラムである、BLE_CentralTest.inoを開きます。
static void scanCallBack(const Gap::AdvertisementCallbackParams_t *params)の関数がすごく重要です。
if( memcmp(“TXRX”, adv_name, 4) == 0x00 ) の条件判定式にて接続するデバイスを選択しています。
memcmpについては、ここ参照してください。
比較した文字列があっていれば、0を返し、Trueとなります。
static void scanCallBack(const Gap::AdvertisementCallbackParams_t *params) { uint8_t index; Serial.println("Scan CallBack "); Serial.print("PerrAddress: "); for(index=0; index<6; index++) { Serial.print(params->peerAddr[index], HEX); Serial.print(" "); } Serial.println(" "); Serial.print("The Rssi : "); Serial.println(params->rssi, DEC); Serial.print("The adv_data : "); Serial.println((const char*)params->advertisingData); uint8_t len; uint8_t adv_name[31]; if( NRF_SUCCESS == ble_advdata_parser(BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME, params->advertisingDataLen, (uint8_t *)params->advertisingData, &len, adv_name) ) { Serial.print("Short name len : "); Serial.println(len, DEC); Serial.print("Short name is : "); Serial.println((const char*)adv_name); //ここの条件判定式で接続するデバイスであるかを判断している if( memcmp("TXRX", adv_name, 4) == 0x00 ) { Serial.println("Got device, stop scan "); ble.stopScan(); device_is_simple_peripheral = 1; ble.connect(params->peerAddr, BLEProtocol::AddressType::RANDOM_STATIC, NULL, NULL); } } //以下割愛
特定のデータの送信はまた後日まとめます。
コメント