1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140 | #include <stdbool.h>
#include <string.h>
#include "app_trace.h"
#include "app_error.h"
#include "softdevice_handler.h"
#include "ble_conn_params.h"
#include "custom_board.h"
#include "ble_advdata.h"
#include "ble.h"
#include "ble_advdata.h"
#include "ble_conn_params.h"
// サービスが変更されないなら0
#define IS_SRVC_CHANGED_CHARACT_PRESENT 0
#define APP_COMPANY_IDENTIFIER 0x002C // Apple
#define APP_BEACON_INFO_LENGTH 0x17 // Beaconのデータの長さ
#define APP_BEACON_TYPE 0x02, 0x15 // Beaconのタイプ
#define APP_MAJOR_VALUE 0x01, 0x02 // iBeaconのMajor
#define APP_MINOR_VALUE 0x03, 0x04 // iBeaconのMinor
#define APP_BEACON_UUID 0x01, 0x12, 0x23, 0x34, \
0x45, 0xaa, 0x67, 0x78, \
0x89, 0xba, 0x13, 0xbc, \
0x33, 0x1a, 0x22, 0xf0 // iBeaconのUUID
#define APP_MEASURED_RSSI 0xC3 // RSSI出力の計測値
static uint8_t m_beacon_info[APP_BEACON_INFO_LENGTH] = // iBeaconのAdvertising Data
{
APP_BEACON_TYPE,
APP_BEACON_UUID,
APP_MAJOR_VALUE,
APP_MINOR_VALUE,
APP_MEASURED_RSSI
};
#define NON_CONNECTABLE_ADV_INTERVAL MSEC_TO_UNITS(100, UNIT_0_625_MS) /**< The advertising interval for non-connectable advertisement (100 ms). This value can vary between 100ms to 10.24s). */
/**
* @brief エラーハンドラ.APP_ERROR_CHECKでエラーが発生している場合は、呼ばれる.
*/
void app_error_handler(uint32_t error_code,
uint32_t line_num,
const uint8_t *p_file_name )
{
app_trace_log("error_code: %d\r\n", error_code);
app_trace_log("line_num: %d\r\n", line_num);
app_trace_log("p_file_name: %s\r\n", p_file_name);
}
/**
* @brief 関連するModule群にシステムイベントを送出する関数.
*
* @details システムイベントが発生したあとに、システムイベント割り込みハンドラから呼び出される.
*
* @param[in] sys_evt システムスタックイベント
*/
static void sys_evt_dispatch(uint32_t sys_evt)
{
}
/**
* @brief BLEスタックイベントに関連するすべてのModule群にBLEスタックイベントを送出するための関数.
*
* @details BLEスタックイベントを受信したあと、メインループの中のスケジューラーから呼び出される.
*
* @param[in] p_ble_evt Bluetoothスタックイベント.
*/
static void ble_evt_dispatch(ble_evt_t * p_ble_evt)
{
}
/**@brief Function for the Power manager.
*/
static void power_manage(void)
{
uint32_t err_code = sd_app_evt_wait();
APP_ERROR_CHECK(err_code);
}
int main() {
uint32_t err_code;
// Denug loggerの初期化.
app_trace_init();
SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_RC_250_PPM_8000MS_CALIBRATION, NULL);
// BLEスタックを有効にする.
ble_enable_params_t ble_enable_params;
memset(&ble_enable_params, 0, sizeof(ble_enable_params));
ble_enable_params.gatts_enable_params.service_changed = IS_SRVC_CHANGED_CHARACT_PRESENT;
err_code = sd_ble_enable(&ble_enable_params);
APP_ERROR_CHECK(err_code);
// BLEイベントを登録する.
err_code = softdevice_ble_evt_handler_set(ble_evt_dispatch);
APP_ERROR_CHECK(err_code);
// BLEイベント群のためのSoftDeviceハンドラモジュールを登録.
err_code = softdevice_sys_evt_handler_set(sys_evt_dispatch);
APP_ERROR_CHECK(err_code);
// AdvDataのManufacture Specificの領域の値の定義.
ble_advdata_manuf_data_t manuf_specific_data;
manuf_specific_data.company_identifier = APP_COMPANY_IDENTIFIER;
manuf_specific_data.data.p_data = (uint8_t *) m_beacon_info;
manuf_specific_data.data.size = APP_BEACON_INFO_LENGTH;
// AdvDataを構築
ble_advdata_t advdata;
memset(&advdata, 0, sizeof(advdata));
advdata.name_type = BLE_ADVDATA_NO_NAME;
uint8_t flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
advdata.flags = flags;
advdata.p_manuf_specific_data = &manuf_specific_data;
// AdvDataを登録.
err_code = ble_advdata_set(&advdata, NULL);
APP_ERROR_CHECK(err_code);
// Advertisingパラメーターの設定
ble_gap_adv_params_t m_adv_params;
memset(&m_adv_params, 0, sizeof(m_adv_params));
m_adv_params.type = BLE_GAP_ADV_TYPE_ADV_NONCONN_IND; // ADV_NONCONN_IND
m_adv_params.p_peer_addr = NULL; // 不特定多数デバイスから接続可能に
m_adv_params.fp = BLE_GAP_ADV_FP_ANY; // 不特定多数デバイスから接続可能に
m_adv_params.interval = NON_CONNECTABLE_ADV_INTERVAL; // 発信周期
m_adv_params.timeout = 0;
// Advertisingを開始
err_code = sd_ble_gap_adv_start(&m_adv_params);
APP_ERROR_CHECK(err_code);
while(true){
power_manage();
}
}
|