北海道情報専門学校 ライフハック研究所のエンベデッドUSBチーム松葉和仁により開発されたUSBSecのmbedに使用するソースコード by 和仁

Dependencies:   SDFileSystem MusicEngine

Fork of mbed-os-example-ble-LED by mbed-os-examples

北海道情報専門学校 ライフハック研究所 エンベデッドUSB USBSec用mbedプログラム

松葉和仁

Committer:
kazu0o2
Date:
Wed Dec 21 02:56:24 2016 +0000
Revision:
14:be4e43ce1578
Parent:
11:7404978b24e7
Child:
15:c65fdaa7bfc0
audio;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 11:7404978b24e7 1 #include <events/mbed_events.h>
mbed_official 2:864ddfb70a9c 2 #include <mbed.h>
kazu0o2 14:be4e43ce1578 3 #include "SDFileSystem.h"
mbed_official 2:864ddfb70a9c 4 #include "ble/BLE.h"
kazu0o2 14:be4e43ce1578 5 #include "INITService.h"//初期設定とその状態の送信を行う 0x01
kazu0o2 14:be4e43ce1578 6 #include "PINService.h"//パスワードの認証を行う0x02
kazu0o2 14:be4e43ce1578 7 #include "USBService.h"//USB機器の接続、切断を行う 0x03
kazu0o2 14:be4e43ce1578 8 #include "STATEService.h"//認証、電源、USB状態の送信を行う 0x04
kazu0o2 14:be4e43ce1578 9
kazu0o2 14:be4e43ce1578 10 #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console;
kazu0o2 14:be4e43ce1578 11 * it will have an impact on code-size and power consumption. */
kazu0o2 14:be4e43ce1578 12 #if NEED_CONSOLE_OUTPUT
kazu0o2 14:be4e43ce1578 13 Serial pc(USBTX, USBRX);
kazu0o2 14:be4e43ce1578 14 #define DEBUG(...) { pc.printf(__VA_ARGS__); }
kazu0o2 14:be4e43ce1578 15 #else
kazu0o2 14:be4e43ce1578 16 #define DEBUG(...) /* nothing */
kazu0o2 14:be4e43ce1578 17 #endif /* #if NEED_CONSOLE_OUTPUT */
mbed_official 2:864ddfb70a9c 18
kazu0o2 14:be4e43ce1578 19 #define mC 261.626
kazu0o2 14:be4e43ce1578 20 #define mD 293.665
kazu0o2 14:be4e43ce1578 21 #define mE 329.628
kazu0o2 14:be4e43ce1578 22 #define mF 349.228
kazu0o2 14:be4e43ce1578 23 #define mG 391.995
kazu0o2 14:be4e43ce1578 24 #define mA 440.000
kazu0o2 14:be4e43ce1578 25 #define mB 493.883
kazu0o2 14:be4e43ce1578 26
kazu0o2 14:be4e43ce1578 27 DigitalOut alivenessLED(LED1, 0);//システム生存確認LED
kazu0o2 14:be4e43ce1578 28 DigitalOut actuatedLED(LED2, 0);//USB用リレーピン
mbed_official 2:864ddfb70a9c 29
kazu0o2 14:be4e43ce1578 30 InterruptIn powerSwitch(p17);//パワー検出コード
kazu0o2 14:be4e43ce1578 31 InterruptIn resetSwitch(p18);//リセットボタン
kazu0o2 14:be4e43ce1578 32
kazu0o2 14:be4e43ce1578 33 PwmOut speaker(LED3);//スピーカ
kazu0o2 14:be4e43ce1578 34
kazu0o2 14:be4e43ce1578 35 //SDFileSystem local("local");//SDカードを定義する
kazu0o2 14:be4e43ce1578 36 SDFileSystem sd(p13,p14,p15,p19,"sd");
kazu0o2 14:be4e43ce1578 37
kazu0o2 14:be4e43ce1578 38 const static char DEVICE_NAME[] = "USBSec";
kazu0o2 14:be4e43ce1578 39 static const uint16_t uuid16_list[] = {USBService::USB_SERVICE_UUID,PINService::PIN_SERVICE_UUID,STATEService::STATE_SERVICE_UUID,INITService::INIT_SERVICE_UUID};//testcode
mbed_official 2:864ddfb70a9c 40
mbed_official 2:864ddfb70a9c 41 static EventQueue eventQueue(
mbed_official 2:864ddfb70a9c 42 /* event count */ 10 * /* event size */ 32
mbed_official 2:864ddfb70a9c 43 );
mbed_official 2:864ddfb70a9c 44
kazu0o2 14:be4e43ce1578 45 USBService *usbServicePtr;
kazu0o2 14:be4e43ce1578 46 PINService *pinServicePtr;
kazu0o2 14:be4e43ce1578 47 STATEService *stateServicePtr;
kazu0o2 14:be4e43ce1578 48 INITService *initServicePtr;
kazu0o2 14:be4e43ce1578 49
kazu0o2 14:be4e43ce1578 50 bool authenticationInformation = false;//パスワードは登録されているか
kazu0o2 14:be4e43ce1578 51 bool authenticated = false;//パスワード認証を行ったか
kazu0o2 14:be4e43ce1578 52
kazu0o2 14:be4e43ce1578 53 char password[] = {0x00,0x00,0x00,0x00,0x00,0x00};//デバッグパスワード
kazu0o2 14:be4e43ce1578 54
kazu0o2 14:be4e43ce1578 55 int connectAlertCount = 0;
kazu0o2 14:be4e43ce1578 56 float connectAlert[]={mE,mF,mG,mA,mB};
kazu0o2 14:be4e43ce1578 57 float disconnectAlert[]={mB,mA,mG,mF,mE};
kazu0o2 14:be4e43ce1578 58
kazu0o2 14:be4e43ce1578 59 void connectAlertOff();
kazu0o2 14:be4e43ce1578 60
kazu0o2 14:be4e43ce1578 61 /**
kazu0o2 14:be4e43ce1578 62 *接続時発音
kazu0o2 14:be4e43ce1578 63 *接続時に発音されるためのキュー
kazu0o2 14:be4e43ce1578 64 */
kazu0o2 14:be4e43ce1578 65 void connectAlertOn() {
kazu0o2 14:be4e43ce1578 66 DEBUG("connectAlertOn\r\n");
kazu0o2 14:be4e43ce1578 67 speaker.period(1.0/connectAlert[connectAlertCount]);
kazu0o2 14:be4e43ce1578 68 speaker.write(0.5f);
kazu0o2 14:be4e43ce1578 69 queue.call_in(600, &connectAlertOff);
kazu0o2 14:be4e43ce1578 70 }
kazu0o2 14:be4e43ce1578 71
kazu0o2 14:be4e43ce1578 72 /**
kazu0o2 14:be4e43ce1578 73 *接続時発音
kazu0o2 14:be4e43ce1578 74 *接続時に発音されるためのキュー
kazu0o2 14:be4e43ce1578 75 */
kazu0o2 14:be4e43ce1578 76 void connectAlertOff() {
kazu0o2 14:be4e43ce1578 77 DEBUG("connectAlertOff\r\n");
kazu0o2 14:be4e43ce1578 78 speaker.write(0.0f);
kazu0o2 14:be4e43ce1578 79 if(connectAlertCount<4){
kazu0o2 14:be4e43ce1578 80 queue.call_in(600, &connectAlertOn);
kazu0o2 14:be4e43ce1578 81 connectAlertCount += 1;
kazu0o2 14:be4e43ce1578 82 }else{
kazu0o2 14:be4e43ce1578 83 DEBUG("connectAlertStop\r\n");
kazu0o2 14:be4e43ce1578 84 }
kazu0o2 14:be4e43ce1578 85 }
kazu0o2 14:be4e43ce1578 86
kazu0o2 14:be4e43ce1578 87 /**
kazu0o2 14:be4e43ce1578 88 *接続時発音
kazu0o2 14:be4e43ce1578 89 *接続時に発音を開始するためのキュー
kazu0o2 14:be4e43ce1578 90 */
kazu0o2 14:be4e43ce1578 91 void connectAlertStart() {
kazu0o2 14:be4e43ce1578 92 DEBUG("connectAlertStart\r\n");
kazu0o2 14:be4e43ce1578 93 connectAlertCount = 0;
kazu0o2 14:be4e43ce1578 94 queue.call(&connectAlertOn);
kazu0o2 14:be4e43ce1578 95 }
kazu0o2 14:be4e43ce1578 96
kazu0o2 14:be4e43ce1578 97 /**
kazu0o2 14:be4e43ce1578 98 *パワー検出コード
kazu0o2 14:be4e43ce1578 99 *タクトスイッチが押されたときに実行されるキュー
kazu0o2 14:be4e43ce1578 100 */
kazu0o2 14:be4e43ce1578 101 void togglePowerUp() {
kazu0o2 14:be4e43ce1578 102 DEBUG("PowerUp\r\n");
kazu0o2 14:be4e43ce1578 103 stateServicePtr->powerStateUpdate(0x01);
kazu0o2 14:be4e43ce1578 104 }
kazu0o2 14:be4e43ce1578 105
kazu0o2 14:be4e43ce1578 106 /**
kazu0o2 14:be4e43ce1578 107 *パワー検出コード
kazu0o2 14:be4e43ce1578 108 *タクトスイッチが離されたときに実行されるキュー
kazu0o2 14:be4e43ce1578 109 */
kazu0o2 14:be4e43ce1578 110 void togglePowerDown() {
kazu0o2 14:be4e43ce1578 111 DEBUG("PowerDown\r\n");
kazu0o2 14:be4e43ce1578 112 stateServicePtr->powerStateUpdate(0x00);
kazu0o2 14:be4e43ce1578 113
kazu0o2 14:be4e43ce1578 114 //USBの無効化
kazu0o2 14:be4e43ce1578 115 actuatedLED = 0x00;
kazu0o2 14:be4e43ce1578 116 stateServicePtr->usbStateUpdate(0x00);
kazu0o2 14:be4e43ce1578 117 }
kazu0o2 14:be4e43ce1578 118
kazu0o2 14:be4e43ce1578 119 /**
kazu0o2 14:be4e43ce1578 120 *パワー検出コード
kazu0o2 14:be4e43ce1578 121 *タクトスイッチが押されたときに実行される関数
kazu0o2 14:be4e43ce1578 122 */
kazu0o2 14:be4e43ce1578 123 void powerUp() {
kazu0o2 14:be4e43ce1578 124 // 即実行されるイベント
kazu0o2 14:be4e43ce1578 125 eventQueue.call(&togglePowerUp);
kazu0o2 14:be4e43ce1578 126 }
mbed_official 2:864ddfb70a9c 127
kazu0o2 14:be4e43ce1578 128 /**
kazu0o2 14:be4e43ce1578 129 *パワー検出コード
kazu0o2 14:be4e43ce1578 130 *タクトスイッチが離されたときに実行される関数
kazu0o2 14:be4e43ce1578 131 */
kazu0o2 14:be4e43ce1578 132 void powerDown() {
kazu0o2 14:be4e43ce1578 133 // 即実行されるイベント
kazu0o2 14:be4e43ce1578 134 eventQueue.call(&togglePowerDown);
kazu0o2 14:be4e43ce1578 135 }
kazu0o2 14:be4e43ce1578 136
kazu0o2 14:be4e43ce1578 137 /**
kazu0o2 14:be4e43ce1578 138 *リセットボタン
kazu0o2 14:be4e43ce1578 139 *タクトスイッチが離されたときに実行されるキュー
kazu0o2 14:be4e43ce1578 140 */
kazu0o2 14:be4e43ce1578 141 void toggleResetDown() {
kazu0o2 14:be4e43ce1578 142 DEBUG("ResetDown\r\n");
kazu0o2 14:be4e43ce1578 143 DEBUG("パスワードのリセットを行います\r\n");
kazu0o2 14:be4e43ce1578 144 //リセットパスワードの書き込み
kazu0o2 14:be4e43ce1578 145 FILE *fp = fopen("/sd/sdtest.txt", "w");
kazu0o2 14:be4e43ce1578 146 if(fp == NULL) {
kazu0o2 14:be4e43ce1578 147 DEBUG("Could not open file for write\n");
kazu0o2 14:be4e43ce1578 148 }else{
kazu0o2 14:be4e43ce1578 149 fprintf(fp, "00\n00\n00\n00\n00\n00\n");
kazu0o2 14:be4e43ce1578 150 fclose(fp);
kazu0o2 14:be4e43ce1578 151 }
kazu0o2 14:be4e43ce1578 152
kazu0o2 14:be4e43ce1578 153 //パスワード登録状態のリセット
kazu0o2 14:be4e43ce1578 154 authenticationInformation = false;
kazu0o2 14:be4e43ce1578 155 initServicePtr->stateUpdate(0x00);
kazu0o2 14:be4e43ce1578 156 //パスワード認証状態のリセット
kazu0o2 14:be4e43ce1578 157 authenticated=false;
kazu0o2 14:be4e43ce1578 158 stateServicePtr->authStateUpdate(0x00);
kazu0o2 14:be4e43ce1578 159 DEBUG("パスワードのリセットが完了しました\r\n");
kazu0o2 14:be4e43ce1578 160 }
kazu0o2 14:be4e43ce1578 161
kazu0o2 14:be4e43ce1578 162 /**
kazu0o2 14:be4e43ce1578 163 *リセットボタン
kazu0o2 14:be4e43ce1578 164 *タクトスイッチが離されたときに実行される関数
kazu0o2 14:be4e43ce1578 165 */
kazu0o2 14:be4e43ce1578 166 void resetDown() {
kazu0o2 14:be4e43ce1578 167 // 即実行されるイベント
kazu0o2 14:be4e43ce1578 168 eventQueue.call(&toggleResetDown);
kazu0o2 14:be4e43ce1578 169 }
kazu0o2 14:be4e43ce1578 170
kazu0o2 14:be4e43ce1578 171 /**
kazu0o2 14:be4e43ce1578 172 * Bluetooth接続時の操作
kazu0o2 14:be4e43ce1578 173 */
kazu0o2 14:be4e43ce1578 174 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
kazu0o2 14:be4e43ce1578 175 {
kazu0o2 14:be4e43ce1578 176 char mac[6];
kazu0o2 14:be4e43ce1578 177 DEBUG("peerMAC:%d\r\n",params->peerAddr);
kazu0o2 14:be4e43ce1578 178 DEBUG("peerMAC_length:%d\r\n",sizeof(params->peerAddr));
kazu0o2 14:be4e43ce1578 179 DEBUG("peerMAC:");
kazu0o2 14:be4e43ce1578 180 for(int i = 0;i<sizeof(params->peerAddr);i+=1){
kazu0o2 14:be4e43ce1578 181 mac[i]=params->peerAddr[i];
kazu0o2 14:be4e43ce1578 182 DEBUG("%02x ", params->peerAddr[i]);
kazu0o2 14:be4e43ce1578 183 }
kazu0o2 14:be4e43ce1578 184 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 185
kazu0o2 14:be4e43ce1578 186 /*
kazu0o2 14:be4e43ce1578 187 DEBUG("peerArrayMAC:%d\r\n",mac);
kazu0o2 14:be4e43ce1578 188 DEBUG("peerArrayMAC_length:%d\r\n",sizeof(mac));
kazu0o2 14:be4e43ce1578 189 DEBUG("peerArrayMAC:");
kazu0o2 14:be4e43ce1578 190 for(int i = 0;i<sizeof(mac);i+=1){
kazu0o2 14:be4e43ce1578 191 DEBUG("%d ", mac[i]);
kazu0o2 14:be4e43ce1578 192 }
kazu0o2 14:be4e43ce1578 193 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 194 */
kazu0o2 14:be4e43ce1578 195
kazu0o2 14:be4e43ce1578 196 DEBUG("ownAddrMAC:%d\r\n",params->ownAddr);
kazu0o2 14:be4e43ce1578 197 DEBUG("ownAddrMAC_length:%d\r\n",sizeof(params->ownAddr));
kazu0o2 14:be4e43ce1578 198 DEBUG("ownAddrMAC:");
kazu0o2 14:be4e43ce1578 199 for(int i = 0;i<sizeof(params->ownAddr);i+=1){
kazu0o2 14:be4e43ce1578 200 DEBUG("%d ", params->ownAddr[i]);
kazu0o2 14:be4e43ce1578 201 }
kazu0o2 14:be4e43ce1578 202 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 203
kazu0o2 14:be4e43ce1578 204 DEBUG("BluetoothConnection!\r\n");
kazu0o2 14:be4e43ce1578 205 }
kazu0o2 14:be4e43ce1578 206
kazu0o2 14:be4e43ce1578 207 /**
kazu0o2 14:be4e43ce1578 208 * Bluetooth切断時の操作
kazu0o2 14:be4e43ce1578 209 */
mbed_official 2:864ddfb70a9c 210 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
mbed_official 2:864ddfb70a9c 211 {
mbed_official 2:864ddfb70a9c 212 (void) params;
kazu0o2 14:be4e43ce1578 213 //認証状態の無効化
kazu0o2 14:be4e43ce1578 214 authenticated = false;
kazu0o2 14:be4e43ce1578 215 stateServicePtr->authStateUpdate(0x00);
kazu0o2 14:be4e43ce1578 216 //USBの無効化
kazu0o2 14:be4e43ce1578 217 actuatedLED = 0x00;
kazu0o2 14:be4e43ce1578 218 stateServicePtr->usbStateUpdate(0x00);
kazu0o2 14:be4e43ce1578 219
mbed_official 2:864ddfb70a9c 220 BLE::Instance().gap().startAdvertising();
kazu0o2 14:be4e43ce1578 221 DEBUG("BluetoothDisconnection!\r\n");
mbed_official 2:864ddfb70a9c 222 }
mbed_official 2:864ddfb70a9c 223
kazu0o2 14:be4e43ce1578 224 /**
kazu0o2 14:be4e43ce1578 225 *動作確認ランプの状態変更
kazu0o2 14:be4e43ce1578 226 */
mbed_official 2:864ddfb70a9c 227 void blinkCallback(void)
mbed_official 2:864ddfb70a9c 228 {
mbed_official 2:864ddfb70a9c 229 alivenessLED = !alivenessLED; /* Do blinky on LED1 to indicate system aliveness. */
mbed_official 2:864ddfb70a9c 230 }
mbed_official 2:864ddfb70a9c 231
kazu0o2 14:be4e43ce1578 232
kazu0o2 14:be4e43ce1578 233 /**
kazu0o2 14:be4e43ce1578 234 *パスワードSDカード書き込み
kazu0o2 14:be4e43ce1578 235 *パスワードが変更されたときに実行されるキュー
kazu0o2 14:be4e43ce1578 236 */
kazu0o2 14:be4e43ce1578 237 void writeSD() {
kazu0o2 14:be4e43ce1578 238 //SDへの書き込み処理
kazu0o2 14:be4e43ce1578 239 DEBUG("SDカードを開きます\r\n");
kazu0o2 14:be4e43ce1578 240 FILE *fp = fopen("/sd/sdtest.txt", "w");
kazu0o2 14:be4e43ce1578 241 if(fp == NULL) {
kazu0o2 14:be4e43ce1578 242 DEBUG("Could not open file for write\n");
kazu0o2 14:be4e43ce1578 243 }else{
kazu0o2 14:be4e43ce1578 244 for(int i = 0;i<sizeof(password);i+=1){
kazu0o2 14:be4e43ce1578 245 fprintf(fp,"%02x", password[i]);
kazu0o2 14:be4e43ce1578 246 fprintf(fp, "\n");
kazu0o2 14:be4e43ce1578 247 }
kazu0o2 14:be4e43ce1578 248 fclose(fp);
kazu0o2 14:be4e43ce1578 249 }
kazu0o2 14:be4e43ce1578 250 DEBUG("SDカードを閉じます\r\n");
kazu0o2 14:be4e43ce1578 251 }
kazu0o2 14:be4e43ce1578 252
mbed_official 2:864ddfb70a9c 253 /**
mbed_official 2:864ddfb70a9c 254 * This callback allows the LEDService to receive updates to the ledState Characteristic.
kazu0o2 14:be4e43ce1578 255 * LEDサービスにて状態変更を受信した際に呼び出されるコールバック
mbed_official 2:864ddfb70a9c 256 *
mbed_official 2:864ddfb70a9c 257 * @param[in] params
mbed_official 2:864ddfb70a9c 258 * Information about the characterisitc being updated.
mbed_official 2:864ddfb70a9c 259 */
mbed_official 2:864ddfb70a9c 260 void onDataWrittenCallback(const GattWriteCallbackParams *params) {
kazu0o2 14:be4e43ce1578 261 DEBUG("onDataWrittenCallback:");
kazu0o2 14:be4e43ce1578 262
kazu0o2 14:be4e43ce1578 263 if (params->handle == initServicePtr->getValueHandle()) {
kazu0o2 14:be4e43ce1578 264 DEBUG("INITService\r\n");
kazu0o2 14:be4e43ce1578 265 DEBUG("length:%d\r\n",params->len);
kazu0o2 14:be4e43ce1578 266 for(int i = 0;i<params->len;i+=1){
kazu0o2 14:be4e43ce1578 267 DEBUG("%02x ", params->data[i]);
kazu0o2 14:be4e43ce1578 268 }
kazu0o2 14:be4e43ce1578 269 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 270
kazu0o2 14:be4e43ce1578 271 //認証情報の確認
kazu0o2 14:be4e43ce1578 272 if(authenticationInformation){
kazu0o2 14:be4e43ce1578 273 //認証情報が登録されていた場合は登録を行わない
kazu0o2 14:be4e43ce1578 274 DEBUG("認証情報登録済みのため、認証情報の登録を中止します\r\n");
kazu0o2 14:be4e43ce1578 275 return;
kazu0o2 14:be4e43ce1578 276 }
kazu0o2 14:be4e43ce1578 277
kazu0o2 14:be4e43ce1578 278 DEBUG("認証情報の登録を開始します\r\n");
kazu0o2 14:be4e43ce1578 279
kazu0o2 14:be4e43ce1578 280 for(int i = 0;i<params->len;i+=1){
kazu0o2 14:be4e43ce1578 281 password[i] = params->data[i];
kazu0o2 14:be4e43ce1578 282 }
kazu0o2 14:be4e43ce1578 283
kazu0o2 14:be4e43ce1578 284 DEBUG("PasswordLength:%d\r\n",sizeof(password));
kazu0o2 14:be4e43ce1578 285 for(int i = 0;i<sizeof(password);i+=1){
kazu0o2 14:be4e43ce1578 286 DEBUG("%02x ", password[i]);
kazu0o2 14:be4e43ce1578 287 }
kazu0o2 14:be4e43ce1578 288 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 289
kazu0o2 14:be4e43ce1578 290 authenticationInformation = true;
kazu0o2 14:be4e43ce1578 291 initServicePtr->stateUpdate(0x01);
kazu0o2 14:be4e43ce1578 292
kazu0o2 14:be4e43ce1578 293
kazu0o2 14:be4e43ce1578 294 // 即実行されるイベント
kazu0o2 14:be4e43ce1578 295 eventQueue.call(&writeSD);
kazu0o2 14:be4e43ce1578 296
kazu0o2 14:be4e43ce1578 297 DEBUG("認証情報の登録を終了します\r\n");
kazu0o2 14:be4e43ce1578 298 return;
kazu0o2 14:be4e43ce1578 299 }
kazu0o2 14:be4e43ce1578 300
kazu0o2 14:be4e43ce1578 301 if(!authenticationInformation){
kazu0o2 14:be4e43ce1578 302 //認証情報が登録されていない場合は操作を行わない
kazu0o2 14:be4e43ce1578 303 DEBUG("\r\n認証情報未登録のため、操作を中止します\r\n");
kazu0o2 14:be4e43ce1578 304 return;
kazu0o2 14:be4e43ce1578 305 }
kazu0o2 14:be4e43ce1578 306
kazu0o2 14:be4e43ce1578 307 if (params->handle == pinServicePtr->getValueHandle()) {
kazu0o2 14:be4e43ce1578 308 DEBUG("PINService\r\n");
kazu0o2 14:be4e43ce1578 309 DEBUG("length:%d\r\n",params->len);
kazu0o2 14:be4e43ce1578 310 for(int i = 0;i<params->len;i+=1){
kazu0o2 14:be4e43ce1578 311 DEBUG("%02x ", params->data[i]);
kazu0o2 14:be4e43ce1578 312 }
kazu0o2 14:be4e43ce1578 313 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 314
kazu0o2 14:be4e43ce1578 315 DEBUG("認証を開始します\r\n");
kazu0o2 14:be4e43ce1578 316 DEBUG("VerificationLength:%d\r\n",params->len);
kazu0o2 14:be4e43ce1578 317 DEBUG("RegisterLength:%d\r\n",sizeof(password));
kazu0o2 14:be4e43ce1578 318 if(params->len != sizeof(password)){
kazu0o2 14:be4e43ce1578 319 DEBUG("認証に失敗しました\r\n");
kazu0o2 14:be4e43ce1578 320 return;
kazu0o2 14:be4e43ce1578 321 }
kazu0o2 14:be4e43ce1578 322 DEBUG("Verification:Register\r\n");
kazu0o2 14:be4e43ce1578 323 for(int i = 0;i<params->len;i+=1){
kazu0o2 14:be4e43ce1578 324 DEBUG("%02x", params->data[i]);
kazu0o2 14:be4e43ce1578 325 DEBUG(":");
kazu0o2 14:be4e43ce1578 326 DEBUG("%02x", password[i]);
kazu0o2 14:be4e43ce1578 327 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 328 if(params->data[i]!= password[i]){
kazu0o2 14:be4e43ce1578 329 DEBUG("認証に失敗しました\r\n");
kazu0o2 14:be4e43ce1578 330 return;
kazu0o2 14:be4e43ce1578 331 }
kazu0o2 14:be4e43ce1578 332 }
kazu0o2 14:be4e43ce1578 333 authenticated=true;
kazu0o2 14:be4e43ce1578 334 stateServicePtr->authStateUpdate(0x01);
kazu0o2 14:be4e43ce1578 335 DEBUG("認証が完了しました\r\n");
kazu0o2 14:be4e43ce1578 336 return;
kazu0o2 14:be4e43ce1578 337 }
kazu0o2 14:be4e43ce1578 338
kazu0o2 14:be4e43ce1578 339 if(!authenticated){
kazu0o2 14:be4e43ce1578 340 //認証が行われていない場合は操作を行わない
kazu0o2 14:be4e43ce1578 341 DEBUG("\r\n認証がされていないため、操作を中止します\r\n");
kazu0o2 14:be4e43ce1578 342 return;
kazu0o2 14:be4e43ce1578 343 }
kazu0o2 14:be4e43ce1578 344
kazu0o2 14:be4e43ce1578 345 if ((params->handle == usbServicePtr->getValueHandle()) && (params->len == 1)) {
kazu0o2 14:be4e43ce1578 346
kazu0o2 14:be4e43ce1578 347 DEBUG("USBService\r\n");
kazu0o2 14:be4e43ce1578 348 DEBUG("length:%d\r\n",params->len);
kazu0o2 14:be4e43ce1578 349 for(int i = 0;i<params->len;i+=1){
kazu0o2 14:be4e43ce1578 350 DEBUG("%d ", params->data[i]);
kazu0o2 14:be4e43ce1578 351 }
kazu0o2 14:be4e43ce1578 352 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 353
mbed_official 2:864ddfb70a9c 354 actuatedLED = *(params->data);
kazu0o2 14:be4e43ce1578 355 stateServicePtr->usbStateUpdate(*(params->data));
kazu0o2 14:be4e43ce1578 356 return;
mbed_official 2:864ddfb70a9c 357 }
mbed_official 2:864ddfb70a9c 358 }
mbed_official 2:864ddfb70a9c 359
mbed_official 2:864ddfb70a9c 360 /**
mbed_official 2:864ddfb70a9c 361 * This function is called when the ble initialization process has failled
kazu0o2 14:be4e43ce1578 362 * BLEの初期化失敗のコールバック
mbed_official 2:864ddfb70a9c 363 */
mbed_official 2:864ddfb70a9c 364 void onBleInitError(BLE &ble, ble_error_t error)
mbed_official 2:864ddfb70a9c 365 {
kazu0o2 14:be4e43ce1578 366 DEBUG("BluetoothError!\r\n");
mbed_official 2:864ddfb70a9c 367 /* Initialization error handling should go here */
mbed_official 2:864ddfb70a9c 368 }
mbed_official 2:864ddfb70a9c 369
mbed_official 2:864ddfb70a9c 370 /**
mbed_official 2:864ddfb70a9c 371 * Callback triggered when the ble initialization process has finished
kazu0o2 14:be4e43ce1578 372 * BLEの初期化が完了したときに呼び出されるコールバック
mbed_official 2:864ddfb70a9c 373 */
mbed_official 2:864ddfb70a9c 374 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
mbed_official 2:864ddfb70a9c 375 {
mbed_official 2:864ddfb70a9c 376 BLE& ble = params->ble;
mbed_official 2:864ddfb70a9c 377 ble_error_t error = params->error;
mbed_official 2:864ddfb70a9c 378
mbed_official 2:864ddfb70a9c 379 if (error != BLE_ERROR_NONE) {
mbed_official 2:864ddfb70a9c 380 /* In case of error, forward the error handling to onBleInitError */
kazu0o2 14:be4e43ce1578 381 /* エラーがあった場合はここから上の'onBleInitError'が呼び出される */
mbed_official 2:864ddfb70a9c 382 onBleInitError(ble, error);
mbed_official 2:864ddfb70a9c 383 return;
mbed_official 2:864ddfb70a9c 384 }
mbed_official 2:864ddfb70a9c 385
mbed_official 2:864ddfb70a9c 386 /* Ensure that it is the default instance of BLE */
kazu0o2 14:be4e43ce1578 387 /* BLEのデフォルトインスタンスであることを確認 */
mbed_official 2:864ddfb70a9c 388 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
mbed_official 2:864ddfb70a9c 389 return;
mbed_official 2:864ddfb70a9c 390 }
mbed_official 2:864ddfb70a9c 391
mbed_official 2:864ddfb70a9c 392 ble.gap().onDisconnection(disconnectionCallback);
kazu0o2 14:be4e43ce1578 393 ble.gap().onConnection(connectionCallback);
mbed_official 2:864ddfb70a9c 394 ble.gattServer().onDataWritten(onDataWrittenCallback);
mbed_official 2:864ddfb70a9c 395
kazu0o2 14:be4e43ce1578 396 bool initialValueForUSBUSBCharacteristic = false;
kazu0o2 14:be4e43ce1578 397 usbServicePtr = new USBService(ble, initialValueForUSBUSBCharacteristic);
kazu0o2 14:be4e43ce1578 398
kazu0o2 14:be4e43ce1578 399 char initialValueForPINPINCharacteristic[] = {0x00,0x00,0x00,0x00,0x00,0x00};
kazu0o2 14:be4e43ce1578 400 pinServicePtr = new PINService(ble, initialValueForPINPINCharacteristic);
kazu0o2 14:be4e43ce1578 401
kazu0o2 14:be4e43ce1578 402 char initialValueForSTATEAUTHCharacteristic = 0x00;
kazu0o2 14:be4e43ce1578 403 char initialValueForSTATEPOWERCharacteristic = 0x00;
kazu0o2 14:be4e43ce1578 404 char initialValueForSTATEUSBCharacteristic = 0x00;
kazu0o2 14:be4e43ce1578 405 stateServicePtr = new STATEService(ble, initialValueForSTATEAUTHCharacteristic, initialValueForSTATEPOWERCharacteristic, initialValueForSTATEUSBCharacteristic);
kazu0o2 14:be4e43ce1578 406
kazu0o2 14:be4e43ce1578 407 char initialValueForINITSETCharacteristic[] = {0x00,0x00,0x00,0x00,0x00,0x00};
kazu0o2 14:be4e43ce1578 408 char initialValueForINITGETCharacteristic = authenticationInformation;
kazu0o2 14:be4e43ce1578 409 initServicePtr = new INITService(ble, initialValueForINITSETCharacteristic,initialValueForINITGETCharacteristic);
mbed_official 2:864ddfb70a9c 410
mbed_official 2:864ddfb70a9c 411 /* setup advertising */
kazu0o2 14:be4e43ce1578 412 /* BLEクライアントへの広告の設定 */
mbed_official 2:864ddfb70a9c 413 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
kazu0o2 14:be4e43ce1578 414 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
mbed_official 2:864ddfb70a9c 415 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
mbed_official 2:864ddfb70a9c 416 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
mbed_official 2:864ddfb70a9c 417 ble.gap().setAdvertisingInterval(1000); /* 1000ms. */
mbed_official 2:864ddfb70a9c 418 ble.gap().startAdvertising();
kazu0o2 14:be4e43ce1578 419
kazu0o2 14:be4e43ce1578 420 DEBUG("BluetoothStart!\r\n");
mbed_official 2:864ddfb70a9c 421 }
mbed_official 2:864ddfb70a9c 422
mbed_official 2:864ddfb70a9c 423 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
mbed_official 2:864ddfb70a9c 424 BLE &ble = BLE::Instance();
mbed_official 11:7404978b24e7 425 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
mbed_official 2:864ddfb70a9c 426 }
mbed_official 2:864ddfb70a9c 427
mbed_official 2:864ddfb70a9c 428 int main()
mbed_official 2:864ddfb70a9c 429 {
kazu0o2 14:be4e43ce1578 430 //SDカードパスワードの取得
kazu0o2 14:be4e43ce1578 431 char charpass;//SDカードから取得されたパスワード
kazu0o2 14:be4e43ce1578 432 FILE *fp = fopen("/sd/sdtest.txt", "r");
kazu0o2 14:be4e43ce1578 433 if(fp == NULL) {
kazu0o2 14:be4e43ce1578 434 DEBUG("Could not open file for write\n");
kazu0o2 14:be4e43ce1578 435 }else{
kazu0o2 14:be4e43ce1578 436 int passwordindex = 0;
kazu0o2 14:be4e43ce1578 437 //パスワードを取り出しパスワード変数へ
kazu0o2 14:be4e43ce1578 438 while( fscanf( fp, "%02x",&charpass ) != EOF ){
kazu0o2 14:be4e43ce1578 439 DEBUG("%02x\r\n",charpass);
kazu0o2 14:be4e43ce1578 440 password[passwordindex] = charpass;
kazu0o2 14:be4e43ce1578 441 passwordindex+=1;
kazu0o2 14:be4e43ce1578 442 }
kazu0o2 14:be4e43ce1578 443 fclose(fp);
kazu0o2 14:be4e43ce1578 444 }
kazu0o2 14:be4e43ce1578 445
kazu0o2 14:be4e43ce1578 446 //起動時の認証情報状態の設定
kazu0o2 14:be4e43ce1578 447 authenticationInformation = false;
kazu0o2 14:be4e43ce1578 448 DEBUG("PasswordLength:%d\r\n",sizeof(password));
kazu0o2 14:be4e43ce1578 449 for(int i = 0;i<sizeof(password);i+=1){
kazu0o2 14:be4e43ce1578 450 DEBUG("%d ", password[i]);
kazu0o2 14:be4e43ce1578 451 if(password[i] != 0x00){
kazu0o2 14:be4e43ce1578 452 authenticationInformation = true;
kazu0o2 14:be4e43ce1578 453 }
kazu0o2 14:be4e43ce1578 454 }
kazu0o2 14:be4e43ce1578 455 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 456
kazu0o2 14:be4e43ce1578 457 powerSwitch.mode(PullUp);//パワー検出コード_スイッチピンをPullUpに
kazu0o2 14:be4e43ce1578 458 powerSwitch.fall(&powerUp);//パワー検出コード_スイッチが押されたときの割り込み処理
kazu0o2 14:be4e43ce1578 459 powerSwitch.rise(&powerDown);//パワー検出コード_スイッチが離されたときの割り込み処理
kazu0o2 14:be4e43ce1578 460
kazu0o2 14:be4e43ce1578 461 resetSwitch.mode(PullUp);//リセットボタン_スイッチピンをPullUpに
kazu0o2 14:be4e43ce1578 462 resetSwitch.rise(&resetDown);//リセットボタン_スイッチが離されたときの割り込み処理
kazu0o2 14:be4e43ce1578 463
mbed_official 11:7404978b24e7 464 eventQueue.call_every(500, blinkCallback);
mbed_official 2:864ddfb70a9c 465
mbed_official 2:864ddfb70a9c 466 BLE &ble = BLE::Instance();
mbed_official 2:864ddfb70a9c 467 ble.onEventsToProcess(scheduleBleEventsProcessing);
mbed_official 2:864ddfb70a9c 468 ble.init(bleInitComplete);
kazu0o2 14:be4e43ce1578 469
kazu0o2 14:be4e43ce1578 470 //パスワード設定情報のBluetoothへの反映
kazu0o2 14:be4e43ce1578 471 if(authenticationInformation){
kazu0o2 14:be4e43ce1578 472 initServicePtr->stateUpdate(0x01);
kazu0o2 14:be4e43ce1578 473 }
mbed_official 2:864ddfb70a9c 474
mbed_official 11:7404978b24e7 475 eventQueue.dispatch_forever();
mbed_official 2:864ddfb70a9c 476
mbed_official 2:864ddfb70a9c 477 return 0;
mbed_official 2:864ddfb70a9c 478 }