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

Dependencies:   SDFileSystem MusicEngine

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

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

松葉和仁

Committer:
kazu0o2
Date:
Fri Feb 03 00:38:32 2017 +0000
Revision:
23:64df5e4f1c0c
Parent:
22:ad986f13599d
Child:
24:c0cc460aadef
music change

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