Skip to content

Latest commit

 

History

History
272 lines (219 loc) · 12.7 KB

File metadata and controls

272 lines (219 loc) · 12.7 KB
nav 例示
group SESAME SDK
title Android版
order 2

Android版 SesameSDK

Sesame device

アプリのダウンロード

インストール手順

プラットフォームのインストール要件

  • .

1. 依存関係のインストール

   implementation project(':sesame-sdk')

2. manifest.xmlにてAndroid権限の設定

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT " />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />

3. 初期化

   override fun onCreate()
   {
    super.onCreate()
    CHBleManager(this)
   }

CHBleManagerの初期化により、端末のBluetoothが正常に動作しているか、端末からの権限が得られているか、Bluetoothが起動しているかを判断することができます。すべてが正常であれば、Bluetoothのスキャンが開始されます。 Bluetooth Service Uuid:0000FD81-0000-1000-8000-00805f9b34fb

bluetoothAdapter.bluetoothLeScanner.startScan(
  mutableListOf(
    ScanFilter.Builder()
      .setServiceUuid(
        ParcelUuid(UUID.fromString('0000FD81-0000-1000-8000-00805f9b34fb')),
      )
      .build(),
  ),
  ScanSettings.Builder()
    .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
    .build(),
  bleScanner,
);

bleScannerでスキャンしたデバイスをCHDeviceMapに格納します。

4. 新しいデバイスがScanNewDeviceFGオブジェクトに追加され、CHDeviceMapによりAdapterがフィルタリングされ(it.rssi!=nil)リストでデータが表示されます。

    private var mDeviceList = ArrayList<CHDevices>()
    CHBleManager.delegate = object : CHBleManagerDelegate {
            override fun didDiscoverUnRegisteredCHDevices(devices: List<CHDevices>) {
                mDeviceList.clear()
                mDeviceList.addAll(devices.filter { it.rssi != null }
                    .filter { it.rssi!! > -65 }///登録リストは近距離だけを表示
                )
                mDeviceList.sortBy { it.getDistance() }
                mDeviceList.firstOrNull()?.connect { }
                leaderboard_list.post((leaderboard_list.adapter as GenericAdapter<*>)::notifyDataSetChanged)
            }
        }
    }

5. デバイスとの接続はconnectを実行し、onBleDeviceStatusChangedでデバイスの状態を監視します。

    device.connect { }
    doRegisterDevice(device)
    device.delegate = object : CHDeviceStatusDelegate {
        override fun onBleDeviceStatusChanged(device: CHDevices, status: CHDeviceStatus, shadowStatus: CHDeviceStatus?) {
            if (status == CHDeviceStatus.ReadyToRegister) {
                doRegisterDevice(device)
            }
        }
    }


   fun  doRegisterDevice(device: CHDevices){
       device.register {
        it.onSuccess { // 登録成功
        }
        it.onFailure { //  登録失敗
        }
       }
   }

6. 登録成功のコールバックは、device.register登録コマンドの成功または失敗のコールバックにより所属製品のdevice modelを判断できます。

    (device as? CHWifiModule2)?.let {
        // CHWifiModule2
    }
    (device as? CHSesame2)?.let {
        // CHSesame2
    }
    (device as? CHSesame5)?.let {
        // CHSesame5
    }
    (device as? CHSesameTouchPro)?.let {
        // CHSesameTouchPro
    }

7. 鍵の開錠と施錠

ペアリング済みのデバイスが取得できれば、APPを通じて施錠と開錠を実現できます。

施錠

    public func lock(historytag: Data?, result: @escaping (CHResult<CHEmpty>))  {
      if deviceShadowStatus != nil,
         deviceStatus.loginStatus == .unlogined {
          CHIoTManager.shared.sendCommandToWM2(.lock, self) { _ in
              result(.success(CHResultStateNetworks(input: CHEmpty())))
          }
          return
      }
      if (self.checkBle(result)) { return }
      let hisTag = Data.createOS2Histag(historytag ?? self.sesame2KeyData?.historyTag)

      sendCommand(.init(.lock,hisTag)) { responsePayload in
          if responsePayload.cmdResultCode == .success {
              result(.success(CHResultStateBLE(input: CHEmpty())))
          } else {
              result(.failure(self.errorFromResultCode(responsePayload.cmdResultCode)))
          }
      }
  }

開錠

    override fun unlock(historytag: ByteArray?, result: CHResult<CHEmpty>) {
      if (deviceStatus.value == CHDeviceLoginStatus.UnLogin && isConnectedByWM2) {
          CHAccountManager.cmdSesame(SesameItemCode.unlock, this, sesame2KeyData!!.hisTagC(historytag), result)
      } else {
          if (checkBle(result)) return
//        L.d("hcia", "[ss5][unlock] historyTag:" + sesame2KeyData!!.createHistagV2(historyTag).toHexString())
          sendCommand(SesameOS3Payload(SesameItemCode.unlock.value, sesame2KeyData!!.createHistagV2(historytag)), DeviceSegmentType.cipher) { res ->
              if (res.cmdResultCode == SesameResultCode.success.value) {
                  result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty())))
              } else {
                  result.invoke(Result.failure(NSError(res.cmdResultCode.toString(), "CBCentralManager", res.cmdResultCode.toInt())))
              }
          }
      }
  }

8. 通信プロトコル

各指令の対話詳細は BlueToothプロトコル 説明書を参照。

Androidプロジェクトの構造例

以下は、Androidプロジェクトの構造例で、ソースコードとリソースファイルを整理します。

  • libs/:フォルダは、通常、第三者ライブラリ(libraries)のバイナリファイル(.jar、.aarなど)を格納するために用いられます。
  • java/:Javaコードを格納します。機能モジュールごとにサブパッケージを分けます。例えば、activities/はアクティビティクラスを格納し、adapters/はアダプタクラスを格納します。
  • res/:リソースファイルを格納します。これには、レイアウトファイル、文字列、アイコンなどが含まれます。リソースの種類によりディレクトリを分割し、layout/にはレイアウトファイルを、drawable/には画像リソースを、values/には文字列とスタイルリソースを格納します。
  • build.gradle:アプリケーションレベルのGradle設定ファイル。依存関係、プラグイン、ビルド設定を設定します。
  • proguard-rules.pro:ProGuard設定ファイル。コードの難読化や最適化を行います。これはオプションで、リリース版で使用します。

Bluetoothステータスマシン

State Machine

Sesameプロジェクトフレームワーク

UIコンポーネントライブラリリスト

App画面オブジェクトの説明

SesameApp: Applicationプロセススタート
MainActivity: 主App画面
ScanQRcodeFG: 二次元コードスキャン
ScanNewDeviceFG: 新規デバイス追加
WM2SettingFG: WIFIモジュールの設定画面
SSM2SetAngleFG: SS4、SS2 角度設定画面
SSM5SettingFG: SS5、SS5PRO の設定画面
SSM2SettingFG: SS4、SS2 の設定画面
SesameBotSettingFG: SesameBot1 の設定画面
SesameBikeSettingFG: BiKeLock1、BiKeLock2 の設定画面
SesameKeyboardSettingFG: Sesame5 の設定画面
SesameOpenSensorNoBLESettingFG: SSMOpenSensor の設定画面
SesameTouchProSettingFG: SSMTouchPro、SSMTouch、BLEConnector の設定画面
SesameKeyboardCards: NFCカード設定画面
SSMTouchProFingerprint: 指紋設定画面
SesameKeyboardPassCode: 数字パスワード設定画面
SSMTouchProSelectLockerListFG: SSMTouchProデバイス共有画面
GuestKeyListFG: ビジターリスト画面
SSM2NoHandLockFG: 全自動ロック画面
MeFG: ホーム->マイページ画面
MyQrCodeFG: ホーム->マイページ画面->マイQRコード画面
LoginMailFG: ホーム->マイページ画面->登録画面
LoginVerifiCodeFG: ホーム->マイページ画面->登録画面->二次元コードの確認画面 FriendListFG: ホーム->連絡先画面 FriendDetailFG: ホーム->連絡先画面->友達の詳細画面 FriendSelectLockerListFG: ホーム->連絡先画面->友達の詳細画面->共有デバイス画面 DeviceListFG: ホーム->セサミリスト画面 MainRoomFG: ホーム->セサミリスト画面->SS4、SS2 デバイス詳細の履歴レコード MainRoomSS5FG: ホーム->セサミリスト画面->SS5、SS5PRO デバイス詳細の履歴レコード AddMemberFG: ホーム->セサミリスト画面->メンバー追加画面 KeyQrCodeFG: ホーム->セサミリスト画面->セサミ二次元コードQR共有画面 WM2ScanSSIDListFG: ホーム->セサミリスト画面->WIFI詳細->WIFIスキャンリスト画面 WM2SelectLockerListFG: ホーム->セサミリスト画面->WIFI詳細->セサミデバイス選択画面

Android関連の知識