/// <summary> /// デバイスに接続中ダイアログを表示する /// </summary> /// <param name="deviceName">デバイス名</param> private void ShowConnectingDialog(string deviceName) { UpdateDialogAddButton.Show( deviceName + "に接続しています。", useOK: false, useCancel: true, onOK: null, onCancel: () => { BluetoothManager.Instance.Disconnect(); }, positiveItemName: "OK", negativeItemName: "キャンセル"); }
/// <summary> /// デバイスとペアリングする /// </summary> /// <param name="deviceName">デバイス名</param> /// <param name="deviceAdress">デバイスのBLEアドレス</param> /// <param name="index">iOSでのみ使用するデバイス識別番号</param> IEnumerator Parering(string deviceName, string deviceAdress, int index = 0) { if (DeviceActivationStatus == DeviceActivationStatusType.App) { BluetoothManager.Instance.ChangeServiceUUIDToNormal(); } else { BluetoothManager.Instance.ChangeServiceUUIDToFirmwareUpdate(); } //Bluetoothが有効か確認 bool isBluetoothActive = false; yield return(StartCoroutine(CheckBluetoothIsActive((bool isActive) => isBluetoothActive = isActive))); if (!isBluetoothActive) { //Bluetooth無効時 yield break; } //接続できてなければ、接続 if (!UserDataManager.State.isConnectingDevice()) { UpdateDialogAddButton.Show(deviceName + "に接続しています。", false, true, null, () => { //キャンセルボタン押下時 //デバイスとの接続を切る BluetoothManager.Instance.Disconnect(); }, "OK", "キャンセル"); bool isDeviceConnectSuccess = false; yield return(StartCoroutine(DeviceConnect(deviceName, deviceAdress, (bool isSuccess) => isDeviceConnectSuccess = isSuccess, index))); Debug.Log("Connecting_Result:" + isDeviceConnectSuccess); UpdateDialogAddButton.Dismiss(); if (!isDeviceConnectSuccess) { //デバイス接続に失敗すれば 、接続失敗した旨を伝えるダイアログを表示する yield return(StartCoroutine(TellFailedConnect(deviceName))); yield break; } } UpdateDialog.Show("同期中"); // デバイスがアプリ状態なら、バージョンを取得する if (DeviceActivationStatus == DeviceActivationStatusType.App) { //バージョン取得 bool isGetVersionSuccess = false; yield return(StartCoroutine(GetVersion((bool isSuccess) => isGetVersionSuccess = isSuccess))); Debug.Log("GetVersion_Result:" + isGetVersionSuccess); if (!isGetVersionSuccess) { //バージョン取得に失敗すれば UpdateDialog.Dismiss(); //同期に失敗した旨のダイアログを表示する yield return(StartCoroutine(TellFailedSync())); yield break; } } // デバイス状態がアプリならデバイス情報を取得する if (DeviceActivationStatus == DeviceActivationStatusType.App) { //デバイス情報取得 bool isGetDeviceInfoSuccess = false; DateTime deviceTime = DateTime.MinValue; yield return(StartCoroutine(GetDeviceInfo((bool isSuccess, DateTime _deviceTime) => { isGetDeviceInfoSuccess = isSuccess; deviceTime = _deviceTime; }))); Debug.Log("GetDeviceInfo_Result:" + isGetDeviceInfoSuccess); if (!isGetDeviceInfoSuccess) { //デバイス情報取得に失敗すれば UpdateDialog.Dismiss(); //同期に失敗した旨のダイアログを表示する yield return(StartCoroutine(TellFailedSync())); yield break; } //デバイス時刻補正 bool isCorrectDeviceTimeSuccess = false; yield return(StartCoroutine(CorrectDeviceTime((bool isSuccess) => isCorrectDeviceTimeSuccess = isSuccess, deviceTime))); Debug.Log("CorrectDeviceTime_Result:" + isCorrectDeviceTimeSuccess); if (!isCorrectDeviceTimeSuccess) { //デバイス時刻補正に失敗すれば UpdateDialog.Dismiss(); //設定の変更に失敗した旨のダイアログを表示する yield return(StartCoroutine(TellFailedChangeSetting())); yield break; } } UpdateDialog.Dismiss(); //ペアリングが完了した事を記録 UserDataManager.State.SaveDoneDevicePareing(); //接続したデバイスを記憶しておく UserDataManager.Device.SavePareringBLEAdress(deviceAdress); UserDataManager.Device.SavePareringDeviceName(deviceName); //完了ダイアログ表示 yield return(StartCoroutine(ShowPareringCompleteDialog(deviceName))); //データの復元が必要であればデータを復元する if (UserDataManager.State.isNessesaryRestore()) { bool isCompleteRestore = false; if (UserDataManager.State.GetRestoreDataCount() == 0) { //初回復元の場合 FtpFunction.RestoreData(this, () => isCompleteRestore = true); yield return(new WaitUntil(() => isCompleteRestore)); //ファームウェアアップデートが必要か確認する yield return(StartCoroutine(FarmwareVersionCheckFlow())); } else { //復元再開の場合 FtpFunction.ReRestoreData(this, () => isCompleteRestore = true); yield return(new WaitUntil(() => isCompleteRestore)); } } //ホーム画面に遷移 SceneTransitionManager.LoadLevel(SceneTransitionManager.LoadScene.Home); }
//デバイス接続の流れ IEnumerator DeviceConnect(string deviceName, string deviceAdress, Action <bool> onResponse) { UpdateDialogAddButton.Show(deviceName + "に接続しています。", false, true, null, () => { //キャンセルボタン押下時 //デバイスとの接続を切る BluetoothManager.Instance.Disconnect(); }, "OK", "キャンセル"); bool isSuccess = false; //接続成功 bool isFailed = false; //接続失敗 string receiveData = ""; //デバイス接続で成功・失敗時に受け取るデータ(JSONにパースして使用) string uuid = ""; //ペアリング中のデバイスのUUID(iOSでのみ必要) #if UNITY_IOS uuid = UserDataManager.Device.GetPareringDeviceUUID(); #endif BluetoothManager.Instance.Connect( deviceAdress, (string data) => { //エラー時 receiveData = data; isFailed = true; }, (string data) => { //接続完了時 receiveData = data; isSuccess = true; }, uuid); yield return(new WaitUntil(() => isSuccess || isFailed)); //応答待ち if (isSuccess) { //接続成功時 //接続したデバイス情報読み出し var json = Json.Deserialize(receiveData) as Dictionary <string, object>; string name = (string)json["KEY1"]; string adress = (string)json["KEY2"]; //接続したデバイスを記憶しておく UserDataManager.Device.SavePareringBLEAdress(adress); UserDataManager.Device.SavePareringDeviceName(name); UpdateDialogAddButton.Dismiss(); } else { //接続失敗時 var json = Json.Deserialize(receiveData) as Dictionary <string, object>; int error1 = Convert.ToInt32(json["KEY1"]); int error2 = Convert.ToInt32(json["KEY2"]); UpdateDialogAddButton.Dismiss(); #if UNITY_IOS if (error2 == -8) { //iOSの_reconnectionPeripheralコマンドでのみ返ってくる、これ以降接続できる見込みがないときのエラー Debug.Log("Connect_OcuurSeriousError"); //接続を解除 UserDataManager.State.SaveDeviceConnectState(false); //接続が解除された事を伝える DeviceStateManager.Instance.OnDeviceDisConnect(); //ペアリングを解除 UserDataManager.State.ClearDeviceParering(); //ペアリングが解除されたことを伝える DeviceStateManager.Instance.OnDevicePrearingDisConnect(); //接続に失敗した旨のダイアログを表示 yield return(StartCoroutine(TellFailedConnect(deviceName))); //再度ペアリングを要求するダイアログを表示 yield return(StartCoroutine(TellNeccesaryParering())); onResponse(false); yield break; } #endif if (error2 == -3) //何らかの原因で接続できなかった場合(タイムアウト含む) { Debug.Log("OccurAnyError"); } else if (error2 == -4) //接続が切れた場合(GATTサーバには接続できたが、サービスまで全て接続できないと接続完了にはならない。) { Debug.Log("DisConnectedError"); } //接続に失敗した旨のダイアログを表示 yield return(StartCoroutine(TellFailedConnect(deviceName))); } onResponse(isSuccess); }