├── app ├── .gitignore ├── src │ └── main │ │ ├── res │ │ ├── drawable │ │ │ ├── bt0.png │ │ │ ├── earth.png │ │ │ ├── pasmo.png │ │ │ ├── suica.png │ │ │ ├── bl_grey.png │ │ │ ├── finger.png │ │ │ ├── app_icon.png │ │ │ ├── bl_green.png │ │ │ ├── face_tips.png │ │ │ ├── gif_finger.gif │ │ │ ├── ic_warning.png │ │ │ ├── icon_lock.png │ │ │ ├── keyboard.png │ │ │ ├── palm_tips.png │ │ │ ├── small_icon.png │ │ │ ├── wifi_green.png │ │ │ ├── wifi_grey.png │ │ │ ├── camera_palm.png │ │ │ ├── facepro_tips.png │ │ │ ├── icon_unlock.png │ │ │ ├── img_knob_3x.png │ │ │ ├── palmpro_tips.png │ │ │ ├── icon_logining.png │ │ │ ├── icon_nosetting.png │ │ │ ├── icon_nosignal.png │ │ │ ├── icon_opensensor.png │ │ │ ├── icon_waitgatt.png │ │ │ ├── swtich_locked.png │ │ │ ├── swtich_logining.png │ │ │ ├── swtich_no_ble.png │ │ │ ├── swtich_unlocked.png │ │ │ ├── swtich_waitgatt.png │ │ │ ├── icon_receiveblee.png │ │ │ ├── matter_sym_rgb_green.png │ │ │ ├── swtich_receive_ble.png │ │ │ ├── search_background.xml │ │ │ ├── dialog_rounded_bg.xml │ │ │ ├── spacer.xml │ │ │ ├── alert_background_dark.xml │ │ │ ├── alert_background_light.xml │ │ │ ├── bg_dialog.xml │ │ │ ├── ic_icons_outlined_me_s.xml │ │ │ ├── ic_tick_select.xml │ │ │ ├── ic_wifi_select.xml │ │ │ ├── ic_world_select.xml │ │ │ ├── ic_icons_outlined_contacts_s.xml │ │ │ ├── svg_arrow_down.xml │ │ │ ├── round_red.xml │ │ │ ├── menu_select.xml │ │ │ ├── ic_arrow.xml │ │ │ ├── ic_arrow_gray.xml │ │ │ ├── svg_bot2_view.xml │ │ │ ├── ic_cloud.xml │ │ │ ├── svg_restart.xml │ │ │ ├── progress_red.xml │ │ │ ├── ic_eye_on.xml │ │ │ ├── ic_icons_outlined_me_y.xml │ │ │ ├── progress_blue.xml │ │ │ ├── ic_search.xml │ │ │ ├── ic_icons_filled_close.xml │ │ │ ├── ic_icons_filled_close_white.xml │ │ │ ├── ic_icon_delete.xml │ │ │ ├── arrow.xml │ │ │ ├── ic_tick_blue.xml │ │ │ ├── ic_tick_grey.xml │ │ │ ├── bg_btn_confirm.xml │ │ │ ├── bg_btn_warning.xml │ │ │ ├── ic_ap_alert.xml │ │ │ ├── round_blue_no.xml │ │ │ ├── ic_icon_unlock_uncheck.xml │ │ │ ├── round_blue.xml │ │ │ ├── ic_icons_filled_album.xml │ │ │ ├── ic_icons_filled_more.xml │ │ │ ├── ic_icons_outlined_share.xml │ │ │ ├── find_friend.xml │ │ │ ├── round_red_unlock_all.xml │ │ │ ├── ic_icon_lock_uncheck.xml │ │ │ ├── round_blue_lock_all.xml │ │ │ ├── ic_keychain_original.xml │ │ │ ├── click_stop.xml │ │ │ ├── ic_eye_off.xml │ │ │ ├── ic_icons_outlined_addoutline.xml │ │ │ ├── ic_icons_outlined_contacts_y.xml │ │ │ └── circular_progress.xml │ │ ├── values │ │ │ ├── ids.xml │ │ │ └── attrs.xml │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher_round.png │ │ │ ├── qrcode_default_scan_line.png │ │ │ └── qrcode_default_grid_scan_line.png │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher_round.png │ │ ├── xml │ │ │ ├── provider_paths.xml │ │ │ └── nfc_tech_filter.xml │ │ ├── color │ │ │ └── tv_color_red_gray.xml │ │ ├── anim │ │ │ ├── fade_in.xml │ │ │ ├── fade_out.xml │ │ │ ├── dispose_center.xml │ │ │ ├── show_up_center.xml │ │ │ ├── show_down_center.xml │ │ │ ├── shake.xml │ │ │ ├── elastic_center.xml │ │ │ ├── overshoot_center.xml │ │ │ ├── modal_out.xml │ │ │ ├── slide_out_up.xml │ │ │ └── slide_in_bottom.xml │ │ ├── layout │ │ │ ├── fg_compose_webview.xml │ │ │ ├── layout_custom_list.xml │ │ │ ├── dialog_wheel_picker.xml │ │ │ ├── adp_bot_item_view.xml │ │ │ ├── action_layout_dark.xml │ │ │ ├── action_layout_light.xml │ │ │ └── pop_layout_copy.xml │ │ ├── animator │ │ │ └── cloud_dowload.xml │ │ ├── navigation │ │ │ └── nav_graph.xml │ │ └── menu │ │ │ └── bottom_nav.xml │ │ ├── assets │ │ └── firmware │ │ │ ├── remote_30_14_625867.zip │ │ │ ├── sesame5_30_5_848a2d.zip │ │ │ ├── sesame_221_0_8c080c.zip │ │ │ ├── sesame_421_4_50ce5b.zip │ │ │ ├── remoten_30_15_d623ac.zip │ │ │ ├── sesame5pro_30_7_848a2d.zip │ │ │ ├── sesame5us_30_16_848a2d.zip │ │ │ ├── sesamebot1_21_2_369eb9.zip │ │ │ ├── opensensor1_30_8_b634a9.zip │ │ │ ├── opensensor2_30_24_b634a9.zip │ │ │ ├── sesame6pro_30_21_07ca91.zip │ │ │ ├── sesamebike1_21_3_d7162a.zip │ │ │ ├── sesamebike2_30_6_990e7f.zip │ │ │ ├── sesamebot2_30_17_990e7f.zip │ │ │ ├── sesameface1_30_19_5c6590.zip │ │ │ ├── bleconnector_30_11_01be3d.zip │ │ │ ├── sesameface1ai_30_23_43ca70.zip │ │ │ ├── sesameface1pro_30_18_5c6590.zip │ │ │ ├── sesametouch1_30_10_5aac19.zip │ │ │ ├── sesametouch1pro_30_9_5aac19.zip │ │ │ └── sesameface1proai_30_22_43ca70.zip │ │ └── java │ │ ├── co │ │ ├── utils │ │ │ ├── alertview │ │ │ │ ├── enums │ │ │ │ │ ├── AlertTheme.kt │ │ │ │ │ ├── AlertStyle.kt │ │ │ │ │ └── AlertActionStyle.kt │ │ │ │ ├── interfaces │ │ │ │ │ └── AlertActionListener.kt │ │ │ │ └── objects │ │ │ │ │ └── AlertAction.kt │ │ │ ├── materialtextfield │ │ │ │ └── custom │ │ │ │ │ └── AnimatedRectF.kt │ │ │ ├── balloon │ │ │ │ ├── ArrowOrientation.kt │ │ │ │ ├── OnBalloonDismissListener.kt │ │ │ │ ├── BalloonAnimation.kt │ │ │ │ ├── OnBalloonClickListener.kt │ │ │ │ └── OnBalloonOutsideTouchListener.kt │ │ │ └── ContainerPaddingManager.kt │ │ └── candyhouse │ │ │ ├── server │ │ │ ├── dto │ │ │ │ ├── IrDeviceDeleteRequest.kt │ │ │ │ ├── IrDeviceStateRequest.kt │ │ │ │ ├── IrDeviceModifyRequest.kt │ │ │ │ ├── IrMatchCodeRequest.kt │ │ │ │ ├── IrRemoteInfoRespond.kt │ │ │ │ ├── IrDeviceRemoteKeyRequest.kt │ │ │ │ ├── IrDeviceAddRequest.kt │ │ │ │ └── IrLearnedDataAddRequest.kt │ │ │ └── CHIRAPIClient.kt │ │ │ └── app │ │ │ ├── base │ │ │ └── view │ │ │ │ └── IBaseView.kt │ │ │ ├── tabs │ │ │ └── devices │ │ │ │ ├── hub3 │ │ │ │ └── adapter │ │ │ │ │ └── provider │ │ │ │ │ ├── Ssm2DevicesAdapterProvider.kt │ │ │ │ │ └── Hub3IrAdapterProvider.kt │ │ │ │ ├── model │ │ │ │ └── CHLoginViewModel.kt │ │ │ │ └── ssmbike │ │ │ │ └── setting │ │ │ │ └── SesameBikeSettingFG.kt │ │ │ ├── App.kt │ │ │ └── ext │ │ │ ├── AppLifecycleObserver.kt │ │ │ └── TokenManager.kt │ │ └── cn │ │ └── bingoogolapple │ │ └── qrcode │ │ └── core │ │ ├── BGScanResult.java │ │ └── BarcodeType.java └── google-services.json ├── doc ├── class │ ├── CHSesameLock_jp.md │ ├── CHSesameTouchProDelegate_jp.md │ ├── a.jpg │ ├── CHBleManager .md │ ├── utils.md │ ├── CHDeviceLoginStatus_jp.md │ ├── CHSesameOS3Publish_jp.md │ ├── CHSesameOS3Publish.md │ ├── CHSesameBike2.md │ ├── CHSesameBike2_jp.md │ ├── CHSesameBike_jp.md │ ├── CHSesameBike.md │ ├── CHDeviceLoginStatus.md │ ├── NSError.md │ ├── NSError_jp.md │ ├── CHWifiModule2MechSettings.md │ ├── SesameBleReceiver.md │ ├── CHWifiModule2MechSettings_jp.md │ ├── SesameOS3Payload.md │ ├── SesameOS3Payload_jp.md │ ├── CHSesameSensorDelegate.md │ ├── CHDeviceStatusDelegate_jp.md │ ├── SesameBleTransmit.md │ ├── CHDeviceStatusDelegate.md │ ├── CHSesameSensorDelegate_jp.md │ ├── CHSesameConnector.md │ ├── SSM3PublishPayload.md │ ├── SesameBleTransmit_jp.md │ ├── CHSesameConnector_jp.md │ ├── DeviceSegmentType_jp.md │ ├── CHBaseAdv.md │ ├── SesameNotifypayload.md │ ├── SSM3PublishPayload_jp.md │ ├── CHWifiModule2_jp.md │ ├── SSM2OpCode_jp.md │ ├── CHSesameSensor.md │ ├── DeviceSegmentType.md │ ├── CHDeviceUtil_jp.md │ ├── CHSesameLock.md │ ├── CHBaseAdv_jp.md │ ├── CHSesameSensor_jp.md │ ├── CHDeviceUtil.md │ ├── SSM2ResponsePayload.md │ ├── SSM3ResponsePayload.md │ ├── SesameNotifypayload_jp.md │ ├── CHSesameBotMechSettings.md │ ├── SSM2ResponsePayload_jp.md │ ├── SSM3ResponsePayload_jp.md │ ├── CHSesameBike2MechStatus.md │ ├── CHSesameBike2MechStatus_jp.md │ ├── CHSesameTouchCard.md │ └── CHSesameTouchCard_jp.md ├── bleconnect │ ├── randomcode.puml │ ├── SesameOs3.jpg │ ├── timestamp.puml │ ├── login.puml │ ├── data_send.puml │ ├── register.puml │ ├── data_receive.puml │ └── timestamp.md ├── bleprotocol │ ├── firmware.png │ ├── firmwareUpgradation.md │ └── firmwareUpgradation_ja.md ├── img │ └── SesameSDK_20231201.png ├── command │ ├── autolock.puml │ ├── magnet.puml │ ├── reset.puml │ ├── unlock.puml │ ├── ssm5version.puml │ ├── lock.puml │ ├── history.puml │ ├── configureLockPosition.puml │ ├── sesame_open_sensor_jp.md │ ├── sesame_open_sensor.md │ ├── sesamebike2fun.md │ ├── sesamebike2fun_jp.md │ ├── magnet_jp.md │ ├── magnet.md │ ├── sesameblot.md │ ├── autolock_jp.md │ ├── autolock.md │ ├── reset_jp.md │ └── reset.md ├── wm2 │ ├── finger_get.puml │ ├── setwifipw_jp.md │ └── setwifipw.md ├── touch │ ├── finger_get.puml │ ├── card_last.md │ ├── finger_delete_jp.md │ ├── card_delete.md │ ├── kbpc_delete_jp.md │ ├── kbpc_mode_get_jp.md │ ├── card_delete_jp.md │ ├── card_model_get.md │ ├── finger_mode_set_jp.md │ ├── finger_delete.md │ ├── card_model_get_jp.md │ ├── card_model_set_jp.md │ ├── finger_mode_get_jp.md │ ├── kbpc_delete.md │ ├── kbpc_mode_set_jp.md │ ├── finger_mode_get.md │ ├── kbpc_mode_get.md │ ├── card_model_set.md │ └── finger_mode_set.md ├── sesame_code_ja.md ├── sesame_code.md ├── encryption │ └── ble_encryption.puml ├── sesame_code_cls.md ├── sesame_code_cls_ja.md ├── ble_product_serials.md ├── ble_product_serials_jp.md ├── product_structure.md └── product_structure_ja.md ├── sesame-sdk ├── .gitignore └── src │ └── main │ └── java │ └── co │ └── candyhouse │ └── sesame │ ├── server │ ├── CHPrivateHub3WebSocketClient.kt │ ├── dto │ │ ├── CHBatteryDataReq.kt │ │ ├── CHHistoryUploadRes.kt │ │ ├── CHSS2RegisterRes.kt │ │ ├── CHSS2RegisterReq.kt │ │ ├── SubscriptionRequest.kt │ │ ├── AuthenticationDataWrapper.kt │ │ ├── CHFaceNameRequest.kt │ │ ├── CHPalmNameRequest.kt │ │ ├── CHCardNameRequest.kt │ │ ├── CHHistoryUploadRequest.kt │ │ ├── CHFingerPrintNameRequest.kt │ │ ├── CHKeyBoardPassCodeNameRequest.kt │ │ ├── CredentialListResponse.kt │ │ └── CHSesameShadow.kt │ ├── HttpRespondCode.kt │ └── CHIotManagerPublic.kt │ ├── open │ ├── device │ │ ├── sesameBiometric │ │ │ └── capability │ │ │ │ ├── openSensor │ │ │ │ ├── CHOpenSensorCapable.kt │ │ │ │ └── CHOpenSensorCapableImpl.kt │ │ │ │ ├── baseCapbale │ │ │ │ ├── CHEventHandler.kt │ │ │ │ ├── CHBaseCapability.kt │ │ │ │ ├── CHEventCapability.kt │ │ │ │ ├── CHCapabilitySupport.kt │ │ │ │ └── CHDataSynchronizeCapable.kt │ │ │ │ ├── connect │ │ │ │ ├── CHDeviceConnectDelegate.kt │ │ │ │ └── CHDeviceConnectCapable.kt │ │ │ │ ├── remoteNano │ │ │ │ ├── CHRemoteNanoDelegate.kt │ │ │ │ └── CHRemoteNanoCapable.kt │ │ │ │ ├── card │ │ │ │ └── CHCardDelegate.kt │ │ │ │ ├── passcode │ │ │ │ └── CHPassCodeDelegate.kt │ │ │ │ ├── face │ │ │ │ ├── CHFaceDelegate.kt │ │ │ │ └── CHFaceCapable.kt │ │ │ │ ├── fingerPrint │ │ │ │ └── CHFingerPrintDelegate.kt │ │ │ │ └── palm │ │ │ │ ├── CHPalmDelegate.kt │ │ │ │ └── CHPalmCapable.kt │ │ ├── CHSesameBike.kt │ │ └── CHSesameBike2.kt │ └── CHConfiguration.kt │ ├── utils │ ├── aescmac │ │ └── MAC.kt │ └── EventExtensions.kt │ ├── ble │ └── os2 │ │ └── base │ │ └── CHSesameOS2.kt │ └── BaseFG.kt ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── install_start.sh ├── app.properties └── settings.gradle /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /doc/class/CHSesameLock_jp.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sesame-sdk/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /doc/class/CHSesameTouchProDelegate_jp.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /doc/class/a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/doc/class/a.jpg -------------------------------------------------------------------------------- /doc/bleconnect/randomcode.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | Device --> APP: response_command(8,14,randomcode) 4 | @enduml 5 | -------------------------------------------------------------------------------- /doc/bleconnect/SesameOs3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/doc/bleconnect/SesameOs3.jpg -------------------------------------------------------------------------------- /doc/bleprotocol/firmware.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/doc/bleprotocol/firmware.png -------------------------------------------------------------------------------- /doc/img/SesameSDK_20231201.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/doc/img/SesameSDK_20231201.png -------------------------------------------------------------------------------- /doc/command/autolock.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | APP -> Device: send_command(6,89) 3 | Device --> APP: response_command(6,7,89,status) 4 | @enduml 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bt0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/bt0.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/earth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/earth.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/pasmo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/pasmo.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/suica.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/suica.png -------------------------------------------------------------------------------- /doc/command/magnet.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | APP -> Device: send_command(17) 3 | Device --> APP: response_command(response,command,status) 4 | @enduml 5 | -------------------------------------------------------------------------------- /doc/command/reset.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | APP -> Device: send_command(104) 3 | Device --> APP: response_command(response,command,status) 4 | @enduml 5 | -------------------------------------------------------------------------------- /doc/command/unlock.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | APP -> Device: send_command(3,80,payload)) 3 | Device --> APP: response_command(3,7,80,status) 4 | @enduml 5 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/drawable/bl_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/bl_grey.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/finger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/finger.png -------------------------------------------------------------------------------- /doc/command/ssm5version.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | APP -> Device: send_command(5) 3 | Device --> APP: response_command(response,command,status) 4 | @enduml 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/app_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/app_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bl_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/bl_green.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/face_tips.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/face_tips.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/gif_finger.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/gif_finger.gif -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/ic_warning.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/icon_lock.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/keyboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/keyboard.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/palm_tips.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/palm_tips.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/small_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/small_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/wifi_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/wifi_green.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/wifi_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/wifi_grey.png -------------------------------------------------------------------------------- /doc/command/lock.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | APP -> Device: send_command(82,historyTag)) 3 | Device --> APP: response_command(response,command,status) 4 | @enduml 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/camera_palm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/camera_palm.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/facepro_tips.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/facepro_tips.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_unlock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/icon_unlock.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_knob_3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/img_knob_3x.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/palmpro_tips.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/palmpro_tips.png -------------------------------------------------------------------------------- /app/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /doc/bleconnect/timestamp.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | APP -> Device: send_command(8,timestamp) 3 | Device --> APP: response_command(response,command,status) 4 | @enduml 5 | -------------------------------------------------------------------------------- /doc/command/history.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | APP -> Device: send_command(4,isPeek)) 3 | Device --> APP: response_command(response,command,status,payload) 4 | @enduml 5 | -------------------------------------------------------------------------------- /doc/wm2/finger_get.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | APP --> Device: send_command(3,ssid_name) 3 | Device --> APP: response_command(7,3,status) 4 | 5 | 6 | 7 | @enduml 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_logining.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/icon_logining.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_nosetting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/icon_nosetting.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_nosignal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/icon_nosignal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_opensensor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/icon_opensensor.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_waitgatt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/icon_waitgatt.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/swtich_locked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/swtich_locked.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/swtich_logining.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/swtich_logining.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/swtich_no_ble.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/swtich_no_ble.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/swtich_unlocked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/swtich_unlocked.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/swtich_waitgatt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/swtich_waitgatt.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/icon_receiveblee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/icon_receiveblee.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/matter_sym_rgb_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/matter_sym_rgb_green.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/swtich_receive_ble.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/drawable/swtich_receive_ble.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/CHPrivateHub3WebSocketClient.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server 2 | 3 | interface CHPrivateHub3WebSocketClient { 4 | } -------------------------------------------------------------------------------- /app/src/main/assets/firmware/remote_30_14_625867.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/remote_30_14_625867.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/sesame5_30_5_848a2d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/sesame5_30_5_848a2d.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/sesame_221_0_8c080c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/sesame_221_0_8c080c.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/sesame_421_4_50ce5b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/sesame_421_4_50ce5b.zip -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/assets/firmware/remoten_30_15_d623ac.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/remoten_30_15_d623ac.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/sesame5pro_30_7_848a2d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/sesame5pro_30_7_848a2d.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/sesame5us_30_16_848a2d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/sesame5us_30_16_848a2d.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/sesamebot1_21_2_369eb9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/sesamebot1_21_2_369eb9.zip -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/dto/CHBatteryDataReq.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server.dto 2 | 3 | internal data class CHBatteryDataReq(var payload: String) 4 | -------------------------------------------------------------------------------- /app/src/main/assets/firmware/opensensor1_30_8_b634a9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/opensensor1_30_8_b634a9.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/opensensor2_30_24_b634a9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/opensensor2_30_24_b634a9.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/sesame6pro_30_21_07ca91.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/sesame6pro_30_21_07ca91.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/sesamebike1_21_3_d7162a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/sesamebike1_21_3_d7162a.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/sesamebike2_30_6_990e7f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/sesamebike2_30_6_990e7f.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/sesamebot2_30_17_990e7f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/sesamebot2_30_17_990e7f.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/sesameface1_30_19_5c6590.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/sesameface1_30_19_5c6590.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/bleconnector_30_11_01be3d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/bleconnector_30_11_01be3d.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/sesameface1ai_30_23_43ca70.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/sesameface1ai_30_23_43ca70.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/sesameface1pro_30_18_5c6590.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/sesameface1pro_30_18_5c6590.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/sesametouch1_30_10_5aac19.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/sesametouch1_30_10_5aac19.zip -------------------------------------------------------------------------------- /app/src/main/assets/firmware/sesametouch1pro_30_9_5aac19.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/sesametouch1pro_30_9_5aac19.zip -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/qrcode_default_scan_line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/mipmap-xxhdpi/qrcode_default_scan_line.png -------------------------------------------------------------------------------- /app/src/main/assets/firmware/sesameface1proai_30_22_43ca70.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/assets/firmware/sesameface1proai_30_22_43ca70.zip -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/qrcode_default_grid_scan_line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CANDY-HOUSE/SesameSDK_Android_with_DemoApp/HEAD/app/src/main/res/mipmap-xxhdpi/qrcode_default_grid_scan_line.png -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/dto/CHHistoryUploadRes.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server.dto 2 | 3 | data class CHHistoryUploadRes( 4 | var r: String? 5 | ) 6 | class CHEmpty 7 | -------------------------------------------------------------------------------- /app/src/main/java/co/utils/alertview/enums/AlertTheme.kt: -------------------------------------------------------------------------------- 1 | package co.utils.alertview.enums 2 | 3 | /** 4 | * Created by hammad.akram on 3/14/18. 5 | */ 6 | enum class AlertTheme { 7 | LIGHT, 8 | DARK 9 | } -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/openSensor/CHOpenSensorCapable.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.openSensor 2 | 3 | class CHOpenSensorCapable { 4 | } -------------------------------------------------------------------------------- /app/src/main/java/co/utils/alertview/enums/AlertStyle.kt: -------------------------------------------------------------------------------- 1 | package co.utils.alertview.enums 2 | 3 | /** 4 | * Created by hammad.akram on 3/14/18. 5 | */ 6 | enum class AlertStyle { 7 | BOTTOM_SHEET, 8 | DIALOG, 9 | IOS 10 | } -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/openSensor/CHOpenSensorCapableImpl.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.openSensor 2 | 3 | class CHOpenSensorCapableImpl { 4 | } -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/server/dto/IrDeviceDeleteRequest.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.server.dto 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class IrDeviceDeleteRequest( 6 | @SerializedName("uuid") val uuid: String 7 | ) -------------------------------------------------------------------------------- /app/src/main/res/drawable/search_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/dto/CHSS2RegisterRes.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server.dto 2 | 3 | data class CHSS2RegisterRes( 4 | var sig1: String, 5 | var st: String, 6 | var pubkey: String 7 | ) 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/java/co/utils/alertview/enums/AlertActionStyle.kt: -------------------------------------------------------------------------------- 1 | package co.utils.alertview.enums 2 | 3 | /** 4 | * Created by hammad.akram on 3/14/18. 5 | */ 6 | enum class AlertActionStyle { 7 | POSITIVE, 8 | NEGATIVE, 9 | DEFAULT 10 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/dialog_rounded_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /doc/class/CHBleManager .md: -------------------------------------------------------------------------------- 1 |
CHBleManager 2 | 3 | ``` 4 | object CHBleManager { 5 | init {} 6 | internal lateinit var appContext: Context 7 | 8 | operator fun invoke(appContext: Context) 9 | } 10 | 11 | ``` 12 |
13 | -------------------------------------------------------------------------------- /app/src/main/java/co/utils/materialtextfield/custom/AnimatedRectF.kt: -------------------------------------------------------------------------------- 1 | package co.utils.materialtextfield.custom 2 | 3 | import android.graphics.RectF 4 | 5 | class AnimatedRectF(left: Float, top: Float, right: Float, bottom: Float) : RectF(left, top, right, bottom) 6 | 7 | 8 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/HttpRespondCode.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server 2 | 3 | object HttpRespondCode { 4 | const val OK = 200 5 | const val RUN_ERROR = 404 6 | const val DATA_NOT_ALLOWED = 405 7 | const val UNKNOWN = 999 8 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/spacer.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Oct 14 18:15:06 CST 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /doc/command/configureLockPosition.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | APP -> Device: send_command(autolock_second,unlock_angle,lock_angle,command) 4 | Device --> APP: response_command(response,command,status) 5 | Device --> APP: response_command(autolock_second,unlock_angle,lock_angle,command) 6 | @enduml 7 | -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/server/dto/IrDeviceStateRequest.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.server.dto 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class IrDeviceStateRequest( 6 | @SerializedName("uuid") val uuid: String, 7 | @SerializedName("state") val state: String 8 | ) -------------------------------------------------------------------------------- /app/src/main/res/drawable/alert_background_dark.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/alert_background_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /doc/class/utils.md: -------------------------------------------------------------------------------- 1 | # co.candyhouse.sesame.utils 2 |
3 | 4 | L:项目debug日志输出 5 | 6 | 7 | 8 | ```svg 9 | 10 | ``` 11 | 12 |
13 |
14 | 15 | Ecckey:通过ECDH算法生成共享公钥 16 | 17 | 18 | 19 | ```svg 20 | 21 | ``` 22 | 23 |
-------------------------------------------------------------------------------- /app/src/main/res/color/tv_color_red_gray.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/anim/fade_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/fade_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | -------------------------------------------------------------------------------- /doc/touch/finger_get.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | APP --> Device: send_command(109) 3 | Device --> APP: response_command(7,109,status) 4 | Device -> APP:推送开始 response_command(8,112,status) 5 | Device -> APP:推送 response_command(8,110,status) 6 | Device -> APP:推送结束 response_command(8,111,status) 7 | 8 | 9 | @enduml 10 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/CHConfiguration.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open 2 | 3 | import co.candyhouse.sesame.BuildConfig 4 | 5 | object CHConfiguration { 6 | const val CLIENT_ID: String = BuildConfig.API_GATEWAY_CLIENT_ID 7 | const val API_KEY: String = BuildConfig.API_GATEWAY_API_KEY 8 | } -------------------------------------------------------------------------------- /app/src/main/java/co/utils/alertview/interfaces/AlertActionListener.kt: -------------------------------------------------------------------------------- 1 | package co.utils.alertview.interfaces 2 | 3 | import co.utils.alertview.objects.AlertAction 4 | 5 | /** 6 | * Created by hammad.akram on 3/14/18. 7 | */ 8 | 9 | interface AlertActionListener { 10 | fun onActionClick(action: AlertAction) 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icons_outlined_me_s.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tick_select.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_wifi_select.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_world_select.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icons_outlined_contacts_s.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/CHSesameBike.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device 2 | 3 | import co.candyhouse.sesame.open.CHResult 4 | import co.candyhouse.sesame.server.dto.CHEmpty 5 | 6 | interface CHSesameBike : CHSesameLock { 7 | fun unlock(historytag: ByteArray? = null, result: CHResult) 8 | } 9 | 10 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/CHIotManagerPublic.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server 2 | 3 | /** 4 | * 公共访问器类 5 | * 6 | * @author frey on 2025/4/17 7 | */ 8 | object CHIotManagerPublic { 9 | /** 10 | * 启动IoT连接 11 | */ 12 | fun startConnection() { 13 | CHIotManager.startConnection() 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/app/base/view/IBaseView.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.app.base.view 2 | 3 | import android.view.View 4 | 5 | /** 6 | * UI基本视图 7 | * 8 | * @author frey on 2025/3/31 9 | */ 10 | interface IBaseView { 11 | 12 | fun setupUI() 13 | 14 | fun setupListeners() 15 | 16 | fun observeViewModelData(view: T) 17 | } -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/dto/CHSS2RegisterReq.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server.dto 2 | 3 | internal data class CHSS2RegisterReq(var s1: CHSS2RegisterReqSig1) 4 | internal data class CHSS2RegisterReqSig1(var ak: String, var n: String, var e: String, var t: String) 5 | internal data class CHOS3RegisterReq(var t: String, var pk: String) 6 | -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/app/tabs/devices/hub3/adapter/provider/Ssm2DevicesAdapterProvider.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.app.tabs.devices.hub3.adapter.provider 2 | 3 | /** 4 | * 5 | * 6 | * @author frey on 2025/4/10 7 | */ 8 | interface Ssm2DevicesAdapterProvider { 9 | fun getDeviceNameByIdNew(id: String): String? 10 | 11 | fun removeSesame(id: String) 12 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/dispose_center.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/anim/show_up_center.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/svg_arrow_down.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/anim/show_down_center.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_red.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/dto/SubscriptionRequest.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server.dto 2 | 3 | /** 4 | * 订阅主题 5 | * 6 | * @author frey on 2025/5/15 7 | */ 8 | data class SubscriptionRequest( 9 | val action: String, 10 | val topicName: String, 11 | val pushToken: String, 12 | val appIdentifyId: String, 13 | val platform: String 14 | ) 15 | -------------------------------------------------------------------------------- /doc/class/CHDeviceLoginStatus_jp.md: -------------------------------------------------------------------------------- 1 | # CHDeviceLoginStatus 列挙型 2 | 3 | `CHDeviceLoginStatus` は、デバイスのログイン状態を表す列挙型です。この列挙型には、2つの列挙定数が含まれています。 4 | 5 | 以下に各列挙定数の意味が示されています: 6 | 7 | | 列挙定数 | 意味 | 8 | | :--------- | :------------- | 9 | | `Login` | デバイスはログイン済みです | 10 | | `UnLogin` | デバイスはログインされていません | 11 | 12 | 通常、この列挙型はデバイスの具体的な状態 (`CHDeviceStatus`) と関連付けられ、特定の状態でのデバイスのログイン状況を示します。 13 | -------------------------------------------------------------------------------- /app/src/main/res/anim/shake.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/app/tabs/devices/model/CHLoginViewModel.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.app.tabs.devices.model 2 | 3 | import androidx.lifecycle.ViewModel 4 | import com.amazonaws.mobile.client.UserState 5 | import kotlinx.coroutines.flow.MutableStateFlow 6 | 7 | class CHLoginViewModel : ViewModel() { 8 | val gUserState = MutableStateFlow(UserState.UNKNOWN) 9 | var isJustLogin = false 10 | } 11 | -------------------------------------------------------------------------------- /doc/bleconnect/login.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | APP-->Device: connect Ble 3 | APP<--Device: response(14,random_code) 4 | 5 | APP->APP: 使用AesCmac(secretKey本地存储).computeMac(random_code)算法生成->sessionAuth 6 | APP->APP:sessionAuth和random_code作为AESCCM的key、Message创建加密对象->cipher(对Ble数据传输加密解密) 7 | 8 | APP -> Device: send_command(2,sessionAuth)) 9 | Device --> APP: response_command(7,2,status,timestamp) 10 | 11 | 12 | 13 | @enduml 14 | -------------------------------------------------------------------------------- /doc/class/CHSesameOS3Publish_jp.md: -------------------------------------------------------------------------------- 1 | # CHSesameOS3Publish インターフェースのドキュメント 2 | ```svg 3 | interface CHSesameOS3Publish { 4 | fun onGattSesamePublish(receivePayload: SSM3PublishPayload) 5 | } 6 | 7 | ``` 8 | `CHSesameOS3Publish` は、インターフェースです。 9 | 10 | ## メソッド 11 | 12 | - `onGattSesamePublish(receivePayload: SSM3PublishPayload)`:このメソッドは実装が必要なメソッドで、`SSM3PublishPayload` 型の引数 `receivePayload` を受け取り、受信したパブリッシュのペイロードを処理します。 13 | -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/app/tabs/devices/hub3/adapter/provider/Hub3IrAdapterProvider.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.app.tabs.devices.hub3.adapter.provider 2 | 3 | import co.candyhouse.app.tabs.devices.hub3.setting.ir.bean.IrRemote 4 | 5 | /** 6 | * 7 | * 8 | * @author frey on 2025/4/10 9 | */ 10 | interface Hub3IrAdapterProvider { 11 | 12 | fun performRemote(data: IrRemote) 13 | fun deleteIRDevice(data: IrRemote) 14 | } -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/baseCapbale/CHEventHandler.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.baseCapbale 2 | 3 | import co.candyhouse.sesame.ble.SSM3PublishPayload 4 | import co.candyhouse.sesame.open.device.CHSesameConnector 5 | 6 | interface CHEventHandler { 7 | fun handleEvent(device: CHSesameConnector, payload: SSM3PublishPayload): Boolean 8 | } -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/server/dto/IrDeviceModifyRequest.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.server.dto 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class IrDeviceModifyRequest( 6 | @SerializedName("uuid") val uuid: String, 7 | @SerializedName("alias") val alias: String 8 | ) { 9 | override fun toString(): String { 10 | return "IrDeviceModifyRequest(uuid='$uuid', alias='$alias')" 11 | } 12 | } -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/server/dto/IrMatchCodeRequest.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.server.dto 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class IrMatchCodeRequest( 6 | @SerializedName("irWave") val irWave: String, 7 | @SerializedName("irWaveLength") val irWaveLength: Int, 8 | @SerializedName("type") val type: Int, 9 | @SerializedName("brandName") val brandName: String, 10 | ) { 11 | 12 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/fg_compose_webview.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/menu_select.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /doc/class/CHSesameOS3Publish.md: -------------------------------------------------------------------------------- 1 | # CHSesameOS3Publish インターフェース 2 | 3 | ```svg 4 | interface CHSesameOS3Publish { 5 | fun onGattSesamePublish(receivePayload: SSM3PublishPayload) 6 | } 7 | 8 | ``` 9 | 10 | 11 | 12 | `CHSesameOS3Publish` はインターフェースです。 13 | 14 | ## メソッド 15 | 16 | - `onGattSesamePublish(receivePayload: SSM3PublishPayload)`:このメソッドは実装する必要があります。`SSM3PublishPayload`型の引数`receivePayload`を受取り、受信したPublishPayloadを処理します。 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/anim/elastic_center.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/anim/overshoot_center.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_gray.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /doc/class/CHSesameBike2.md: -------------------------------------------------------------------------------- 1 | 2 | # CHSesameBike2 インターフェイス 3 | ```svg 4 | 5 | interface CHSesameBike2 : CHSesameLock { 6 | 7 | fun unlock(tag: ByteArray? = null, result: CHResult) 8 | } 9 | 10 | ``` 11 | `CHSesameBike2` は`CHSesameLock` インターフェースを継承したデバイスインターフェースで、Sesame Bike2 ロックのデバイスの管理と操作を行います。 12 | 13 | ## メソッド 14 | 15 | - `fun unlock(tag: ByteArray? = null, result: CHResult)` - デバイスのロックを解除します。操作が成功した場合は操作結果を返し、それ以外の場合はエラーメッセージを返します。 16 | 17 | -------------------------------------------------------------------------------- /doc/class/CHSesameBike2_jp.md: -------------------------------------------------------------------------------- 1 | # CHSesameBike2 インターフェースのドキュメント 2 | ```svg 3 | 4 | interface CHSesameBike2 : CHSesameLock { 5 | 6 | fun unlock(tag: ByteArray? = null, result: CHResult) 7 | } 8 | 9 | ``` 10 | `CHSesameBike2` は、デバイス接口であり、`CHSesameLock` インターフェースを継承しています。Sesame Bike2 ロックデバイスの管理と操作を担当します。 11 | 12 | ## メソッド 13 | 14 | - `fun unlock(tag: ByteArray? = null, result: CHResult)` - デバイスをアンロックします。操作が成功した場合、操作結果を返します。それ以外の場合はエラーメッセージを返します。 15 | -------------------------------------------------------------------------------- /doc/class/CHSesameBike_jp.md: -------------------------------------------------------------------------------- 1 | # CHSesameBike インターフェースのドキュメント 2 | ```svg 3 | 4 | 5 | interface CHSesameBike : CHSesameLock { 6 | fun unlock(historytag: ByteArray? = null, result: CHResult) 7 | } 8 | ``` 9 | `CHSesameBike` は、デバイス接口であり、`CHSesameLock` インターフェースを継承しています。Sesame Bike ロックデバイスの管理と操作を担当します。 10 | 11 | ## メソッド 12 | 13 | - `fun unlock(historytag: ByteArray? = null, result: CHResult)` - デバイスをアンロックします。操作が成功した場合、操作結果を返します。それ以外の場合はエラーメッセージを返します。 14 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/connect/CHDeviceConnectDelegate.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.connect 2 | 3 | import co.candyhouse.sesame.open.device.CHSesameConnector 4 | 5 | interface CHDeviceConnectDelegate { 6 | fun onSSM2KeysChanged(device: CHSesameConnector, ssm2keys: Map) 7 | fun onRadarReceive(device: CHSesameConnector, payload: ByteArray){} 8 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/svg_bot2_view.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /doc/class/CHSesameBike.md: -------------------------------------------------------------------------------- 1 | 2 | # CHSesameBike インターフェイス 3 | ```svg 4 | 5 | 6 | interface CHSesameBike : CHSesameLock { 7 | fun unlock(historytag: ByteArray? = null, result: CHResult) 8 | } 9 | ``` 10 | `CHSesameBike` は `CHSesameLock` インターフェースを継承したデバイスインターフェースで、Sesame Bike ロックのデバイスの管理と操作を行います。 11 | 12 | ## メソッド 13 | 14 | - `fun unlock(historytag: ByteArray? = null, result: CHResult)` - デバイスのロックを解除します。操作が成功した場合は操作結果を返し、それ以外の場合はエラーメッセージを返します。 15 | 16 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/baseCapbale/CHBaseCapability.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.baseCapbale 2 | 3 | /** 4 | * 基础能力接口 5 | * 定义所有能力共有的方法 6 | */ 7 | interface CHBaseCapability { 8 | /** 9 | * 初始化能力 10 | */ 11 | fun initialize(support: CHCapabilitySupport) 12 | 13 | /** 14 | * 检查是否已初始化 15 | */ 16 | fun isInitialized(): Boolean 17 | } -------------------------------------------------------------------------------- /doc/class/CHDeviceLoginStatus.md: -------------------------------------------------------------------------------- 1 | # CHDeviceLoginStatus 列挙型クラス 2 | ```svg 3 | 4 | enum class CHDeviceLoginStatus { 5 | Login, UnLogin, 6 | } 7 | ``` 8 | 9 | 10 | 11 | `CHDeviceLoginStatus` は、デバイスのログイン状態を表す列挙型クラスです。この列挙型には、2つの列挙定数が含まれています。 12 | 13 | 以下は2つの列挙定数の意味です。 14 | 15 | | 列挙定数 | 意味 | 16 | | :----- | :----- | 17 | | `Login` | デバイスはログインしている。 | 18 | | `UnLogin` | デバイスはログインしていない。 | 19 | 20 | この列挙型クラスは通常、デバイスの具体的な状態(`CHDeviceStatus`)と関連しており、デバイスが特定の状態でのログイン状況を表します。 21 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/baseCapbale/CHEventCapability.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.baseCapbale 2 | 3 | /** 4 | * 事件处理能力接口 5 | * 提供事件代理管理功能 6 | */ 7 | interface CHEventCapability { 8 | /** 9 | * 注册事件代理 10 | */ 11 | fun registerEventDelegate(delegate: T) 12 | 13 | /** 14 | * 取消注册事件代理 15 | */ 16 | fun unregisterEventDelegate(delegate: T) 17 | } -------------------------------------------------------------------------------- /doc/class/NSError.md: -------------------------------------------------------------------------------- 1 | 2 | # NSError クラス 3 | ```svg 4 | class NSError(message: String, var domain: String, var code: Int) : Error(message) 5 | 6 | ``` 7 | `NSError`クラスは`Error`クラスを継承し、特定のドメインを持つエラーコードを表します。 8 | 9 | ## コンストラクタのパラメータ 10 | 11 | - `message`:エラーメッセージを表し、`Error`クラスを継承します。 12 | - `domain`:エラーが発生したドメインを表し、`String`型のの変数です。 13 | - `code`:特定のエラーコードを表し、`Int`型の変数です。 14 | 15 | 例外やエラーの処理において、`NSError`のインスタンスを作成し、具体的なエラーメッセージ、ドメイン、およびエラーコードを提供することができます。エラーをより正確に特定し、処理することに役立ちます。 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cloud.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /install_start.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | PACKAGE=co.candyhouse.sesame2 4 | ACTIVITY=co.candyhouse.app.tabs.MainActivity 5 | APK_LOCATION=app-release.apk 6 | # echo "Package: $PACKAGE" 7 | 8 | # echo "Building the project with tasks: $TASKS" 9 | # ./gradlew $TASKS 10 | 11 | # echo "Uninstalling $PACKAGE" 12 | # adb uninstall $PACKAGE 13 | 14 | echo "Installing $APK_LOCATION" 15 | adb install $APK_LOCATION 16 | 17 | echo "Starting $ACTIVITY" 18 | adb shell am start -n $PACKAGE/$ACTIVITY 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/server/dto/IrRemoteInfoRespond.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.server.dto 2 | 3 | import co.candyhouse.app.tabs.devices.hub3.setting.ir.bean.IrRemote 4 | import com.google.gson.annotations.SerializedName 5 | import java.io.Serializable 6 | 7 | class IrRemoteInfoRespond (@SerializedName("type") val type: Int, 8 | @SerializedName("count") val count: Int, 9 | @SerializedName("data") val data: List): Serializable { 10 | 11 | } -------------------------------------------------------------------------------- /app/src/main/res/animator/cloud_dowload.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_custom_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /doc/class/NSError_jp.md: -------------------------------------------------------------------------------- 1 | # NSError クラスのドキュメント 2 | ```svg 3 | class NSError(message: String, var domain: String, var code: Int) : Error(message) 4 | 5 | ``` 6 | `NSError` クラスは、特定のドメインとエラーコードを持つエラーを表すためのクラスで、`Error` クラスを継承しています。 7 | 8 | ## コンストラクタの引数 9 | 10 | - `message`:エラーメッセージです。`Error` クラスから継承されたプロパティです。 11 | - `domain`:エラーが発生したドメインを示す、文字列(String)型の変数です。 12 | - `code`:特定のエラーコードを示す、整数(Int)型の変数です。 13 | 14 | 例外やエラーの処理時に、`NSError` クラスのインスタンスを作成し、具体的なエラーメッセージ、ドメイン、およびエラーコードを提供することで、エラーをより正確に識別して処理することができます。 15 | -------------------------------------------------------------------------------- /doc/class/CHWifiModule2MechSettings.md: -------------------------------------------------------------------------------- 1 | 2 | # CHWifiModule2MechSettings クラス 3 | ```svg 4 | class CHWifiModule2MechSettings(var wifiSSID: String?, var wifiPassWord: String?) 5 | 6 | ``` 7 | `CHWifiModule2MechSettings`クラスは、Wifiモジュール2の機械設定を処理および管理します。 8 | 9 | ## プロパティ 10 | 11 | - `wifiSSID`:WifiのSSIDで、String型です。 12 | - `wifiPassWord`:Wifiのパスワードで、String型です。 13 | 14 | ## コンストラクタ 15 | 16 | - `CHWifiModule2MechSettings(wifiSSID: String?, wifiPassWord: String?)`:コンストラクタは2つの引数、SSIDとパスワードを受取ります。これらの引数は関連するプロパティを初期化します。 17 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/remoteNano/CHRemoteNanoDelegate.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.remoteNano 2 | 3 | import co.candyhouse.sesame.ble.os3.CHRemoteNanoTriggerSettings 4 | import co.candyhouse.sesame.open.device.CHSesameConnector 5 | 6 | interface CHRemoteNanoDelegate { 7 | fun onTriggerDelaySecondReceived( 8 | device: CHSesameConnector, 9 | setting: CHRemoteNanoTriggerSettings 10 | ) 11 | } -------------------------------------------------------------------------------- /doc/command/sesame_open_sensor_jp.md: -------------------------------------------------------------------------------- 1 | # open sensor 解説 2 | ## 実装クラス CHSesameTouchProDevice 3 | ### インターフェース 4 | 5 | 6 | ```agsl 7 | 8 | 9 | 10 | fun insertSesame(sesame: CHDevices, result: CHResult) 11 | fun removeSesame(tag: String, result: CHResult) 12 | ``` 13 | ### インターフェースの機能説明 14 | 15 | 16 | 17 | #### [insertSesame](../touch/add_sesame_jp.md):Sesameを追加します 18 | #### [removeSesame](../touch/remove_sesame_jp.md):Sesameを削除します 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/anim/modal_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 14 | 15 | -------------------------------------------------------------------------------- /doc/command/sesame_open_sensor.md: -------------------------------------------------------------------------------- 1 | # open sensor 説明 2 | ## 実装クラス CHSesameTouchProDevice 3 | ### インターフェイス 4 | 5 | ```agsl 6 | 7 | 8 | 9 | 10 | fun insertSesame(sesame: CHDevices, result: CHResult) 11 | fun removeSesame(tag: String, result: CHResult) 12 | ``` 13 | ### インターフェースの機能の定義 14 | 15 | 16 | 17 | 18 | 19 | 20 | #### [insertSesame](../touch/add_sesame.md):sesameを取得します 21 | #### [removeSesame](../touch/remove_sesame.md):sesameを削除します 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /doc/command/sesamebike2fun.md: -------------------------------------------------------------------------------- 1 | # Bike2 説明 2 | ## 実装クラス CHSesameBike2Device 3 | ### インターフェース 4 | 5 | ```agsl 6 | fun unlock(tag: ByteArray? = null, result: CHResult) 7 | fun reset(result: CHResult) 8 | fun getVersionTag(result: CHResult) 9 | 10 | ``` 11 | ### インターフェースの機能の定義 12 | - [unlock](unlock.md):ロックを解除する 13 | - [reset](reset.md):デバイスをリセットする 14 | - [getVersionTag](ssm5version.md):バージョンのタグを取得する 15 | ### フローチャート 16 | ![CHSesameBike2Device](../class/CHSesameBike2Device.svg) 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/app/App.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.app 2 | 3 | import android.content.Context 4 | import co.candyhouse.app.base.BaseApp 5 | import co.candyhouse.sesame.open.CHDeviceManager 6 | 7 | class CandyHouseApp : BaseApp() { 8 | 9 | override fun onCreate() { 10 | super.onCreate() 11 | CHDeviceManager.app = this 12 | 13 | // 启动IoT连接 14 | initIoTConnection() 15 | } 16 | } 17 | 18 | val Context.candyHouseApplication: CandyHouseApp 19 | get() = applicationContext as CandyHouseApp 20 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/baseCapbale/CHCapabilitySupport.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.baseCapbale 2 | 3 | import co.candyhouse.sesame.ble.SSM3ResponsePayload 4 | import co.candyhouse.sesame.ble.os3.base.SesameOS3Payload 5 | import co.candyhouse.sesame.open.CHResult 6 | 7 | interface CHCapabilitySupport { 8 | fun sendCommand(payload: SesameOS3Payload, callback: (SSM3ResponsePayload) -> Unit) 9 | fun isBleAvailable(result: CHResult): Boolean 10 | } -------------------------------------------------------------------------------- /app/src/main/java/cn/bingoogolapple/qrcode/core/BGScanResult.java: -------------------------------------------------------------------------------- 1 | package cn.bingoogolapple.qrcode.core; 2 | 3 | import android.graphics.PointF; 4 | 5 | /** 6 | * 作者:王浩 7 | * 创建时间:2018/6/15 8 | * 描述: 9 | */ 10 | public class BGScanResult { 11 | String result; 12 | PointF[] resultPoints; 13 | 14 | public BGScanResult(String result) { 15 | this.result = result; 16 | } 17 | 18 | public BGScanResult(String result, PointF[] resultPoints) { 19 | this.result = result; 20 | this.resultPoints = resultPoints; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /doc/class/SesameBleReceiver.md: -------------------------------------------------------------------------------- 1 | # SesameBleReceiver クラス 2 | 3 | ```svg 4 | 5 | 6 | internal class SesameBleReceiver { 7 | var buffer = byteArrayOf() 8 | internal fun feed(input: ByteArray): Pair? 9 | 10 | } 11 | ``` 12 | 13 | 14 | 15 | `SesameBleReceiver` は内部のクラスです。 16 | 17 | ## プロパティ 18 | 19 | - `buffer`:受信したBluetoothデータを保存するために使用されるバイト配列です。 20 | 21 | ## メソッド 22 | 23 | - `feed(input: ByteArray): Pair?`:このメソッドは、バイト配列を受取り、`DeviceSegmentType`とバイト配列を含むペアの二重のタプルを返します。処理が失敗した場合は、nullを返します。 24 | -------------------------------------------------------------------------------- /doc/command/sesamebike2fun_jp.md: -------------------------------------------------------------------------------- 1 | # Bike2 解説 2 | 3 | ## 実装クラス: CHSesameBike2Device 4 | 5 | ### インターフェース 6 | 7 | ```agsl 8 | fun unlock(tag: ByteArray? = null, result: CHResult) 9 | fun reset(result: CHResult) 10 | fun getVersionTag(result: CHResult) 11 | 12 | ``` 13 | ### インターフェースの機能説明 14 | 15 | - [unlock](unlock_jp.md):ロックを解除する 16 | - [reset](reset_jp.md):デバイスをリセットする 17 | - [getVersionTag](ssm5version_jp.md):バージョンタグを取得する 18 | ### フローチャート 19 | 20 | ![CHSesameBike2Device](../class/CHSesameBike2Device.svg) 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/svg_restart.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/navigation/nav_graph.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /doc/class/CHWifiModule2MechSettings_jp.md: -------------------------------------------------------------------------------- 1 | # CHWifiModule2MechSettings クラスのドキュメント 2 | 3 | ```svg 4 | class CHWifiModule2MechSettings(var wifiSSID: String?, var wifiPassWord: String?) 5 | 6 | ``` 7 | 8 | `CHWifiModule2MechSettings` クラスは、Wifi モジュール 2 の機械設定を処理および管理するためのクラスです。 9 | 10 | ## 属性 11 | 12 | - `wifiSSID`:Wifi のSSID(Service Set Identifier)です。文字列(String)型です。 13 | - `wifiPassWord`:Wifi のパスワードです。文字列(String)型です。 14 | 15 | ## コンストラクタ 16 | 17 | - `CHWifiModule2MechSettings(wifiSSID: String?, wifiPassWord: String?)`:コンストラクタは、Wifi のSSID とパスワードの2つの引数を受け取ります。これにより、対応する属性が初期化されます。 18 | -------------------------------------------------------------------------------- /doc/bleconnect/data_send.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | APP --> sendCommand :command 3 | sendCommand : Preparing to send data 4 | 5 | sendCommand --> SesameBleTransmit :(payload,isEncryt,onResponse) 6 | SesameBleTransmit -->getChunk :intput(byte[]) 7 | 8 | state getChunk{ 9 | input.size --> part1 :gt19 10 | part1 --> part2 11 | 12 | part2 -->partN 13 | input.size --> fullData:le19 or eq19 14 | fullData:complete data 15 | } 16 | writeCharacteristic:Ble devices 17 | part1 --> writeCharacteristic 18 | part2 --> writeCharacteristic 19 | partN --> writeCharacteristic 20 | fullData --> writeCharacteristic 21 | 22 | @enduml -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/connect/CHDeviceConnectCapable.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.connect 2 | 3 | import co.candyhouse.sesame.open.CHResult 4 | import co.candyhouse.sesame.open.device.CHDevices 5 | import co.candyhouse.sesame.server.dto.CHEmpty 6 | 7 | interface CHDeviceConnectCapable { 8 | fun insertSesame(sesame: CHDevices, result: CHResult) 9 | fun removeSesame(tag: String, result: CHResult) 10 | fun setRadarSensitivity(payload: ByteArray, result: CHResult){} 11 | } -------------------------------------------------------------------------------- /doc/class/SesameOS3Payload.md: -------------------------------------------------------------------------------- 1 | 2 | # SesameOS3Payload データのクラス 3 | ```svg 4 | internal data class SesameOS3Payload(val itemCode: UByte, val data: ByteArray) { 5 | fun toDataWithHeader(): ByteArray { 6 | return byteArrayOf(itemCode.toByte()) + data 7 | } 8 | } 9 | 10 | 11 | ``` 12 | `SesameOS3Payload`データのクラスは、Sesame OS3 のペイロードデータを処理および管理します。 13 | 14 | ## プロパティ 15 | 16 | - `itemCode`:UByte型です。 17 | - `data`:有効なペイロードデータを保存するByteArray型です。 18 | 19 | ## メソッド 20 | 21 | - `toDataWithHeader()`:このメソッドは、`itemCode` を Byte 型に変換し、それをヘッダーとして `data` と連結して新しいバイト配列を生成します。このメソッドは、有効なペイロードデータを送信または保存する際に、適切な形式に変換します。 -------------------------------------------------------------------------------- /doc/sesame_code_ja.md: -------------------------------------------------------------------------------- 1 | SesameOs3 その他の関連コンテンツの共有 2 | =========== 3 | 4 | 5 | 1. [ファームウェアアップデート](bleprotocol/firmwareUpgradation_ja.md) 6 | 2. [Bluetooth 接続](bleprotocol/BleConnect_ja.md) 7 | 3. [NFC 接続](bleprotocol/nfcconnect_ja.md) 8 | 3. [Bluetooth 暗号化アルゴリズム](./encryption/ble_encryption_jp.md) 9 | 3. [Bluetooth 登録](bleconnect/register_jp.md) 10 | 3. [Bluetooth ログイン](bleconnect/login_jp.md) 11 | 3. [Bluetooth ランダムコード取得](bleconnect/randomcode_jp.md) 12 | 3. [Bluetooth データ送信](bleconnect/ble_receivedata_jp.md) 13 | 3. [Bluetooth データ受信](bleconnect/ble_senddata_jp.md) 14 | 3. [タイムスタンプの更新](bleconnect/timestamp_jp.md) 15 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/dto/AuthenticationDataWrapper.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server.dto 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class AuthenticationDataWrapper( 6 | @SerializedName("op") var operation: String, 7 | @SerializedName("deviceID") val deviceID: String, 8 | @SerializedName("items") val credentialList: List 9 | ) { 10 | override fun toString(): String { 11 | return "AuthenticationDataWrapper(operation='$operation', deviceID='$deviceID', credentialList=$credentialList)" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/progress_red.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_eye_on.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icons_outlined_me_y.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/progress_blue.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /doc/sesame_code.md: -------------------------------------------------------------------------------- 1 | SesameOs3 その他の関連コンテンツの共有 2 | =========== 3 | 4 | 5 | 1. [ファームウェアのアップグレード](bleprotocol/firmwareUpgradation.md) 6 | 2. [Bluetooth 接続](bleprotocol/BleConnect.md) 7 | 3. [NFC 接続](bleprotocol/nfcconnect.md) 8 | 3. [Ble 暗号化アルゴリズム](./encryption/ble_encryption.md) 9 | 3. [Ble 登録](bleconnect/register.md) 10 | 3. [Ble ログイン](bleconnect/login.md) 11 | 3. [Ble ランダムコードの取得](bleconnect/randomcode.md) 12 | 3. [Ble データの受信](bleconnect/ble_receivedata.md) 13 | 3. [Ble データの送信](bleconnect/ble_senddata.md) 14 | 3. [タイムスタンプの更新](bleconnect/timestamp.md) 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icons_filled_close.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/server/dto/IrDeviceRemoteKeyRequest.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.server.dto 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class IrDeviceRemoteKeyRequest( 6 | @SerializedName("operation") val operation: String = "emit", 7 | @SerializedName("data") val data: String?, 8 | @SerializedName("irDeviceUUID") val irDeviceUUID: String? = "", 9 | @SerializedName("irType") val irType: Int = 0, 10 | ){ 11 | override fun toString(): String { 12 | return "IrDeviceRemoteKeyRequest(operation='$operation', data=$data, irDeviceUUID=$irDeviceUUID, irType=$irType)" 13 | } 14 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icons_filled_close_white.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /doc/class/SesameOS3Payload_jp.md: -------------------------------------------------------------------------------- 1 | # SesameOS3Payload クラスのドキュメント 2 | ```svg 3 | internal data class SesameOS3Payload(val itemCode: UByte, val data: ByteArray) { 4 | fun toDataWithHeader(): ByteArray { 5 | return byteArrayOf(itemCode.toByte()) + data 6 | } 7 | } 8 | 9 | 10 | ``` 11 | `SesameOS3Payload` クラスは、Sesame OS3 のペイロードデータを処理および管理するためのデータクラスです。 12 | 13 | ## プロパティ 14 | 15 | - `itemCode`:項目コードを表す UByte 型のプロパティです。 16 | - `data`:有効なペイロードデータを格納するバイト配列(ByteArray)です。 17 | 18 | ## メソッド 19 | 20 | - `toDataWithHeader()`:このメソッドは、`itemCode` を Byte 型に変換し、それをヘッダーとして `data` と連結した新しいバイト配列を返します。このメソッドは、ペイロードデータを適切な形式に変換して送信または保存する際に使用されます。 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icon_delete.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /doc/bleconnect/register.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | APP-->Device: connect Ble 3 | APP<--Device: response(14,random_code) 4 | 5 | APP->APP: 使用ECDH算法EccKey.getPubK()生成公钥、密钥\n(app_pub_key,app_pri_key) 6 | 7 | APP -> Device: send_command(1,app_pub_key,timestamp)) 8 | Device --> APP: response_command(response,command,status,device_pub_key) 9 | 10 | APP->APP:使用ECDH算法EccKey.ecdh(device_pub_key)生成共享公钥->ecdhSecret(供AESCMAC使用) 11 | APP->APP:ecdhSecret 和random_code 作为AESCMAC算法的key、Message生成消息码。AesCmac(ecdhSecret,16).computeMac(random_code)->sessionAuth(供AESCCM使用) 12 | APP->APP:deviceSecret和random_code作为AESCCM的key、Message创建加密对象->cipher(对Ble数据传输加密解密) 13 | 14 | 15 | @enduml 16 | -------------------------------------------------------------------------------- /doc/encryption/ble_encryption.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | APP-->Device: connect Ble 3 | APP<--Device: response(14,random_code) 4 | 5 | APP->APP: 使用ECDH算法EccKey.getPubK()生成公钥、密钥\n(app_pub_key,app_pri_key) 6 | 7 | APP -> Device: send_command(1,app_pub_key,timestamp)) 8 | Device --> APP: response_command(response,command,status,device_pub_key) 9 | 10 | APP->APP:使用ECDH算法EccKey.ecdh(device_pub_key)生成共享公钥->ecdhSecret(供AESCMAC使用) 11 | APP->APP:ecdhSecret 和random_code 作为AESCMAC算法的key、Message生成消息码。AesCmac(ecdhSecret,16).computeMac(random_code)->sessionAuth(供AESCCM使用) 12 | APP->APP:deviceSecret和random_code作为AESCCM的key、Message创建加密对象->cipher(对Ble数据传输加密解密) 13 | 14 | 15 | @enduml 16 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/remoteNano/CHRemoteNanoCapable.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.remoteNano 2 | 3 | import co.candyhouse.sesame.open.CHResult 4 | import co.candyhouse.sesame.open.device.sesameBiometric.devices.CHSesameBiometricBase 5 | import co.candyhouse.sesame.server.dto.CHEmpty 6 | 7 | interface CHRemoteNanoCapable { 8 | fun setTriggerDelayTime(time: UByte, result: CHResult) 9 | 10 | fun registerEventDelegate(device: CHSesameBiometricBase, delegate: CHRemoteNanoDelegate) 11 | fun unregisterEventDelegate(delegate: CHRemoteNanoDelegate) 12 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/arrow.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 16 | 17 | -------------------------------------------------------------------------------- /doc/class/CHSesameSensorDelegate.md: -------------------------------------------------------------------------------- 1 | 2 | # CHSesameSensorDelegate インターフェース 3 | ```svg 4 | interface CHSesameSensorDelegate : CHDeviceStatusDelegate { 5 | fun onSSM2KeysChanged(device: CHSesameConnector, ssm2keys: Map) {} 6 | } 7 | 8 | ``` 9 | `CHSesameSensorDelegate`インターフェースは、Sesameデバイスのセンサー関連イベントを処理および管理します。 10 | 11 | ## メソッド 12 | 13 | - `onSSM2KeysChanged(device: CHSesameConnector, ssm2keys: Map)`:SSM2キーが変更された際に呼び出されます。このメソッドは2つのパラメータを受け取ります。1つ目のパラメータはキーの変更が発生したデバイスであり、2つ目のパラメータは新しいSSM2のキーセットです。デフォルト値は null です。 14 | 15 | ## 継承 16 | 17 | - `CHDeviceStatusDelegate`:`CHSesameSensorDelegate`インターフェースは`CHDeviceStatusDelegate`を継承し、親クラスの全てのメソッドを実装します。 18 | -------------------------------------------------------------------------------- /doc/bleconnect/data_receive.puml: -------------------------------------------------------------------------------- 1 | @startuml 2 | BleDevice --> gattRxBuffer :response 3 | BleDevice --> gattRxBuffer :response 4 | BleDevice --> gattRxBuffer :response 5 | state gattRxBuffer{ 6 | parsingType --> gt0 7 | parsingType --> 0 8 | 0-->waite 9 | waite:next read response 10 | waite ->finish 11 | finish:receive finish 12 | } 13 | gt0 --> parseNotifyPayload 14 | finish --> parseNotifyPayload 15 | parseNotifyPayload:data Decrypted 16 | parseNotifyPayload-->onGattSesameResponse 17 | onGattSesameResponse : SSM2OpCode.response 18 | parseNotifyPayload-->onGattSesamePublish 19 | onGattSesamePublish:SSM2OpCode.publish 20 | onGattSesameResponse -->cmdCallBack 21 | onGattSesamePublish -->login 22 | 23 | 24 | @enduml -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_wheel_picker.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /doc/class/CHDeviceStatusDelegate_jp.md: -------------------------------------------------------------------------------- 1 | # CHDeviceStatusDelegate インターフェースのドキュメント 2 | ```svg 3 | interface CHDeviceStatusDelegate { 4 | 5 | fun onBleDeviceStatusChanged(device: CHDevices, status: CHDeviceStatus, shadowStatus: CHDeviceStatus?) {} 6 | 7 | fun onMechStatus(device: CHDevices) {} 8 | } 9 | 10 | ``` 11 | 12 | `CHDeviceStatusDelegate` は、デバイスの状態変更を監視し、それに応答するためのデバイス状態代理インターフェースです。 13 | 14 | ## メソッド 15 | 16 | - `fun onBleDeviceStatusChanged(device: CHDevices, status: CHDeviceStatus, shadowStatus: CHDeviceStatus?) {}` - BLEデバイスの状態が変更された際に呼び出されます。デバイスオブジェクト、新しいデバイスの状態、およびデバイスのシャドウ状態(存在する場合)が引数として渡されます。 17 | - `fun onMechStatus(device: CHDevices) {}` - デバイスのメカニカル状態が変更された際に呼び出されます。デバイスオブジェクトが引数として渡されます。 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tick_blue.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tick_grey.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/menu/bottom_nav.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 11 | 15 | 16 | 17 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /doc/class/SesameBleTransmit.md: -------------------------------------------------------------------------------- 1 | # SesameBleTransmit クラス 2 | 3 | ```svg 4 | 5 | internal class SesameBleTransmit(var type: DeviceSegmentType, var input: ByteArray) { 6 | var isStart = 1 7 | internal fun getChunk(): ByteArray? 8 | } 9 | 10 | ``` 11 | 12 | `SesameBleTransmit` は内部のクラスです。 13 | 14 | ## プロパティ 15 | 16 | - `type`:`DeviceSegmentType`の列挙型の値です。転送するデータのタイプを表します。 17 | - `input`:バイト配列です。転送する必要があるデータを表します。 18 | - `isStart`:データ転送の開始を示すために使用される整数値です。初期値は1であり、転送が開始されると0に設定され、転送が終了すると-1に設定されます。 19 | 20 | ## メソッド 21 | 22 | - `getChunk(): ByteArray?`:バイト配列を返し、データブロックを表します。`isStart`が-1の場合、データの転送が完了したことを示し、`null`を返します。また、`input`が19以下の場合、すべてのデータを一度に転送し、`isStart`を-1に設定します。`input`が19より大きい場合、19バイトずつデータを転送し、すべてのデータが転送されるまで繰り返します。 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_btn_confirm.xml: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_btn_warning.xml: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /doc/class/CHDeviceStatusDelegate.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # CHDeviceStatusDelegate インターフェース 4 | ```svg 5 | interface CHDeviceStatusDelegate { 6 | 7 | fun onBleDeviceStatusChanged(device: CHDevices, status: CHDeviceStatus, shadowStatus: CHDeviceStatus?) {} 8 | 9 | fun onMechStatus(device: CHDevices) {} 10 | } 11 | 12 | ``` 13 | 14 | `CHDeviceStatusDelegate` はデバイス状態の変化を監視と応答するためのデバイス状態の代理のインターフェースです。 15 | 16 | ## メソッド 17 | 18 | - `fun onBleDeviceStatusChanged(device: CHDevices, status: CHDeviceStatus, shadowStatus: CHDeviceStatus?) {}` - BLEデバイスの状態が変化した時に呼び出され、デバイスオブジェクト、新しいデバイスの状態、およびデバイスのシャドウ状態(存在する場合)というパラメータがインプットされます。 19 | - `fun onMechStatus(device: CHDevices) {}` - デバイスの機械状態が変化した時に呼び出され、デバイスオブジェクトというパラメータがインプットされます。 20 | 21 | 22 | -------------------------------------------------------------------------------- /doc/class/CHSesameSensorDelegate_jp.md: -------------------------------------------------------------------------------- 1 | # CHSesameSensorDelegate インターフェースのドキュメント 2 | ```svg 3 | interface CHSesameSensorDelegate : CHDeviceStatusDelegate { 4 | fun onSSM2KeysChanged(device: CHSesameConnector, ssm2keys: Map) {} 5 | } 6 | 7 | ``` 8 | 9 | `CHSesameSensorDelegate` インターフェースは、Sesame デバイスのセンサー関連イベントを処理および管理するために使用されます。 10 | 11 | ## メソッド 12 | 13 | - `onSSM2KeysChanged(device: CHSesameConnector, ssm2keys: Map)`:このメソッドは、SSM2 キーが変更された際に呼び出されます。このメソッドは 2 つのパラメータを受け取ります。第 1 パラメータはキーが変更されたデバイス、第 2 パラメータは新しい SSM2 キーのマップです。デフォルトの実装では何も行いません。 14 | 15 | ## 継承 16 | 17 | - `CHDeviceStatusDelegate`:`CHSesameSensorDelegate` インターフェースは、`CHDeviceStatusDelegate` インターフェースを継承しており、親クラスのすべてのメソッドを実装する必要があります。 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_ap_alert.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /doc/command/magnet_jp.md: -------------------------------------------------------------------------------- 1 | # Magnet 角度補正 2 | 3 | ### 送信フォーマット 4 | | バイト | 0 | 5 | |:----:|:----:| 6 | | データ | コマンド | 7 | - コマンド: 指令17(固定) 8 | 9 | ### 受信フォーマット 10 | | バイト | 2 | 1 | 0 | 11 | |:----:|:----:|:----:|:----:| 12 | | データ | ステータス | コマンド | レスポンス | 13 | - コマンド: 指令17(固定) 14 | - レスポンス: 応答0x07(固定) 15 | - ステータス: 状態0x00(成功) 16 | ### シーケンス図 17 | ![アイコン](magnet.svg) 18 | 19 | ### Androidの例 20 | ``` java 21 | override fun magnet(result: CHResult) { 22 | if (checkBle(result)) return 23 | sendCommand(SesameOS3Payload(SesameItemCode.magnet.value, byteArrayOf()), DeviceSegmentType.cipher) { res -> 24 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/card/CHCardDelegate.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.card 2 | 3 | import co.candyhouse.sesame.open.device.CHSesameConnector 4 | 5 | interface CHCardDelegate { 6 | fun onCardReceive(device: CHSesameConnector, cardID: String, hexName: String, type: Byte) {} 7 | fun onCardChanged(device: CHSesameConnector, cardID: String, hexName: String, type: Byte) {} 8 | fun onCardReceiveEnd(device: CHSesameConnector) {} 9 | fun onCardReceiveStart(device: CHSesameConnector) {} 10 | fun onCardModeChanged(device: CHSesameConnector, mode: Byte) {} 11 | fun onCardDelete(device: CHSesameConnector, cardID: String) {} 12 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_blue_no.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/utils/aescmac/MAC.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.utils.aescmac 2 | 3 | import java.security.GeneralSecurityException 4 | 5 | interface Mac { 6 | /** 7 | * Computes message authentication code (MAC) for `data`. 8 | * 9 | * @return MAC value 10 | */ 11 | @Throws(GeneralSecurityException::class) 12 | fun computeMac(data: ByteArray?): ByteArray? 13 | 14 | /** 15 | * Verifies whether `mac` is a correct authentication code (MAC) for `data`. 16 | * 17 | * @throws GeneralSecurityException if `mac` is not a correct MAC for `data` 18 | */ 19 | @Throws(GeneralSecurityException::class) 20 | fun verifyMac(mac: ByteArray?, data: ByteArray?) 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icon_unlock_uncheck.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /doc/class/CHSesameConnector.md: -------------------------------------------------------------------------------- 1 | # CHSesameConnector インターフェース 2 | ```svg 3 | 4 | 5 | interface CHSesameConnector : CHDevices { 6 | var ssm2KeysMap: MutableMap 7 | fun insertSesame(sesame: CHDevices, result: CHResult) 8 | fun removeSesame(tag: String, result: CHResult) 9 | } 10 | ``` 11 | `CHSesameConnector` はデバイスコネクタのインターフェースで、`CHDevices`を継承しています。Sesameデバイスを管理および操作します。 12 | 13 | ## プロパティ 14 | 15 | - `ssm2KeysMap: MutableMap` - Sesame2デバイスのキーのマッピングを保存します。 16 | 17 | ## メソッド 18 | 19 | - `fun insertSesame(sesame: CHDevices, result: CHResult)` - Sesameデバイスを挿入し、操作結果を返します。 20 | - `fun removeSesame(tag: String, result: CHResult)` - 指定されたラベルに基づいてSesameデバイスを削除し、操作結果を返します。 21 | 22 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/dto/CHFaceNameRequest.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server.dto 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import java.sql.Timestamp 5 | 6 | // json data class 7 | data class CHFaceNameRequest( 8 | @SerializedName("type") val type: Byte, 9 | @SerializedName("faceNameUUID") val faceNameUUID: String, 10 | @SerializedName("subUUID") val subUUID: String, 11 | @SerializedName("stpDeviceUUID") val stpDeviceUUID: String, 12 | @SerializedName("name") val name: String, 13 | @SerializedName("faceID") val faceID: String, 14 | @SerializedName("timestamp") val timestamp: Long = Timestamp(System.currentTimeMillis()).time, 15 | @SerializedName("op") val op: String 16 | ) 17 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/dto/CHPalmNameRequest.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server.dto 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import java.sql.Timestamp 5 | 6 | // json data class 7 | data class CHPalmNameRequest( 8 | @SerializedName("type") val type: Byte, 9 | @SerializedName("palmNameUUID") val palmNameUUID: String, 10 | @SerializedName("subUUID") val subUUID: String, 11 | @SerializedName("stpDeviceUUID") val stpDeviceUUID: String, 12 | @SerializedName("name") val name: String, 13 | @SerializedName("palmID") val palmID: String, 14 | @SerializedName("timestamp") val timestamp: Long = Timestamp(System.currentTimeMillis()).time, 15 | @SerializedName("op") val op: String 16 | ) 17 | -------------------------------------------------------------------------------- /app/src/main/res/xml/nfc_tech_filter.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 |    4 | android.nfc.tech.IsoDep 5 |    6 | android.nfc.tech.NfcA 7 |    8 | android.nfc.tech.NfcB 9 |    10 | android.nfc.tech.NfcF 11 |    12 | android.nfc.tech.NfcV 13 |    14 | android.nfc.tech.Ndef 15 |    16 | android.nfc.tech.NdefFormatable 17 |    18 | android.nfc.tech.MifareClassic 19 |    20 | android.nfc.tech.MifareUltralight 21 |    22 | 23 | -------------------------------------------------------------------------------- /doc/class/SSM3PublishPayload.md: -------------------------------------------------------------------------------- 1 | ## SSM3PublishPayload クラス 2 | ```svg 3 | class SSM3PublishPayload(val data: ByteArray) { 4 | val cmdItCode = data[0].toUByte() 5 | val payload: ByteArray = data.drop(1).toByteArray() 6 | } 7 | ``` 8 | ### 説明 9 | 10 | `SSM3PublishPayload` は、SSM3プロトコルに関連するペイロード(データ)を処理するためのKotlinクラスです。このクラスをインスタンス化する際には、バイト配列(ByteArray)を引数として渡す必要があります。 11 | 12 | ### プロパティ 13 | 14 | - `data`:ByteArray型のインスタンス変数です。この変数の値は、クラスのインスタンスを作成する際に提供する必要があります。 15 | 16 | - `cmdItCode`:提供された`data`配列の最初のバイトをUByte(符号なしバイト)に変換します。 17 | 18 | - `payload`:`cmdItCode`の後に残る`data`の部分です。`data.drop(1)`を使用して、最初の要素を除いたすべての要素が含まれる新しい配列を生成します。 19 | 20 | ### 使用 21 | 22 | このクラスを使用するには、`SSM3PublishPayload`クラスのインスタンスを作成し、コンストラクタにバイト配列を渡す必要があります。この配列の最初のバイトは`cmdItCode`に変換されます。 -------------------------------------------------------------------------------- /doc/class/SesameBleTransmit_jp.md: -------------------------------------------------------------------------------- 1 | # SesameBleTransmit クラスのドキュメント 2 | 3 | ```svg 4 | 5 | internal class SesameBleTransmit(var type: DeviceSegmentType, var input: ByteArray) { 6 | var isStart = 1 7 | internal fun getChunk(): ByteArray? 8 | } 9 | 10 | ``` 11 | `SesameBleTransmit` は、内部クラスです。 12 | 13 | ## プロパティ 14 | 15 | - `type`:`DeviceSegmentType` 列挙値の変数で、データの種類を示します。 16 | - `input`:バイト配列型の変数で、送信するデータを表します。 17 | - `isStart`:整数型の変数で、データ送信の開始を示すために使用されます。初期値は1で、送信が開始されると0に、送信が終了すると-1に設定されます。 18 | 19 | ## メソッド 20 | 21 | - `getChunk(): ByteArray?`:このメソッドは、データのチャンク(一部)を表すバイト配列を返します。`isStart` が-1の場合、データがすべて送信されていることを示します。この場合、`null` を返します。`input` のサイズが19以下の場合、すべてのデータが一度に送信され、`isStart` が-1に設定されます。`input` のサイズが19より大きい場合、19バイトのデータが一度に送信され、すべてのデータが送信されるまで繰り返し送信されます。 22 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/passcode/CHPassCodeDelegate.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.passcode 2 | 3 | import co.candyhouse.sesame.open.device.CHSesameConnector 4 | 5 | interface CHPassCodeDelegate { 6 | fun onKeyBoardReceive(device: CHSesameConnector, ID: String, hexName: String, type: Byte) {} 7 | fun onKeyBoardChanged(device: CHSesameConnector, ID: String, hexName: String, type: Byte) {} 8 | fun onKeyBoardReceiveEnd(device: CHSesameConnector) {} 9 | fun onKeyBoardReceiveStart(device: CHSesameConnector) {} 10 | fun onKeyBoardModeChange(device: CHSesameConnector, mode: Byte) {} 11 | fun onKeyBoardDelete(device: CHSesameConnector, ID: String) {} 12 | } -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/dto/CHCardNameRequest.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server.dto 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import java.sql.Timestamp 5 | 6 | // json data class 7 | data class CHCardNameRequest( 8 | @SerializedName("cardType") val cardType: Byte, 9 | @SerializedName("cardNameUUID") val cardNameUUID: String, 10 | @SerializedName("subUUID") val subUUID: String, 11 | @SerializedName("stpDeviceUUID") val stpDeviceUUID: String, 12 | @SerializedName("name") val name: String, 13 | @SerializedName("cardID") val cardID: String, 14 | @SerializedName("timestamp") val timestamp: Long = Timestamp(System.currentTimeMillis()).time, 15 | @SerializedName("op") val op: String 16 | ) 17 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/face/CHFaceDelegate.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.face 2 | 3 | import co.candyhouse.sesame.ble.os3.CHSesameTouchFace 4 | import co.candyhouse.sesame.open.device.CHSesameConnector 5 | 6 | interface CHFaceDelegate { 7 | fun onFaceModeChanged(device: CHSesameConnector, mode: Byte) {} 8 | fun onFaceReceiveStart(device: CHSesameConnector) {} 9 | fun onFaceReceive(device: CHSesameConnector, face: CHSesameTouchFace) {} 10 | fun onFaceChanged(device: CHSesameConnector, face: CHSesameTouchFace) {} 11 | fun onFaceReceiveEnd(device: CHSesameConnector) {} 12 | fun onFaceDeleted(device: CHSesameConnector, faceID: Byte, isSuccess: Boolean) {} 13 | } -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/dto/CHHistoryUploadRequest.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server.dto 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | internal data class CHSSMHisUploadRequest(@SerializedName("s") var device_id: String, @SerializedName("v") var historys: String) 6 | internal data class CHSS5HisUploadRequest(@SerializedName("s") var device_id: String, @SerializedName("v") var historys: String, @SerializedName("t") var type: String) 7 | 8 | internal data class CHRemoveSignKeyRequest(var deviceId: String, var token: String, var secretKey: String) 9 | 10 | internal data class CHSS2WebCMDReq(var cmd: Byte, var history: String, var sign: String) 11 | 12 | internal data class CHFcmTokenUpload(var deviceId: String, var token: String) -------------------------------------------------------------------------------- /app/src/main/java/cn/bingoogolapple/qrcode/core/BarcodeType.java: -------------------------------------------------------------------------------- 1 | package cn.bingoogolapple.qrcode.core; 2 | 3 | /** 4 | * 作者:王浩 5 | * 创建时间:2018/6/20 6 | * 描述:识别的格式 7 | */ 8 | public enum BarcodeType { 9 | /** 10 | * 所有格式 11 | */ 12 | ALL, 13 | /** 14 | * 所有一维条码格式 15 | */ 16 | ONE_DIMENSION, 17 | /** 18 | * 所有二维条码格式 19 | */ 20 | TWO_DIMENSION, 21 | /** 22 | * 仅 QR_CODE 23 | */ 24 | ONLY_QR_CODE, 25 | /** 26 | * 仅 CODE_128 27 | */ 28 | ONLY_CODE_128, 29 | /** 30 | * 仅 EAN_13 31 | */ 32 | ONLY_EAN_13, 33 | /** 34 | * 高频率格式,包括 QR_CODE、ISBN13、UPC_A、EAN_13、CODE_128 35 | */ 36 | HIGH_FREQUENCY, 37 | /** 38 | * 自定义格式 39 | */ 40 | CUSTOM 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_blue.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icons_filled_album.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /doc/class/CHSesameConnector_jp.md: -------------------------------------------------------------------------------- 1 | # CHSesameConnector インターフェースのドキュメント 2 | 3 | ```svg 4 | 5 | 6 | interface CHSesameConnector : CHDevices { 7 | var ssm2KeysMap: MutableMap 8 | fun insertSesame(sesame: CHDevices, result: CHResult) 9 | fun removeSesame(tag: String, result: CHResult) 10 | } 11 | ``` 12 | 13 | `CHSesameConnector` は、デバイス接続コネクタのインターフェースであり、`CHDevices` インターフェースを継承しています。Sesame デバイスの管理と操作を担当します。 14 | 15 | ## 属性 16 | 17 | - `ssm2KeysMap: MutableMap` - Sesame2 デバイスのキーを格納するマップです。 18 | 19 | ## メソッド 20 | 21 | - `fun insertSesame(sesame: CHDevices, result: CHResult)` - Sesame デバイスを挿入し、操作結果を返します。 22 | - `fun removeSesame(tag: String, result: CHResult)` - 指定されたタグに基づいて Sesame デバイスを削除し、操作結果を返します。 23 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/fingerPrint/CHFingerPrintDelegate.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.fingerPrint 2 | 3 | import co.candyhouse.sesame.open.device.CHSesameConnector 4 | 5 | interface CHFingerPrintDelegate { 6 | fun onFingerPrintReceive(device: CHSesameConnector, ID: String, hexName: String, type: Byte) {} 7 | fun onFingerPrintChanged(device: CHSesameConnector, ID: String, hexName: String, type: Byte) {} 8 | fun onFingerPrintReceiveEnd(device: CHSesameConnector) {} 9 | fun onFingerPrintReceiveStart(device: CHSesameConnector) {} 10 | fun onFingerModeChange(device: CHSesameConnector, mode: Byte) {} 11 | fun onFingerDelete(device: CHSesameConnector, ID: String) {} 12 | } -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/palm/CHPalmDelegate.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.palm 2 | 3 | import co.candyhouse.sesame.ble.os3.CHSesameTouchFace 4 | import co.candyhouse.sesame.open.device.CHSesameConnector 5 | 6 | interface CHPalmDelegate { 7 | fun onPalmModeChanged(device: CHSesameConnector, mode: Byte) {} 8 | fun onPalmReceive(device: CHSesameConnector, tochface: CHSesameTouchFace) {} 9 | fun onPalmChanged(device: CHSesameConnector, tochface: CHSesameTouchFace) {} 10 | fun onPalmReceiveStart(device: CHSesameConnector) {} 11 | fun onPalmReceiveEnd(device: CHSesameConnector) {} 12 | fun onPalmDeleted(device: CHSesameConnector, palmID: Byte, isSuccess: Boolean) {} 13 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icons_filled_more.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /doc/command/magnet.md: -------------------------------------------------------------------------------- 1 | # Magnet 角度補正 2 | 3 | ### 送信フォーマット 4 | | Byte | 0 | 5 | |:----:|:----:| 6 | | Data | command | 7 | - command:命令17(固定) 8 | 9 | 10 | ### 受信フォーマット 11 | | Byte | 2 | 1 | 0 | 12 | |:----:|:----:|:----:|:----:| 13 | | Data | status | command | response | 14 | - command:命令17(固定) 15 | - response:応答0x07(固定) 16 | - status:状態0x00(成功) 17 | ### フローチャート 18 | ![v](magnet.svg) 19 | 20 | 21 | 22 | 23 | 24 | ### android例 25 | ``` java 26 | override fun magnet(result: CHResult) { 27 | if (checkBle(result)) return 28 | sendCommand(SesameOS3Payload(SesameItemCode.magnet.value, byteArrayOf()), DeviceSegmentType.cipher) { res -> 29 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 30 | } 31 | } 32 | ``` 33 | -------------------------------------------------------------------------------- /doc/sesame_code_cls.md: -------------------------------------------------------------------------------- 1 | Classオブジェクト一覧 2 | =============== 3 | - [CHSesame5Device](class/CHSesame5Device.md):このインスタンスオブジェクトは Sesame5 および Sesame5 Pro 製品に適用されます。 4 | - [CHSesameBike2Device](class/CHSesameBike2Device.md) : このインスタンスオブジェクトは Sesame Bike 2 製品に適用されます。 5 | - [CHWifiModule2Device](class/CHWifiModule2Device.md):このインスタンスオブジェクトは Sesame WiFi Module 2 製品に適用されます。 6 | - [CHSesameTouchProDevice](class/CHSesameTouchProDevice.md):このインスタンスオブジェクトは Sesame BLE Connector1、 Sesame Touch 1 Pro 、 Sesame Open Sensor 1、 Sesame Touch 1 製品に適用されます。 7 | - [CHProductModel](class/CHProductModel.md):Sesame Os3 シリーズ製品の所属タイプ、モデル、名前、実装クラスを定義します。 8 | 9 | - [SesameItemCode](class/SesameItemCode.md):ble目標命令 10 | - [SesameResultCode](class/SesameResultCode.md):ble 応答結果の種類 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/dto/CHFingerPrintNameRequest.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server.dto 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import java.sql.Timestamp 5 | 6 | // json data class 7 | data class CHFingerPrintNameRequest( 8 | @SerializedName("type") val type: Byte, 9 | @SerializedName("fingerPrintNameUUID") val fingerPrintNameUUID: String, 10 | @SerializedName("subUUID") val subUUID: String, 11 | @SerializedName("stpDeviceUUID") val stpDeviceUUID: String, 12 | @SerializedName("name") val name: String, 13 | @SerializedName("fingerPrintID") val fingerPrintID: String, 14 | @SerializedName("timestamp") val timestamp: Long = Timestamp(System.currentTimeMillis()).time, 15 | @SerializedName("op") val op: String 16 | ) 17 | -------------------------------------------------------------------------------- /doc/class/DeviceSegmentType_jp.md: -------------------------------------------------------------------------------- 1 | # DeviceSegmentType 列挙型 2 | 3 | ```svg 4 | internal enum class DeviceSegmentType(var value: Int) { 5 | plain(1), cipher(2), ; 6 | companion object { 7 | private val values = values() 8 | fun getByValue(value: Int) = values.first { it.value == value } 9 | } 10 | } 11 | ``` 12 | `DeviceSegmentType` は、デバイスセグメントのタイプを示す内部の列挙型です。 13 | 14 | ## 列挙値 15 | 16 | この列挙型は、複数の列挙項目を含んでおり、デバイスセグメントのタイプを表します。各列挙項目は `Int` 型の値を持ちます。 17 | 18 | 以下は `DeviceSegmentType` 列挙型の詳細な一覧です: 19 | 20 | | 列挙値 | 値 | 説明 | 21 | |---|---|---| 22 | | plain | 1 | 平文 | 23 | | cipher | 2 | 暗号文 | 24 | 25 | ## 伴生オブジェクト 26 | 27 | `DeviceSegmentType` 列挙型には、以下の機能を提供する伴生オブジェクトがあります: 28 | 29 | - `values`:すべての列挙値を返します。 30 | - `getByValue`:与えられた値に対応する列挙項目を返します。対応する列挙項目が見つからない場合、例外がスローされます。 31 | -------------------------------------------------------------------------------- /doc/class/CHBaseAdv.md: -------------------------------------------------------------------------------- 1 | # CHBaseAdv インターフェース 2 | ```svg 3 | 4 | internal interface CHBaseAdv { 5 | val rssi: Int? 6 | val isRegistered: Boolean 7 | val adv_tag_b1: Boolean 8 | val deviceID: UUID? 9 | var device: BluetoothDevice 10 | var deviceName: String? 11 | var productModel: CHProductModel? 12 | var isConnecable: Boolean? 13 | } 14 | ``` 15 | 16 | 17 | `CHBaseAdv` は内部インターフェースです。 18 | 19 | ## プロパティ 20 | 21 | - `rssi`: `Int?`型で、受信号強度の指示子です。 22 | - `isRegistered`: `Boolean`型で、登録しているかどうかを判断します。 23 | - `adv_tag_b1`: `Boolean`型で、アドバタイジングのタグです。 24 | - `deviceID`: `UUID?`型で、デバイスIDです。 25 | - `device`: `BluetoothDevice`型で,Bluetoothデバイスです。 26 | - `deviceName`: `String?`型で、デバイス名です。 27 | - `productModel`: `CHProductModel?`型で、製品モデルです。 28 | - `isConnecable`: `Boolean?`型で、接続可能かどうかを判断します。 29 | -------------------------------------------------------------------------------- /doc/class/SesameNotifypayload.md: -------------------------------------------------------------------------------- 1 | ## SesameNotifypayload クラス 2 | ``` 3 | internal class SesameNotifypayload(val data: ByteArray) { 4 | val notifyOpCode: SSM2OpCode = SSM2OpCode.getByValue(data[0]) 5 | val payload: ByteArray = data.drop(1).toByteArray() 6 | } 7 | ``` 8 | ### 説明 9 | 10 | `SesameNotifypayload`は`Sesame`の通知のペイロードを処理するためのKotlinの内部クラスです。このクラスのインスタンス化する際には、バイト配列を渡す必要があります。 11 | 12 | ### プロパティ 13 | 14 | - `data`:ByteArray型のインスタンス変数です。この`data`変数は、クラスのインスタンスを作成する際に提供する必要があります。 15 | 16 | - `notifyOpCode`: 提供された`data`配列の最初のバイトの値を取得し、`SSM2OpCode.getByValue`関数に渡して、その結果を`notifyOpCode`として設定します。 17 | 18 | - `payload`: `notifyOpCode`の後にある`data`の残りの部分です。`data.drop(1)`を使用すると、新しい配列が生成され、最初の要素以外のすべての要素が含まれます。 19 | 20 | ### 使用 21 | 22 | このクラスを使用するには、`SesameNotifyPayload`オブジェクトをインスタンス化し、そのコンストラクタにバイト配列を提供する必要があります。 -------------------------------------------------------------------------------- /doc/sesame_code_cls_ja.md: -------------------------------------------------------------------------------- 1 | Class オブジェクトリスト 2 | =============== 3 | - [CHSesame5Device](class/CHSesame5Device.md): このインスタンスオブジェクトは Sesame5 および Sesame5 Pro 製品に適用されます。 4 | - [CHSesameBike2Device](class/CHSesameBike2Device.md): このインスタンスオブジェクトは Sesame Bike 2 製品に適用されます。 5 | - [CHWifiModule2Device](class/CHWifiModule2Device.md): このインスタンスオブジェクトは Sesame WiFi Module 2 製品に適用されます。 6 | - [CHSesameTouchProDevice](class/CHSesameTouchProDevice.md): このインスタンスオブジェクトは Sesame BLE Connector1、Sesame Touch 1 Pro、Sesame Open Sensor 1、Sesame Touch 1 製品に適用されます。 7 | - [CHProductModel](class/CHProductModel_jp.md): Sesame Os3 シリーズ製品の所属タイプ、モデル、名前、実装クラスを定義します。 8 | - [SSM2OpCode](class/SSM2OpCode_jp.md): 操作コードの種類 9 | - [SesameItemCode](class/SesameItemCode_jp.md): BLE ターゲットコード 10 | - [SesameResultCode](class/SesameResultCode_jp.md): BLE レスポンス結果のカテゴリ 11 | 12 | -------------------------------------------------------------------------------- /doc/command/sesameblot.md: -------------------------------------------------------------------------------- 1 | # Bot1 讲解 2 | ## 实现类 CHSesameBotDevice 3 | ### 接口 4 | 7 | ```agsl 8 | fun updateSetting(setting: CHSesameBotMechSettings, historyTag: ByteArray? = null, result: CHResult) 9 | 10 | fun click(historyTag: ByteArray? = null, result: CHResult) 11 | fun reset(result: CHResult) 12 | fun getVersionTag(result: CHResult) 13 | ``` 14 | ### 接口功能字义 15 | 16 | - [updateSetting](updatasetting.md):模式设置 17 | - [click](click.md):点击复原 18 | - [getVersionTag](ssm5version.md):获取版本号 19 | - [reset](reset.md):重置设备 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /doc/touch/card_last.md: -------------------------------------------------------------------------------- 1 | # Card last 讲解 2 | 3 | ### 发送格式 4 | 5 | | Byte | 0 | 6 | |:------:|:----:| 7 | | Data | | command | 8 | 9 | - command:指令111(固定) 10 | 11 | 12 | ### 接收格式 13 | 14 | | Byte | 2 | 1 | 0 | 15 | |:---:|:----:|:----:|:-----:| 16 | | Data | status | command |response | 17 | - command:指令111(固定) 18 | - response:响应0x07(固定) 19 | - status:状态0x00(成功) 20 | 21 | 22 | ### 循序图 23 | 24 | 25 | 26 | 27 | 28 | 29 | ### android示例 30 | ``` java 31 | override fun onGattSesamePublish(receivePayload: SSM3PublishPayload) { 32 | super.onGattSesamePublish(receivePayload) 33 | if (receivePayload.cmdItCode == SesameItemCode.SSM_OS3_CARD_LAST.value) { 34 | (delegate as? CHSesameTouchProDelegate)?.onCardReceiveEnd(this) 35 | } 36 | 37 | } 38 | ``` 39 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/dto/CHKeyBoardPassCodeNameRequest.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server.dto 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import java.sql.Timestamp 5 | 6 | // json data class 7 | data class CHKeyBoardPassCodeNameRequest( 8 | @SerializedName("type") val type: Byte, 9 | @SerializedName("keyBoardPassCodeNameUUID") val keyBoardPassCodeNameUUID: String, 10 | @SerializedName("subUUID") val subUUID: String, 11 | @SerializedName("stpDeviceUUID") val stpDeviceUUID: String, 12 | @SerializedName("name") val name: String, 13 | @SerializedName("keyBoardPassCode") val keyBoardPassCode: String, 14 | @SerializedName("timestamp") val timestamp: Long = Timestamp(System.currentTimeMillis()).time, 15 | @SerializedName("op") val op: String 16 | ) 17 | -------------------------------------------------------------------------------- /doc/ble_product_serials.md: -------------------------------------------------------------------------------- 1 | Bleプロジェクトのコード例に関する説明一覧 2 | ======== 3 | 8 | ### 1. [Sesame 5](command/sesame5fun.md) 9 | ### 2. [Sesame 5 Pro ](command/sesame5fun.md) 10 | ### 3. [Sesame Bike 2](command/sesamebike2fun.md) 11 | ### 4. [Sesame WiFi Module 2](command/sesamewifimodule.md) 12 | ### 5. [Sesame BLE Connector1](command/sesametouchpro.md) 13 | ### 6. [Sesame Touch 1 Pro](command/sesametouchpro.md) 14 | ### 7. [Sesame Open Sensor 1](command/sesame_open_sensor.md) 15 | ### 8. [Sesame Touch 1](command/sesametouchpro.md) 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /doc/class/SSM3PublishPayload_jp.md: -------------------------------------------------------------------------------- 1 | # SSM3PublishPayload クラスドキュメント 2 | ```svg 3 | class SSM3PublishPayload(val data: ByteArray) { 4 | val cmdItCode = data[0].toUByte() 5 | val payload: ByteArray = data.drop(1).toByteArray() 6 | } 7 | ``` 8 | ### 説明 9 | 10 | `SSM3PublishPayload` は、SSM3プロトコルに関連するペイロード(データの負荷部分)を処理するためのKotlinクラスです。このクラスをインスタンス化する際には、バイト配列(ByteArray)を引数として渡す必要があります。 11 | 12 | ### プロパティ 13 | 14 | - `data`:ByteArray型のインスタンス変数です。この変数の値は、クラスのインスタンスを作成する際に提供する必要があります。 15 | 16 | - `cmdItCode`:提供された `data` 配列の最初のバイトを `UByte` (符号なしバイト)に変換した値です。 17 | 18 | - `payload`:これは `cmdItCode` の後に残る `data` 部分です。`data.drop(1)` を使用して、`data` 中の最初の要素を除いたすべての要素から新しい配列を生成します。 19 | 20 | ### 使用方法 21 | 22 | このクラスを使用するには、`SSM3PublishPayload` クラスのインスタンスを作成し、そのコンストラクタにバイト配列を提供する必要があります。この配列の最初のバイトは `cmdItCode` に変換され、残りの部分は `payload` に格納されます。 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icons_outlined_share.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /doc/class/CHWifiModule2_jp.md: -------------------------------------------------------------------------------- 1 | # CHWifiModule2 インターフェースのドキュメント 2 | 3 | `CHWifiModule2` は、デバイスに関連する操作を含むインターフェースであり、`CHDevices` インターフェースを継承しています。基本的なデバイス操作に加えて、WiFiモジュールに関連する操作も含まれています。 4 | 5 | ## 属性 6 | 7 | - `ssm2KeysMap: MutableMap` - Sesame2キーマップ 8 | - `mechSetting: CHWifiModule2MechSettings?` - WiFiモジュールのメカニズム設定 9 | 10 | ## メソッド 11 | 12 | - `fun scanWifiSSID(result: CHResult)` - WiFi SSIDをスキャンする 13 | - `fun setWifiSSID(ssid: String, result: CHResult)` - WiFi SSIDを設定する 14 | - `fun setWifiPassword(password: String, result: CHResult)` - WiFiパスワードを設定する 15 | - `fun connectWifi(result: CHResult)` - WiFiに接続する 16 | - `fun insertSesames(sesame: CHDevices, result: CHResult)` - Sesameデバイスを挿入する 17 | - `fun removeSesame(sesameKeyTag: String, result: CHResult)` - Sesameデバイスを削除する 18 | -------------------------------------------------------------------------------- /doc/class/SSM2OpCode_jp.md: -------------------------------------------------------------------------------- 1 | # SSM2OpCode 列挙型 2 | 3 | `SSM2OpCode` は、操作コードを表す内部の列挙型です。 4 | 5 | ## 列挙値 6 | 7 | - `create`: 値は `0x01` で、作成操作を示します。 8 | - `read`: 値は `0x02` で、読み取り操作を示します。 9 | - `update`: 値は `0x03` で、更新操作を示します。 10 | - `delete`: 値は `0x04` で、削除操作を示します。 11 | - `sync`: 値は `0x05` で、同期操作を示します。 12 | - `async`: 値は `0x06` で、非同期操作を示します。 13 | - `response`: 値は `0x07` で、応答操作を示します。 14 | - `publish`: 値は `0x08` で、公開操作を示します。 15 | - `undefine`: 値は `0x10` で、未定義の操作を示します。 16 | 17 | | SSM2OpCode | 操作名 | 説明 | 18 | | ------ | -------- | ------ | 19 | | 0x01 | create | 作成 | 20 | | 0x02 | read | 読み取り | 21 | | 0x03 | update | 更新 | 22 | | 0x04 | delete | 削除 | 23 | | 0x05 | sync | 同期 | 24 | | 0x06 | async | 非同期 | 25 | | 0x07 | response | 応答 | 26 | | 0x08 | publish | 公開 | 27 | | 0x10 | undefine | 未定義 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/find_friend.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /doc/ble_product_serials_jp.md: -------------------------------------------------------------------------------- 1 | BLEプロダクトコード例解説一覧 2 | ======== 3 | 8 | ### 1. [Sesame 5](command/sesame5fun_jp.md) 9 | ### 2. [Sesame 5 Pro ](command/sesame5fun_jp.md) 10 | ### 3. [Sesame Bike 2](command/sesamebike2fun_jp.md) 11 | ### 4. [Sesame WiFi Module 2](command/sesamewifimodule_jp.md) 12 | ### 5. [Sesame BLE Connector1](command/sesametouchpro_jp.md) 13 | ### 6. [Sesame Touch 1 Pro](command/sesametouchpro_jp.md) 14 | ### 7. [Sesame Open Sensor 1](command/sesame_open_sensor_jp.md) 15 | ### 8. [Sesame Touch 1](command/sesametouchpro_jp.md) 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /doc/class/CHSesameSensor.md: -------------------------------------------------------------------------------- 1 | 2 | # CHSesameSensor インターフェース 3 | ```svg 4 | 5 | interface CHSesameSensor : CHSesameLock, CHSesameConnector { 6 | fun unlock(historytag: ByteArray? = null, result: CHResult) 7 | fun deleteCards(cardID: String, result: CHResult) 8 | fun getCards(result: CHResult>) 9 | } 10 | ``` 11 | 12 | `CHSesameSensor`は、`CHSesameLock`および`CHSesameConnector`インターフェースを継承したデバイスインターフェースです。Sesame Sensorデバイスの管理と操作に特化しています。 13 | 14 | ## メソッド 15 | 16 | - `fun unlock(historyTag: ByteArray? = null, result: CHResult)` - Sesame Sensorのロックを解除します。 17 | 18 | - `fun deleteCards(cardID: String, result: CHResult)` - 指定されたカードを削除します。 19 | 20 | - `fun getCards(result: CHResult>)` - すべてのカードを取得します。 21 | 22 | 上記は`CHSesameSensor`インターフェースについての基本的な説明です。Sesame Sensorデバイスに対して完全な操作と管理方法を提供します。 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_red_unlock_all.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /doc/class/DeviceSegmentType.md: -------------------------------------------------------------------------------- 1 | # # DeviceSegmentType 列挙型 2 | 3 | ```svg 4 | internal enum class DeviceSegmentType(var value: Int) { 5 | plain(1), cipher(2), ; 6 | companion object { 7 | private val values = values() 8 | fun getByValue(value: Int) = values.first { it.value == value } 9 | } 10 | } 11 | ``` 12 | 13 | 14 | 15 | 16 | `DeviceSegmentType` は内部の列挙型です。 17 | 18 | ## 列挙値 19 | 20 | この列挙型には、多くの列挙項目が含まれており、それぞれ異なるデバイスのセグメントタイプに対応しています。各列挙項目は `Int` 型の値を持っています。 21 | 22 | 以下は`DeviceSegmentType` 列挙型の詳細なリストです。 23 | 24 | | 命令名 | SegmentType | 説明 | 25 | |:---:|:---:|:---| 26 | | plain | 1 | 暗号化されていないデータ | 27 | | cipher | 2 | 暗号化されているデータ | 28 | 29 | ## 伴生オブジェクト 30 | 31 | `DeviceSegmentType` 列挙型には、次の機能を提供する伴生オブジェクトがあります。 32 | 33 | - `values`:すべての値を返します。 34 | - `getByValue`:指定された値によって対応の列挙項目を返します。対応の列挙項目が見つからない場合はエラーを返します。 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/app/ext/AppLifecycleObserver.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.app.ext 2 | 3 | import androidx.lifecycle.DefaultLifecycleObserver 4 | import androidx.lifecycle.LifecycleOwner 5 | import co.candyhouse.sesame.utils.L 6 | 7 | /** 8 | * APP应用状态监听 9 | * 10 | * @author frey on 2025/2/17 11 | */ 12 | class AppLifecycleObserver : DefaultLifecycleObserver { 13 | var isAppForeground = false 14 | private set 15 | 16 | override fun onStart(owner: LifecycleOwner) { 17 | // 应用进入前台 18 | L.d("sf", "App is in the foreground") 19 | super.onStart(owner) 20 | isAppForeground = true 21 | } 22 | 23 | override fun onStop(owner: LifecycleOwner) { 24 | // 应用进入后台 25 | L.d("sf", "App is in the background") 26 | super.onStop(owner) 27 | isAppForeground = false 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /doc/class/CHDeviceUtil_jp.md: -------------------------------------------------------------------------------- 1 | # CHDeviceUtil インターフェースドキュメント 2 | ```svg 3 | internal interface CHDeviceUtil { 4 | var advertisement: CHadv? 5 | var sesame2KeyData: CHDevice? 6 | fun goIOT() {} 7 | fun login(token: String? = null) 8 | } 9 | ``` 10 | ### 説明 11 | 12 | `CHDeviceUtil` は、デバイス関連の操作を定義するための内部インターフェースです。 13 | 14 | ### プロパティ 15 | 16 | - `advertisement`:`CHadv` 型の変数で、広告に関連するデータです。広告がない場合、`null` の可能性があります。 17 | 18 | - `sesame2KeyData`:`CHDevice` インスタンス変数で、デバイス(おそらく "鍵" を指す)に関連するデータが格納されます。 19 | 20 | ### メソッド 21 | 22 | - `goIOT` メソッド:このメソッドは、IoT(Internet of Things)に関連するサービスを購読するためのものです。このメソッドは、インターフェース内でデフォルトの空実装が提供されていますが、具体的な実装クラスで上書きすることができます。 23 | 24 | - `login` メソッド:このメソッドは、ログイン操作に使用されます。匿名引数 `token` のデフォルト値は `null` です。 25 | 26 | ### 使用方法 27 | 28 | このインターフェースを使用するには、`CHDeviceUtil` インターフェースを実装したクラスを作成し、そのクラスをインスタンス化します。そのクラス内では、必要に応じて 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icon_lock_uncheck.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /doc/class/CHSesameLock.md: -------------------------------------------------------------------------------- 1 | 2 | # CHSesameLock インターフェース 3 | ```svg 4 | interface CHSesameLock : CHDevices { 5 | 6 | fun isEnableNotification(fcmToken: String, result: CHResult) 7 | 8 | fun enableNotification(fcmToken: String, result: CHResult) 9 | 10 | fun disableNotification(fcmToken: String, result: CHResult) 11 | } 12 | ``` 13 | 14 | `CHSesameLock` は、`CHDevices` インターフェースを継承したデバイスのインターフェースです。Sesame lockデバイスを管理および操作します。 15 | 16 | ## メソッド 17 | 18 | - `fun isEnableNotification(fcmToken: String, result: CHResult)` - 通知が有効になっているかどうかをチェックします。通知が有効な場合はtrueを返し、それ以外の場合はfalseを返します。 19 | - `fun enableNotification(fcmToken: String, result: CHResult)` - 通知を有効にします。操作が成功した場合は操作結果を返し、それ以外の場合はエラーメッセージを返します。 20 | - `fun disableNotification(fcmToken: String, result: CHResult)` - 通知を無効にします。操作が成功した場合は操作結果を返し、それ以外の場合はエラーメッセージを返します。 21 | 22 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/ble/os2/base/CHSesameOS2.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.ble.os2.base 2 | 3 | import co.candyhouse.sesame.ble.* 4 | import co.candyhouse.sesame.ble.CHBaseDevice 5 | import co.candyhouse.sesame.utils.* 6 | import kotlinx.coroutines.channels.Channel 7 | 8 | internal typealias SesameOS2ResponseCallback = (result: SSM2ResponsePayload) -> Unit 9 | 10 | internal open class CHSesameOS2 : CHBaseDevice() { 11 | var cipher: SesameOS2BleCipher? = null 12 | var semaphore: Channel = Channel(capacity = 1) 13 | val mAppToken = generateRandomData(4) 14 | } 15 | internal data class SSM2Payload(val opCode: SSM2OpCode, val itemCode: SesameItemCode, val data: ByteArray) { 16 | fun toDataWithHeader(): ByteArray { 17 | return byteArrayOf(opCode.value, itemCode.value.toByte()) + data 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/server/dto/IrDeviceAddRequest.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.server.dto 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class IrDeviceAddRequest( 6 | @SerializedName("uuid") val uuid: String, 7 | @SerializedName("model") val model: String, 8 | @SerializedName("state") val state: String, 9 | @SerializedName("alias") val alias: String, 10 | @SerializedName("type") val type: Int, 11 | @SerializedName("deviceUUID") val deviceId: String, 12 | @SerializedName("code") val code: Int, 13 | @SerializedName("keys") val keys: Array> = emptyArray() 14 | ){ 15 | override fun toString(): String { 16 | return "IrDeviceAddRequest(uuid='$uuid', model='$model', state='$state', alias='$alias', type=$type, deviceId='$deviceId', code=$code, keys=${keys.contentToString()})" 17 | } 18 | } -------------------------------------------------------------------------------- /doc/class/CHBaseAdv_jp.md: -------------------------------------------------------------------------------- 1 | # CHBaseAdv インターフェースのドキュメント 2 | ```svg 3 | 4 | internal interface CHBaseAdv { 5 | val rssi: Int? 6 | val isRegistered: Boolean 7 | val adv_tag_b1: Boolean 8 | val deviceID: UUID? 9 | var device: BluetoothDevice 10 | var deviceName: String? 11 | var productModel: CHProductModel? 12 | var isConnecable: Boolean? 13 | } 14 | ``` 15 | `CHBaseAdv` は、内部インターフェースです。 16 | 17 | ## プロパティ 18 | 19 | - `rssi`:`Int?` 型のプロパティで、受信信号強度指示子(RSSI)を受け取ります。 20 | - `isRegistered`:`Boolean` 型のプロパティで、登録済みかどうかを示します。 21 | - `adv_tag_b1`:`Boolean` 型のプロパティで、広告タグを表します。 22 | - `deviceID`:`UUID?` 型のプロパティで、デバイスのUUIDを示します。 23 | - `device`:`BluetoothDevice` 型のプロパティで、Bluetoothデバイスを表します。 24 | - `deviceName`:`String?` 型のプロパティで、デバイス名を示します。 25 | - `productModel`:`CHProductModel?` 型のプロパティで、製品モデルを表します。 26 | - `isConnecable`:`Boolean?` 型のプロパティで、接続可能かどうかを示します。 27 | -------------------------------------------------------------------------------- /doc/class/CHSesameSensor_jp.md: -------------------------------------------------------------------------------- 1 | # CHSesameSensor インターフェースのドキュメント 2 | ```svg 3 | 4 | interface CHSesameSensor : CHSesameLock, CHSesameConnector { 5 | fun unlock(historytag: ByteArray? = null, result: CHResult) 6 | fun deleteCards(cardID: String, result: CHResult) 7 | fun getCards(result: CHResult>) 8 | } 9 | ``` 10 | `CHSesameSensor` インターフェースは、Sesame Sensor デバイスの管理と操作に使用されます。このインターフェースは `CHSesameLock` および `CHSesameConnector` インターフェースを継承しています。 11 | 12 | ## メソッド 13 | 14 | - `fun unlock(historyTag: ByteArray? = null, result: CHResult)` - Sesame Sensor を解錠します。 15 | 16 | - `fun deleteCards(cardID: String, result: CHResult)` - 指定したカードを削除します。 17 | 18 | - `fun getCards(result: CHResult>)` - すべてのカードを取得します。 19 | 20 | 上記は `CHSesameSensor` インターフェースの基本的な説明です。このインターフェースは Sesame Sensor デバイスに対して完全な操作と管理メソッドを提供します。 21 | -------------------------------------------------------------------------------- /doc/command/autolock_jp.md: -------------------------------------------------------------------------------- 1 | # AutoLock自动锁 2 | 3 | ### 送信フォーマット 4 | | バイト | 2〜1 | 0 | 5 | |:----:|:-----:|:------:| 6 | | データ | 遅延時間 | コマンド | 7 | - コマンド: 指令11(固定) 8 | - 遅延時間: 遅延時間(秒)、0は自動解錠無効 9 | 10 | ## 受信フォーマット 11 | | バイト | 2 | 1 | 0 | 12 | |:----:|:----:|:----:|:----:| 13 | | データ | ステータス | コマンド | レスポンス | 14 | - コマンド: 指令11(固定) 15 | - レスポンス: 応答0x07(固定) 16 | - ステータス: 状態0x00(成功) 17 | 18 | ## シーケンス図 19 | ![v](autolock.svg) 20 | 21 | ## Androidの例 22 | ``` java 23 | override fun autolock(delay: Int, result: CHResult) { 24 | if (checkBle(result)) return 25 | sendCommand(SesameOS3Payload(SesameItemCode.autolock.value, delay.toShort().toReverseBytes()), DeviceSegmentType.cipher) { res -> 26 | mechSetting?.autoLockSecond = delay.toShort() 27 | result.invoke(Result.success(CHResultState.CHResultStateBLE(delay))) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_blue_lock_all.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /doc/class/CHDeviceUtil.md: -------------------------------------------------------------------------------- 1 | ## CHDeviceUtil インターフェース 2 | ```svg 3 | internal interface CHDeviceUtil { 4 | var advertisement: CHadv? 5 | var sesame2KeyData: CHDevice? 6 | fun goIOT() {} 7 | fun login(token: String? = null) 8 | } 9 | ``` 10 | 11 | 12 | 13 | ### 説明 14 | 15 | `CHDeviceUtil`は内部インターフェースで、デバイス関連の操作を定義するためのメソッドとプロパティを提供します。 16 | 17 | ### プロパティ 18 | 19 | - `advertisement`: `CHadv`型で、アドバタイジング関連のデータです。アドバタイジングがない場合は「null」になる可能性があります。 20 | 21 | - `sesame2KeyData`: `CHDevice` のインスタンス変数で、デバイス(「鍵」を指す場合がある)に関連するデータを保存します。 22 | 23 | ### メソッド 24 | 25 | - `goIOT` メソッド:IoT(Internet of Things)関連のサービスを購読するためのものです。インターフェース内で既にデフォルトの空実装が提供されている上に、具体的な実装クラスで上書きすることができます。 26 | 27 | - `login` メソッド:ログイン操作に使用され、匿名パラメータ`token` のデフォルト値は`null`です。 28 | 29 | ### 使用 30 | 31 | このインターフェースを使用するために、`CHDeviceUtil`インターフェースを実装したクラスを作成する上に、クラスのインスタンスを作成します。そのクラス内で、実際の要求に応じてメソッドを実装することが可能です。 -------------------------------------------------------------------------------- /app/src/main/java/co/utils/balloon/ArrowOrientation.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2019 skydoves 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.skydoves.balloon 18 | 19 | /** ArrowOrientation determines the orientation of the arrow. */ 20 | enum class ArrowOrientation { 21 | BOTTOM, 22 | TOP, 23 | LEFT, 24 | RIGHT 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_keychain_original.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 16 | 21 | 22 | -------------------------------------------------------------------------------- /doc/class/SSM2ResponsePayload.md: -------------------------------------------------------------------------------- 1 | ## SSM2ResponsePayload クラス 2 | ```svg 3 | internal class SSM2ResponsePayload(val data: ByteArray) { 4 | val cmdItCode: UByte = data[0].toUByte()// login 5 | val cmdOPCode: UByte = data[1].toUByte()// sync 6 | val cmdResultCode: UByte = data[2].toUByte()// success 7 | val payload: ByteArray = data.drop(3).toByteArray() 8 | } 9 | 10 | ``` 11 | ### 説明 12 | 13 | `SSM2ResponsePayload`は、SSM2プロトコルの応答ペイロード(payload)を処理するためのKotlinの内部クラスです。このクラスをインスタンス化する際には、バイト配列を引数として渡す必要があります. 14 | 15 | ### プロパティ 16 | 17 | - `data`:バイト配列(ByteArray)型のインスタンス変数です。この`data`変数は、クラスのインスタンスを作成する際には、提供する必要があります。 18 | 19 | - `cmdItCode`: 提供された`data`配列の最初の要素をUByte型(符号なしバイト)に変換します。ログイン操作を示します。 20 | 21 | - `cmdOPCode`: 提供された`data`配列の2番目の要素をUByte型に変換します。同期操作を示します。 22 | 23 | - `cmdResultCode`: 提供された`data`配列の3番目の要素をUByte型に変換します。操作が成功したかどうかを示します。 24 | 25 | - `payload`: `cmdResultCode`の後に`data`の残りの部分です. -------------------------------------------------------------------------------- /doc/class/SSM3ResponsePayload.md: -------------------------------------------------------------------------------- 1 | 2 | ## SSM3ResponsePayload クラス 3 | ```svg 4 | internal class SSM3ResponsePayload(val data: ByteArray) { 5 | val cmdItCode: UByte = data[0].toUByte() 6 | val cmdResultCode: UByte = data[1].toUByte() 7 | val payload: ByteArray = data.drop(2).toByteArray() 8 | } 9 | ``` 10 | 11 | 12 | ### 説明 13 | 14 | `SSM3ResponsePayload` は、SSM3プロトコルの応答ペイロード(payload)を処理するためのKotlinの内部クラスです。このクラスをインスタンス化する際には、バイト配列を引数として渡す必要があります. 15 | 16 | ### プロパティ 17 | 18 | - `data`: バイト配列(ByteArray)型のインスタンス変数です。この`data`変数は、クラスのインスタンスを作成する際には、提供する必要があります。 19 | 20 | - `cmdItCode`: 提供された`data`配列の最初の要素をUByte型(符号なしバイト)に変換します。 21 | 22 | - `cmdResultCode`: 提供された`data`配列の2番目の要素をUByte型に変換します。操作の結果コードを示します。 23 | 24 | - `payload`: `cmdResultCode`の後に`data`の残りの部分です.这是 `cmdResultCode` 之后的 `data` 的剩余部分。`data.drop(2)` を使用して、最初の2つの要素を除いた、`data` のすべての要素を含む新しい配列を生成します。 25 | 26 | ### 使用 27 | 28 | 要使用这个类,你需要实例化一个 ` -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/CHSesameBike2.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device 2 | 3 | import co.candyhouse.sesame.open.CHResult 4 | import co.candyhouse.sesame.server.dto.CHEmpty 5 | import co.candyhouse.sesame.utils.bytesToShort 6 | import java.util.* 7 | 8 | interface CHSesameBike2 : CHSesameLock { 9 | var mechSetting: CHSesame5MechSettings? 10 | fun unlock(tag: ByteArray? = null, result: CHResult) 11 | } 12 | 13 | class CHSesameBike2MechStatus(override val data: ByteArray) : CHSesameProtocolMechStatus { 14 | private val battery = bytesToShort(data[0], data[1]) 15 | private val flags = data[2].toInt() 16 | override var isInLockRange: Boolean = flags and 2 > 0 17 | override var isStop: Boolean? = flags and 4 > 0 18 | override fun getBatteryVoltage(): Float { 19 | return battery * 2f / 1000f 20 | } 21 | } 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/dto/CredentialListResponse.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server.dto 2 | 3 | 4 | 5 | data class CredentialListResponse( 6 | val action: String, 7 | val op: String, 8 | val code: Int, 9 | val data: CredentialListData, 10 | val message: String, 11 | val success: Boolean 12 | ) 13 | 14 | data class CredentialListData( 15 | val success: Boolean, 16 | val tableName: String, 17 | val deviceID: String, 18 | val items: List, 19 | val count: Int 20 | ) 21 | 22 | 23 | open class AuthenticationData { 24 | var credentialId = "" 25 | var nameUUID: String = "" 26 | var type: Byte = 0 27 | var name: String = "" 28 | override fun toString(): String { 29 | return "AuthenticationData(credentialId='$credentialId', nameUUID='$nameUUID', type=$type, name='$name')" 30 | } 31 | 32 | 33 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/click_stop.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/adp_bot_item_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 23 | 24 | -------------------------------------------------------------------------------- /doc/touch/finger_delete_jp.md: -------------------------------------------------------------------------------- 1 | # Finger Delete 説明 2 | アプリが116コマンドを送信して、指定したIDの指紋を削除します。 3 | 4 | ### 送信フォーマット 5 | 6 | | バイト | 1| 0 | 7 | |:------:|---:|:--------:| 8 | | データ | 指紋ID| コマンド | 9 | 10 | - コマンド: 指令116(固定) 11 | - 指紋ID: 削除する指紋のID 12 | 13 | ### 受信フォーマット 14 | | バイト | 2 | 1 | 0 | 15 | |:---:|:-----------:|:----:|:---------:| 16 | | データ | ステータス | コマンド |レスポンス | 17 | - コマンド: 指令116(固定) 18 | - レスポンス: 応答0x07(固定) 19 | - ステータス: 0x00(成功) 20 | 21 | ### シーケンス図 22 | ![アイコン](finger_delete.svg) 23 | 24 | ### Androidの例 25 | ```java 26 | override fun fingerPrintDelete(ID: String, result: CHResult) { 27 | if (checkBle(result)) return 28 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_FINGERPRINT_DELETE.value, ID.hexStringToByteArray())) { 29 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/co/utils/balloon/OnBalloonDismissListener.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2019 skydoves 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.skydoves.balloon 18 | 19 | /** Interface definition for a callback to be invoked when a balloon view is dismissed. */ 20 | interface OnBalloonDismissListener { 21 | fun onBalloonDismiss() 22 | } 23 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/server/dto/CHSesameShadow.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.server.dto 2 | 3 | internal data class Sesame2Shadow( 4 | var state: Sesame2ShadowState 5 | ) 6 | 7 | internal data class Sesame2ShadowState( 8 | var reported: Sesame2Status 9 | ) 10 | 11 | internal data class Sesame2Status( 12 | var mechst: String?, 13 | var wm2s: Map? 14 | ) 15 | 16 | internal data class WM2Shadow( 17 | var state: WM2ShadowShadowState 18 | ) 19 | 20 | internal data class WM2ShadowShadowState( 21 | var reported: WM2ShadowStatus 22 | ) 23 | 24 | internal data class WM2ShadowStatus( 25 | var c: Boolean?, 26 | var ssks: String? 27 | ) 28 | 29 | internal data class Sesame5ShadowDocuments( 30 | var current: Sesame5ShadowDocumentsCurrent 31 | ) 32 | 33 | internal data class Sesame5ShadowDocumentsCurrent( 34 | var state: Sesame2ShadowState 35 | ) 36 | -------------------------------------------------------------------------------- /doc/class/SesameNotifypayload_jp.md: -------------------------------------------------------------------------------- 1 | # SesameNotifypayload クラスのドキュメント 2 | ``` 3 | internal class SesameNotifypayload(val data: ByteArray) { 4 | val notifyOpCode: SSM2OpCode = SSM2OpCode.getByValue(data[0]) 5 | val payload: ByteArray = data.drop(1).toByteArray() 6 | } 7 | ``` 8 | ### 説明 9 | 10 | `SesameNotifypayload` は、'Sesame' の通知に関連するペイロード(データの負荷部分)を処理するためのKotlinの内部クラスです。このクラスをインスタンス化する際には、バイト配列(ByteArray)を引数として渡す必要があります。 11 | 12 | ### プロパティ 13 | 14 | - `data`:ByteArray型のインスタンス変数です。この `data` 変数は、クラスのインスタンスを作成する際に提供する必要があります。 15 | 16 | - `notifyOpCode`:`data` 配列の最初のバイトの値を取得し、それを `SSM2OpCode.getByValue` 関数に渡して得られた結果を `notifyOpCode` とします。 17 | 18 | - `payload`:これは `notifyOpCode` の後に残る `data` 部分です。`data.drop(1)` を使用して、`data` 中の最初の要素を除いたすべての要素で新しい配列を生成します。 19 | 20 | ### 使用方法 21 | 22 | このクラスを使用するには、`SesameNotifypayload` クラスのインスタンスを作成し、そのコンストラクタにバイト配列を提供する必要があります。この配列の最初のバイトは、`notifyOpCode` に渡され、残りの部分は `payload` に格納されます。 23 | -------------------------------------------------------------------------------- /doc/touch/card_delete.md: -------------------------------------------------------------------------------- 1 | # Card Delete 説明 2 | 3 | ### 送信フォーマット 4 | 5 | | Byte | 16~1 | 0 | 6 | |:------:|---------:|--------:| 7 | | Data | card_id | command | 8 | 9 | - command:命令108(固定) 10 | - card_id:カードID 11 | 12 | 13 | 14 | ### 受信フォーマット 15 | 16 | | Byte | 2 | 1 | 0 | 17 | |:---:|:----:|:----:|:-----:| 18 | | Data | status | command |response | 19 | - command:命令108(固定) 20 | - response:応答0x07(固定) 21 | - status:状態0x00(成功) 22 | 23 | 24 | ### フローチャート 25 | ![icon](card_delete.svg) 26 | 27 | 28 | 29 | 30 | 31 | ### android例 32 | ``` java 33 | override fun cardDelete(ID: String, result: CHResult) { 34 | if (checkBle(result)) return 35 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_CARD_DELETE.value, ID.hexStringToByteArray())) { res -> 36 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 37 | } 38 | } 39 | ``` 40 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/utils/EventExtensions.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.utils 2 | 3 | import androidx.lifecycle.LifecycleOwner 4 | import androidx.lifecycle.LiveData 5 | 6 | /** 7 | * 一次性事件包装类 8 | * 用于解决 LiveData 粘性问题,确保事件只被消费一次 9 | */ 10 | class Event(private val content: T) { 11 | private var hasBeenHandled = false 12 | 13 | fun getContentIfNotHandled(): T? { 14 | return if (hasBeenHandled) { 15 | null 16 | } else { 17 | hasBeenHandled = true 18 | content 19 | } 20 | } 21 | 22 | fun peekContent(): T = content 23 | } 24 | 25 | /** 26 | * LiveData> 扩展函数 27 | */ 28 | inline fun LiveData>.observeEvent( 29 | owner: LifecycleOwner, 30 | crossinline onEventUnhandled: (T) -> Unit 31 | ) { 32 | observe(owner) { event -> 33 | event.getContentIfNotHandled()?.let(onEventUnhandled) 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/action_layout_dark.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 24 | -------------------------------------------------------------------------------- /app/src/main/java/co/utils/balloon/BalloonAnimation.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2019 skydoves 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.skydoves.balloon 18 | 19 | /** BalloonAnimation is the collection of the popup animations. */ 20 | @Suppress("unused") 21 | enum class BalloonAnimation { 22 | NONE, 23 | ELASTIC, 24 | FADE, 25 | CIRCULAR, 26 | OVERSHOOT 27 | } 28 | -------------------------------------------------------------------------------- /doc/bleprotocol/firmwareUpgradation.md: -------------------------------------------------------------------------------- 1 | SesameOs3 ファームウェアのアップグレード 2 | ======================= 3 | 1. APPとデバイスの接続が正常であることを確認してください。 4 | 2. ファームウェアのパス [app/src/main/res/raw](../../app/src/main/res/raw), 5 | ファームウェアの位置は以下の通りです。 6 | ![示例图片](firmware.png) 7 | 3. ファームウェアオブジェクト **CHProductModel** 8 | 4. フレームワークを選択します [Dfu](https://github.com/NordicSemiconductor/Android-DFU-Library) 9 | 5. コード例の位置[BaseDeviceSettingFG](../../app/src/main/java/co/candyhouse/app/base) 10 | ,以下のように、deviceAddressを取得し、DfuServiceInitiatorに書込みます。 11 | ``` 12 | val starter = DfuServiceInitiator(it.data.address) 13 | starter.setZip(targetDevice.getFirZip()) 14 | starter.setPacketsReceiptNotificationsEnabled(true) 15 | starter.setPrepareDataObjectDelay(400) 16 | starter.setUnsafeExperimentalButtonlessServiceInSecureDfuEnabled(true) 17 | starter.setDisableNotification(false) 18 | starter.setForeground(false) 19 | starter.start(requireActivity(), DfuService::class.java) 20 | ``` 21 | 22 | -------------------------------------------------------------------------------- /doc/command/autolock.md: -------------------------------------------------------------------------------- 1 | # AutoLock オートロック 2 | 3 | ### 送信フォーマット 4 | | Byte | 2 ~ 1 | 0 | 5 | |:----:|:-----:|:------:| 6 | | Data | delay_duration| command | 7 | - command:命令11(固定) 8 | - delay_duration:遅延時間(s) 0オートロックを無効にする 9 | 10 | ## 受信フォーマット 11 | | Byte | 2 | 1 | 0 | 12 | |:----:|:----:|:----:|:----:| 13 | | Data | status | command | response | 14 | - response:応答0x07(固定) 15 | - command:命令11(固定) 16 | - status:状態0x00(成功) 17 | ## フローチャート 18 | ![v](autolock.svg) 19 | 20 | 21 | 22 | 23 | 24 | ## android例 25 | ``` java 26 | override fun autolock(delay: Int, result: CHResult) { 27 | if (checkBle(result)) return 28 | sendCommand(SesameOS3Payload(SesameItemCode.autolock.value, delay.toShort().toReverseBytes()), DeviceSegmentType.cipher) { res -> 29 | mechSetting?.autoLockSecond = delay.toShort() 30 | result.invoke(Result.success(CHResultState.CHResultStateBLE(delay))) 31 | } 32 | } 33 | ``` 34 | -------------------------------------------------------------------------------- /doc/product_structure.md: -------------------------------------------------------------------------------- 1 | # Android プロジェクトのコード例 2 | 3 | ![SesameOs3](bleconnect/SesameOs3.jpg) 4 | 以下は一般的な Android プロジェクトの構造例で、コードとリソースファイルを整理するために使用されます。 5 | 6 | 主なプロジェクトの構造は次の通りです: 7 | - `libs/`:サードパーティのライブラリのバイナリファイルを保存するためのフォルダ(.jar、.aar など)です。 8 | 9 | - `java/`:Java コードを保存します。機能モジュールによってサブパッケージが分けられます。例えば `activities/` はアクティビティクラスを、`adapters/` はアダプタークラスを保存します。 10 | 11 | - `res/`:リソースファイルを保存し、レイアウトファイル、文字列、アイコンなどが含まれます。リソースの種類によってディレクトリごとに保存します。例えば `layout/` はレイアウトファイルを、`drawable/` は画像リソースを、`values/` は文字列やスタイルのリソースを保存します。 12 | 13 | - `build.gradle`:応用レベルの Gradle 設定ファイルで、依存関係、プラグイン、ビルド設定を構成するために使用されます。 14 | 15 | - `proguard-rules.pro`:ProGuard 設定ファイルで、コードの難読化と最適化を行うために使用されます。これはオプションで、リリースバージョンの場合に適用されます。 16 | - co.candyhouse.sesame.ble: 主にos2、os3のBleデバイスの接続と機能を保存します。 17 | - co.candyhouse.sesame.db: ローカルストレージに保存します。 18 | - co.candyhouse.sesame.open: Bleデバイスの管理、設定、パラメータを保存します。 19 | - co.candyhouse.sesame.utils: Ble転送の暗号化アルゴリズムやログの記録を保存します。 20 | 21 | -------------------------------------------------------------------------------- /doc/touch/kbpc_delete_jp.md: -------------------------------------------------------------------------------- 1 | # KeyboardPassword Delete 説明 2 | アプリが124コマンドを送信して、指定したIDのパスワードを削除します。 3 | 4 | ### 送信フォーマット 5 | 6 | | バイト | 1 | 0 | 7 | |:------:|------:|:--------:| 8 | | データ | パスワードID | コマンド | 9 | 10 | - コマンド: 指令124(固定) 11 | - パスワードID: 削除するパスワードのID 12 | 13 | ### 受信フォーマット 14 | | バイト | 2 | 1 | 0 | 15 | |:---:|:-----------:|:----:|:---------:| 16 | | データ | ステータス | コマンド |レスポンス | 17 | - コマンド: 指令124(固定) 18 | - レスポンス: 応答0x07(固定) 19 | - ステータス: 0x00(成功) 20 | 21 | ### シーケンス図 22 | ![アイコン](kbpc_delete.svg) 23 | 24 | ### Androidの例 25 | ```java 26 | override fun keyBoardPassCodeDelete(ID: String, result: CHResult) { 27 | if (checkBle(result)) return 28 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_PASSCODE_DELETE.value, ID.hexStringToByteArray())) { res -> 29 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/baseCapbale/CHDataSynchronizeCapable.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.baseCapbale 2 | 3 | import co.candyhouse.sesame.open.CHResult 4 | import co.candyhouse.sesame.server.dto.AuthenticationData 5 | import co.candyhouse.sesame.server.dto.AuthenticationDataWrapper 6 | import co.candyhouse.sesame.server.dto.CHAuthenticationNameRequest 7 | import co.candyhouse.sesame.server.dto.CHEmpty 8 | 9 | interface CHDataSynchronizeCapable { 10 | fun postAuthenticationData(request: AuthenticationDataWrapper, result: CHResult>) 11 | fun putAuthenticationData(request: AuthenticationDataWrapper, result: CHResult) 12 | fun deleteAuthenticationData(deleteReq: AuthenticationDataWrapper, result: CHResult) 13 | fun updateAuthenticationName(data: CHAuthenticationNameRequest, result: CHResult) 14 | } -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/app/ext/TokenManager.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.app.ext 2 | 3 | import com.amazonaws.mobile.client.AWSMobileClient 4 | import com.amazonaws.mobile.client.Callback 5 | import com.amazonaws.mobile.client.results.Tokens 6 | 7 | /** 8 | * Token管理类 9 | * 10 | * @author frey on 2025/9/15 11 | */ 12 | object TokenManager { 13 | 14 | fun getValidToken(callback: (Result) -> Unit) { 15 | if (!AWSMobileClient.getInstance().isSignedIn()) { 16 | callback(Result.success(null)) 17 | return 18 | } 19 | 20 | AWSMobileClient.getInstance().getTokens(object : Callback { 21 | override fun onResult(result: Tokens) { 22 | callback(Result.success(result.idToken.tokenString)) 23 | } 24 | 25 | override fun onError(e: Exception) { 26 | callback(Result.failure(e)) 27 | } 28 | }) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/co/utils/balloon/OnBalloonClickListener.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2019 skydoves 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.skydoves.balloon 18 | 19 | import android.view.View 20 | 21 | /** Interface definition for a callback to be invoked when a balloon view is clicked. */ 22 | interface OnBalloonClickListener { 23 | fun onBalloonClick(view: View) 24 | } 25 | -------------------------------------------------------------------------------- /doc/command/reset_jp.md: -------------------------------------------------------------------------------- 1 | # リセット デバイスのリセット 2 | 3 | ### 送信フォーマット 4 | 5 | | バイト | 0 | 6 | |:------:|:------------:| 7 | | データ | command | 8 | 9 | 10 | - command: 指令104(固定) 11 | 12 | ### 受信フォーマット 13 | 14 | | バイト | 2 | 1 | 0 | 15 | |:-------:|:------:|:---------:|:----------:| 16 | | データ | status | command | response | 17 | - command: 指令104(固定) 18 | - response: 响应0x07(固定) 19 | - status: 状態0x00(成功) 20 | 21 | ### シーケンス図 22 | ![アイコン](reset.svg) 23 | 24 | ### Androidの例 25 | ```java 26 | open fun reset(result: CHResult) { 27 | sendCommand(SesameOS3Payload(SesameItemCode.Reset.value, byteArrayOf()), DeviceSegmentType.cipher) { res -> 28 | if (res.cmdResultCode == SesameResultCode.success.value) { 29 | dropKey(result) 30 | } else { 31 | result.invoke(Result.failure(NSError(res.cmdResultCode.toString(), "CBCentralManager", res.cmdResultCode.toInt()))) 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /doc/product_structure_ja.md: -------------------------------------------------------------------------------- 1 | # Android プロジェクトの構造例 2 | 3 | ![SesameOs3](bleconnect/SesameOs3.jpg) 4 | 以下は一般的な Android プロジェクトの構造の例で、コードとリソースファイルを整理するために使用されます。 5 | 6 | この例では、主なプロジェクトの構造は次の通りです: 7 | - `libs/`:通常、サードパーティのライブラリ(.jar、.aar など)のバイナリファイルを格納するためのフォルダです。 8 | - `java/`:Java コードを格納する場所です。機能モジュールごとにサブパッケージに分割されます。例えば `activities/` はアクティビティクラスを、`adapters/` はアダプタークラスを格納する場所です。 9 | 10 | - `res/`:リソースファイルを格納する場所で、レイアウトファイル、文字列、アイコンなどが含まれます。リソースの種類ごとにディレクトリを分けて格納します。例えば `layout/` はレイアウトファイルを、`drawable/` は画像リソースを、`values/` は文字列やスタイルのリソースを格納します。 11 | 12 | - `build.gradle`:アプリケーションレベルの Gradle 設定ファイルで、依存関係、プラグイン、ビルド設定を構成するために使用されます。 13 | 14 | - `proguard-rules.pro`:ProGuard 設定ファイルで、コードの難読化と最適化を行うために使用されます。これはオプションで、リリースバージョンの場合に使用されます。 15 | - co.candyhouse.sesame.ble:主にos2、os3のBleデバイスの接続と機能を格納します。 16 | - co.candyhouse.sesame.db:ローカルストレージを格納します。 17 | - co.candyhouse.sesame.open:Bleデバイスの管理、設定、パラメータを格納します。 18 | - co.candyhouse.sesame.utils:Ble転送の暗号化アルゴリズムやログの記録を格納します。 19 | -------------------------------------------------------------------------------- /doc/touch/kbpc_mode_get_jp.md: -------------------------------------------------------------------------------- 1 | # KeyboardPassword Mode Get 説明 2 | アプリが129コマンドを送信して、ssm_touchの現在の数字ロックの状態を取得します。 3 | 4 | ### 送信フォーマット 5 | 6 | | バイト | 0 | 7 | |:------:|-------:| 8 | | データ | コマンド | 9 | 10 | - コマンド: 指令129(固定) 11 | 12 | ### 受信フォーマット 13 | 14 | | バイト | 3 | 2 | 1 | 0 | 15 | |:---:|:-------:|:------:|:----:|:---------:| 16 | | データ | 数字ロックモード | ステータス | コマンド |レスポンス | 17 | - コマンド: 指令129(固定) 18 | - レスポンス: 応答0x07(固定) 19 | - ステータス: 0x00(成功) 20 | - 数字ロックモード: 0x00->認証モード,0x01->新規追加モード 21 | 22 | ### シーケンス図 23 | ![アイコン](kbpc_mode_get.svg) 24 | 25 | ### Androidの例 26 | ```java 27 | override fun keyBoardPassCodeModeGet(result: CHResult) { 28 | if (checkBle(result)) return 29 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_PASSCODE_MODE_GET.value, byteArrayOf())) { res -> 30 | result.invoke(Result.success(CHResultState.CHResultStateBLE(res.payload[0]))) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /doc/bleprotocol/firmwareUpgradation_ja.md: -------------------------------------------------------------------------------- 1 | 2 | SesameOs3 ファームウェアアップデート 3 | ======================= 4 | 1. アプリとデバイスが正常に接続されていることを確認します。 5 | 2. ファームウェアのパス [app/src/main/res/raw](../../app/src/main/res/raw), 6 | ファームウェアの場所は以下の画像の通りです: 7 | ![サンプル画像](firmware.png) 8 | 3. ファームウェアオブジェクト **CHProductModel** 9 | 4. フレームワークの選択 [Dfu](https://github.com/NordicSemiconductor/Android-DFU-Library) 10 | 5. サンプルコードの場所 [BaseDeviceSettingFG](../../app/src/main/java/co/candyhouse/app/base) 11 | , deviceAddress を DfuServiceInitiator に渡す例は以下の通りです: 12 | ``` 13 | val starter = DfuServiceInitiator(it.data.address) 14 | starter.setZip(targetDevice.getFirZip()) 15 | starter.setPacketsReceiptNotificationsEnabled(true) 16 | starter.setPrepareDataObjectDelay(400) 17 | starter.setUnsafeExperimentalButtonlessServiceInSecureDfuEnabled(true) 18 | starter.setDisableNotification(false) 19 | starter.setForeground(false) 20 | starter.start(requireActivity(), DfuService::class.java) 21 | ``` 22 | 23 | -------------------------------------------------------------------------------- /doc/touch/card_delete_jp.md: -------------------------------------------------------------------------------- 1 | # Card Delete の説明 2 | 3 | ### 送信形式 4 | 5 | 6 | | Byte | 16~1 | 0 | 7 | |:------:|---------:|--------:| 8 | | Data | card_id | command | 9 | 10 | - command:108コマンド (固定) 11 | - card_id:カードID 12 | 13 | 14 | 15 | ### 受信形式 16 | 17 | 18 | | Byte | 2 | 1 | 0 | 19 | |:---:|:----:|:----:|:-----:| 20 | | Data | status | command |response | 21 | - command:108コマンド (固定) 22 | - response:0x07応答 (固定) 23 | - status:状态0x00(成功) 24 | 25 | 26 | ### シーケンス図 27 | 28 | ![icon](card_delete.svg) 29 | 30 | 31 | 32 | 33 | 34 | ### Androidの例 35 | 36 | ``` java 37 | override fun cardDelete(ID: String, result: CHResult) { 38 | if (checkBle(result)) return 39 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_CARD_DELETE.value, ID.hexStringToByteArray())) { res -> 40 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 41 | } 42 | } 43 | ``` 44 | -------------------------------------------------------------------------------- /app/src/main/java/co/utils/alertview/objects/AlertAction.kt: -------------------------------------------------------------------------------- 1 | package co.utils.alertview.objects 2 | 3 | import co.utils.alertview.interfaces.AlertActionListener 4 | import co.utils.alertview.enums.AlertActionStyle 5 | 6 | /** 7 | * Created by hammad.akram on 3/14/18. 8 | */ 9 | class AlertAction { 10 | var title: String 11 | var style: AlertActionStyle 12 | var action: ((AlertAction) -> Unit)? 13 | var actionListener: AlertActionListener? 14 | 15 | constructor(title: String, style: AlertActionStyle, action: (AlertAction) -> Unit) { 16 | this.title = title 17 | this.style = style 18 | this.action = action 19 | this.actionListener = null 20 | } 21 | 22 | constructor(title: String, style: AlertActionStyle, actionListener: AlertActionListener) { 23 | this.title = title 24 | this.style = style 25 | this.actionListener = actionListener 26 | this.action = null 27 | } 28 | 29 | 30 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_eye_off.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /doc/touch/card_model_get.md: -------------------------------------------------------------------------------- 1 | # Card Mode Get 説明 2 | 携帯電話で命令113を送信し、カードの新規モードまたは認証モードを取得します。 3 | ### 送信フォーマット 4 | 5 | | Byte | 0 | 6 | |:------:|-------:| 7 | | Data | command | 8 | 9 | - command:命令113(固定) 10 | 11 | 12 | 13 | 14 | ### 受信フォーマット 15 | 16 | | Byte | 3 | 2 | 1 | 0 | 17 | |:---:|:-------:|:-----:|:----:|:-----:| 18 | | Data | card_mode| status | command |response | 19 | - command:命令113(固定) 20 | - response:応答0x07(固定) 21 | - status:0x00(成功) 22 | - card_mode:0x00->認証モード,0x01->新規モード 23 | 24 | 25 | ### フローチャート 26 | ![icon](card_model_get.svg) 27 | 28 | 29 | 30 | 31 | 32 | ### android例 33 | ``` java 34 | override fun cards(result: CHResult) { 35 | if (checkBle(result)) return 36 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_CARD_GET.value, byteArrayOf())) { res -> 37 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 38 | } 39 | } 40 | ``` 41 | -------------------------------------------------------------------------------- /app/src/main/java/co/utils/ContainerPaddingManager.kt: -------------------------------------------------------------------------------- 1 | package co.utils 2 | 3 | import androidx.fragment.app.Fragment 4 | 5 | /** 6 | * 引用计数 7 | * 8 | * @author frey on 2025/10/27 9 | */ 10 | object ContainerPaddingManager { 11 | private var clearPaddingRefCount = 0 12 | 13 | fun requestClearPadding(fragment: Fragment) { 14 | synchronized(this) { 15 | clearPaddingRefCount++ 16 | if (clearPaddingRefCount == 1) { 17 | fragment.clearContainerTopPadding() 18 | } 19 | } 20 | } 21 | 22 | fun releaseClearPadding(fragment: Fragment) { 23 | synchronized(this) { 24 | clearPaddingRefCount-- 25 | if (clearPaddingRefCount == 0) { 26 | fragment.restoreContainerTopPadding() 27 | } 28 | // 防止计数错误 29 | if (clearPaddingRefCount < 0) { 30 | clearPaddingRefCount = 0 31 | } 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /doc/bleconnect/timestamp.md: -------------------------------------------------------------------------------- 1 | # timestamp タイムスタンプを更新します 2 | 3 | ### 送信フォーマット 4 | 5 | | Byte | 4~1| 0 | 6 | |:------:|:----:|--------:| 7 | | Data | timestamp| command | 8 | 9 | - command:命令8(固定) 10 | - timestamp:現時点のスマートフォンのタイムスタンプ 11 | 12 | 13 | ### 受信フォーマット 14 | 15 | | Byte | 2 | 1 | 0 | 16 | |:---:|:-------:|:-----:|:---------:| 17 | | Data | status | command |response | 18 | - command:命令8(固定) 19 | - response:応答0x07(固定) 20 | - status:状態0x00(成功) 21 | 22 | ### フローチャート 23 | ![icon](timestamp.svg) 24 | 25 | 26 | 27 | 28 | 29 | ### android例 30 | ``` java 31 | override fun updateTime(result: CHResult) { 32 | if (checkBle(result)) return 33 | sendCommand(SesameOS3Payload(SesameItemCode.time.value, System.currentTimeMillis().toUInt32ByteArray()), DeviceSegmentType.cipher) { res -> 34 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 35 | } 36 | } 37 | ``` 38 | -------------------------------------------------------------------------------- /app.properties: -------------------------------------------------------------------------------- 1 | # API Gateway Configuration 2 | candyhouse.sesame.app.api.dev=https://0dkzum4jzg.execute-api.ap-northeast-1.amazonaws.com/dev 3 | candyhouse.sesame.app.api.prod=https://0dkzum4jzg.execute-api.ap-northeast-1.amazonaws.com/prod 4 | candyhouse.sesame.sdk.api.dev=https://jhcr1i3ecb.execute-api.ap-northeast-1.amazonaws.com/dev 5 | candyhouse.sesame.sdk.api.prod=https://jhcr1i3ecb.execute-api.ap-northeast-1.amazonaws.com/prod 6 | 7 | # AWS Cognito Configuration 8 | aws.cognito.identityPoolId=ap-northeast-1:0a1820f1-dbb3-4bca-9227-2a92f6abf0ae 9 | aws.cognito.userPoolId=ap-northeast-1_bY2byhlCa 10 | aws.cognito.appClientId=6ialca0p8u0lsgvbmvsljfm305 11 | aws.apigateway.clientId=ap-northeast-1:0a1820f1-dbb3-4bca-9227-2a92f6abf0ae 12 | aws.apigateway.apiKey=iGgXj9GorS4PeH90mAysg1l7kdvoIPxM25mPFl3k 13 | 14 | # AWS IoT Configuration 15 | aws.iot.endpoint=d06107753ay3c67v7y9pa-ats.iot.ap-northeast-1.amazonaws.com 16 | 17 | # Google Maps API Key 18 | google.maps.apiKey=YOUR_GOOGLE_MAP_KEY -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/BaseFG.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.fragment.app.Fragment 8 | import androidx.viewbinding.ViewBinding 9 | 10 | abstract class BaseFG : Fragment() { 11 | 12 | lateinit var bind: T 13 | 14 | override fun onCreateView( 15 | inflater: LayoutInflater, 16 | container: ViewGroup?, 17 | savedInstanceState: Bundle? 18 | ): View? { 19 | return try { 20 | if (!::bind.isInitialized) { 21 | bind = getViewBinder() 22 | } 23 | bind.root 24 | } catch (e: Exception) { 25 | e.printStackTrace() 26 | null 27 | } 28 | } 29 | 30 | abstract fun getViewBinder(): T 31 | 32 | override fun onResume() { 33 | super.onResume() 34 | } 35 | 36 | } -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | google { 4 | content { 5 | includeGroupByRegex("com\\.android.*") 6 | includeGroupByRegex("com\\.google.*") 7 | includeGroupByRegex("androidx.*") 8 | } 9 | } 10 | mavenCentral() 11 | gradlePluginPortal() 12 | maven { url "https://maven.aliyun.com/repository/public" } 13 | maven { url "https://jcenter.bintray.com/" } 14 | maven { url "https://jitpack.io" } 15 | } 16 | } 17 | dependencyResolutionManagement { 18 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 19 | repositories { 20 | google() 21 | mavenCentral() 22 | maven { url "https://maven.aliyun.com/repository/public" } 23 | maven { url "https://jcenter.bintray.com/" } 24 | maven { url "https://jitpack.io" } 25 | 26 | } 27 | } 28 | 29 | 30 | include ':app' 31 | include ':sesame-sdk' 32 | -------------------------------------------------------------------------------- /doc/touch/finger_mode_set_jp.md: -------------------------------------------------------------------------------- 1 | # Finger Mode Set 説明 2 | アプリが122コマンドを送信して、ssm_touchの現在の指紋状態を設定します。 3 | 4 | ### 送信フォーマット 5 | 6 | | バイト | 1| 0 | 7 | |:------:|----:|:-------:| 8 | | データ | 指紋モード| コマンド | 9 | 10 | - コマンド: 指令122(固定) 11 | - 指紋モード: 指紋のモード 12 | 13 | ### 受信フォーマット 14 | 15 | | バイト | 3 | 2 | 1 | 0 | 16 | |:---:|:-----------:|:------:|:----:|:---------:| 17 | | データ | 指紋モード | ステータス | コマンド |レスポンス | 18 | - コマンド: 指令122(固定) 19 | - レスポンス: 応答0x07(固定) 20 | - ステータス: 0x00(成功) 21 | - 指紋モード: 0x00->認証モード、0x01->追加モード 22 | 23 | ### シーケンス図 24 | ![アイコン](finger_model_set.svg) 25 | 26 | ### Androidの例 27 | ```java 28 | override fun fingerPrintModeSet(mode: Byte, result: CHResult) { 29 | if (checkBle(result)) return 30 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_FINGERPRINT_MODE_SET.value, byteArrayOf(mode))) { 31 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /doc/wm2/setwifipw_jp.md: -------------------------------------------------------------------------------- 1 | # setWifiPassword 説明 2 | 3 | ### 送信フォーマット 4 | 5 | | バイト | N~1 | 0 | 6 | |:------:|---------:|--------:| 7 | | データ | SSIDとパスワード | コマンド | 8 | 9 | - コマンド: 指令4(固定) 10 | - SSIDとパスワード: SSIDとパスワード 11 | 12 | ### 受信フォーマット 13 | | バイト | 2 | 1 | 0 | 14 | |:---:|:----:|:----:|:-----:| 15 | | データ | ステータス | コマンド |レスポンス | 16 | - コマンド: 指令4(固定) 17 | - レスポンス: 応答0x07(固定) 18 | - ステータス: 状態0x00(成功) 19 | 20 | ### シーケンス図 21 | ![アイコン](scanwifissid.svg) 22 | 23 | ### Androidの例 24 | ```java 25 | override fun setWifiPassword(password: String, result: CHResult) { 26 | sendCommand(SesameOS3Payload(WM2ActionCode.UPDATE_WIFI_PASSWORD.value, password.toByteArray())) { res -> 27 | if (res.cmdResultCode == SesameResultCode.success.value) { // L.d("hcia", "設定密碼完畢:" + String(res.payload)) 28 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icons_outlined_addoutline.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 18 | 19 | -------------------------------------------------------------------------------- /doc/touch/finger_delete.md: -------------------------------------------------------------------------------- 1 | # Finger Delete 説明 2 | アプリから命令116を送信して、ID指紋を削除します。 3 | ### 送信フォーマット 4 | 5 | | Byte | 1| 0 | 6 | |:------:|---:|:--------:| 7 | | Data | finger_id| command | 8 | 9 | - command:命令116(固定) 10 | - finger_id:指紋ID 11 | 12 | 13 | 14 | 15 | ### 受信フォーマット 16 | 17 | | Byte | 2 | 1 | 0 | 18 | |:---:|:-----------:|:----:|:---------:| 19 | | Data | status | command |response | 20 | - command:命令116(固定) 21 | - response:応答0x07(固定) 22 | - status:0x00(成功) 23 | 24 | 25 | 26 | 27 | ### フローチャート 28 | ![icon](finger_delete.svg) 29 | 30 | 31 | 32 | 33 | 34 | ### android例 35 | ``` java 36 | override fun fingerPrintDelete(ID: String, result: CHResult) { 37 | if (checkBle(result)) return 38 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_FINGERPRINT_DELETE.value, ID.hexStringToByteArray())) { 39 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 40 | } 41 | } 42 | ``` 43 | -------------------------------------------------------------------------------- /doc/touch/card_model_get_jp.md: -------------------------------------------------------------------------------- 1 | # Card Mode Get の説明 2 | スマートフォンは113コマンドを送信して、現在のカードの追加または認証モードを取得します。 3 | 4 | ### 送信形式 5 | 6 | 7 | | Byte | 0 | 8 | |:------:|-------:| 9 | | Data | command | 10 | 11 | - command:113コマンド (固定) 12 | 13 | 14 | 15 | 16 | ### 受信形式 17 | 18 | 19 | | Byte | 3 | 2 | 1 | 0 | 20 | |:---:|:-------:|:-----:|:----:|:-----:| 21 | | Data | card_mode| status | command |response | 22 | - command:113コマンド (固定) 23 | - response:0x07応答 (固定) 24 | - status:0x00(成功) 25 | - card_mode:0x00->認証モード,0x01->追加モード 26 | 27 | 28 | ### シーケンス図 29 | 30 | ![icon](card_model_get.svg) 31 | 32 | 33 | 34 | 35 | 36 | ### Androidの例 37 | 38 | ``` java 39 | override fun cards(result: CHResult) { 40 | if (checkBle(result)) return 41 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_CARD_GET.value, byteArrayOf())) { res -> 42 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 43 | } 44 | } 45 | ``` 46 | -------------------------------------------------------------------------------- /doc/touch/card_model_set_jp.md: -------------------------------------------------------------------------------- 1 | # Card Mode Set の説明 2 | スマートフォンは114コマンドを送信して、現在のモードを設定します。 3 | 4 | ### 送信形式 5 | 6 | | byte | 1| 0 | 7 | |:----:|----:|:-------:| 8 | | Data | card_mode| command | 9 | 10 | - command: 114コマンド (固定) 11 | - card_mode: 0x00->認証モード、0x01->追加モード 12 | 13 | ### 受信形式 14 | 15 | | byte | 3| 2 | 1 | 0 | 16 | |:----:|:----:|:-------:|:-----:|:----:| 17 | | Data | card_mode| status | command |response | 18 | - command: 114コマンド (固定) 19 | - response: 0x07応答 (固定) 20 | - status: 状態 0x00 (成功) 21 | - card_mode: 0x00->認証モード、0x01->追加モード 22 | 23 | ### シーケンス図 24 | ![icon](card_model_set.svg) 25 | 26 | ### Androidの例 27 | ``` java 28 | override fun cardModeSet(mode: Byte, result: CHResult) { 29 | if (checkBle(result)) return 30 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_CARD_MODE_SET.value, byteArrayOf(mode))) { res -> 31 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/face/CHFaceCapable.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.face 2 | 3 | import co.candyhouse.sesame.open.CHResult 4 | import co.candyhouse.sesame.open.device.sesameBiometric.capability.baseCapbale.CHDataSynchronizeCapable 5 | import co.candyhouse.sesame.open.device.sesameBiometric.devices.CHSesameBiometricBase 6 | import co.candyhouse.sesame.server.dto.CHEmpty 7 | 8 | interface CHFaceCapable { 9 | fun faceModeSet(mode: Byte, result: CHResult) 10 | fun faceModeGet(result: CHResult) 11 | fun faceListGet(result: CHResult) 12 | fun faceDelete(faceID: String, deviceID: String, result: CHResult) 13 | fun getFaceDataSyncCapable(): CHDataSynchronizeCapable 14 | 15 | fun registerEventDelegate(device: CHSesameBiometricBase, delegate: CHFaceDelegate) 16 | fun unregisterEventDelegate(device: CHSesameBiometricBase, delegate: CHFaceDelegate) 17 | 18 | } -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/server/dto/IrLearnedDataAddRequest.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.server.dto 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class IrLearnedDataAddRequest( 6 | @SerializedName("IrDataNameUUID") val irDataNameUUID: String, 7 | @SerializedName("DataLength") val dataLength: Int, 8 | @SerializedName("Esp32c3LearnedIrDataHexString") val esp32c3LearnedIrDataHexString: String, 9 | @SerializedName("TimeStamp") val timeStamp: Long, 10 | @SerializedName("Hub3DeviceUUID") val hub3DeviceUUID: String, 11 | @SerializedName("irDeviceUUID") val irDeviceUUID: String, 12 | @SerializedName("keyUUID") val keyUUID: String, 13 | ) { 14 | override fun toString(): String { 15 | return "IrLearnedDataAddRequest(IrDataNameUUID='$irDataNameUUID', DataLength=${dataLength.toInt()}, Esp32c3LearnedIrDataHexString='$esp32c3LearnedIrDataHexString', TimeStamp=$timeStamp, Hub3DeviceUUID='$hub3DeviceUUID', irDeviceUUID='$irDeviceUUID', keyUUID='$keyUUID')" 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_icons_outlined_contacts_y.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 14 | 18 | 22 | 23 | -------------------------------------------------------------------------------- /doc/touch/finger_mode_get_jp.md: -------------------------------------------------------------------------------- 1 | # Finger Mode Get 讲解 2 | app 发送发送121指令,获取ssm_touch当前指纹状态 3 | ### 发送格式 4 | 5 | | Byte | 0 | 6 | |:------:|-------:| 7 | | Data | command | 8 | 9 | - command:指令121(固定) 10 | 11 | 12 | 13 | 14 | ### 接收格式 15 | 16 | | Byte | 3 | 2 | 1 | 0 | 17 | |:---:|:-----------:|:------:|:----:|:---------:| 18 | | Data | finger_mode | status | command |response | 19 | - command:指令121(固定) 20 | - response:响应0x07(固定) 21 | - status:0x00(成功) 22 | - finger_mode:0x00->验证模式,0x01->新增模式 23 | 24 | 25 | 26 | ### 循序图 27 | ![icon](finger_mode_get.svg) 28 | 29 | 30 | 31 | 32 | 33 | ### android示例 34 | ``` java 35 | override fun fingerPrintModeGet(result: CHResult) { 36 | if (checkBle(result)) return 37 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_FINGERPRINT_MODE_GET.value, byteArrayOf())) { res -> 38 | result.invoke(Result.success(CHResultState.CHResultStateBLE(res.payload[0]))) 39 | } 40 | } 41 | ``` 42 | -------------------------------------------------------------------------------- /doc/touch/kbpc_delete.md: -------------------------------------------------------------------------------- 1 | # KeyboardPassword Delete 説明 2 | app は命令124を送信し、パスワードを削除します。 3 | ### 送信フォーマット 4 | 5 | | Byte | 1 | 0 | 6 | |:------:|------:|:--------:| 7 | | Data | pw_id | command | 8 | 9 | - command:命令124(固定) 10 | - pc_id:指紋ID 11 | 12 | 13 | 14 | 15 | ### 受信フォーマット 16 | 17 | | Byte | 2 | 1 | 0 | 18 | |:---:|:-----------:|:----:|:---------:| 19 | | Data | status | command |response | 20 | - command:命令124(固定) 21 | - response:応答0x07(固定) 22 | - status:0x00(成功) 23 | 24 | 25 | 26 | 27 | ### フローチャート 28 | ![icon](kbpc_delete.svg) 29 | 30 | 31 | 32 | 33 | 34 | ### android例 35 | ``` java 36 | override fun keyBoardPassCodeDelete(ID: String, result: CHResult) { 37 | if (checkBle(result)) return 38 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_PASSCODE_DELETE.value, ID.hexStringToByteArray())) { res -> 39 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 40 | } 41 | } 42 | ``` 43 | -------------------------------------------------------------------------------- /app/src/main/res/layout/action_layout_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 26 | -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/app/tabs/devices/ssmbike/setting/SesameBikeSettingFG.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.app.tabs.devices.ssmbike.setting 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import android.widget.TextView 6 | import co.candyhouse.app.R 7 | import co.candyhouse.app.base.BaseDeviceSettingFG 8 | import co.candyhouse.app.databinding.FgSettingMainBinding 9 | import co.candyhouse.app.databinding.FgSsmBikeSettingBinding 10 | import co.candyhouse.sesame.utils.L 11 | 12 | class SesameBikeSettingFG : BaseDeviceSettingFG() { 13 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 14 | L.d("hcia", "SesameBikeSettingFG onViewCreated") 15 | super.onViewCreated(view, savedInstanceState) 16 | getView()?.findViewById(R.id.click_script_zone)?.visibility = View.GONE 17 | 18 | usePressText() 19 | 20 | 21 | }//end view created 22 | override fun getViewBinder()= FgSsmBikeSettingBinding.inflate(layoutInflater) 23 | 24 | } 25 | -------------------------------------------------------------------------------- /doc/class/CHSesameBotMechSettings.md: -------------------------------------------------------------------------------- 1 | 2 | # CHSesameBotMechSettings データクラス 3 | ```svg 4 | 5 | data class CHSesameBotMechSettings( 6 | var userPrefDir: Byte, 7 | var lockSec: Byte, 8 | var unlockSec: Byte, 9 | var clickLockSec: Byte, 10 | var clickHoldSec: Byte, 11 | var clickUnlockSec: Byte, 12 | var buttonMode: Byte 13 | ) { 14 | internal fun data(): ByteArray = 15 | byteArrayOf(userPrefDir, lockSec, unlockSec, clickLockSec, clickHoldSec, clickUnlockSec, buttonMode) + 16 | byteArrayOf(0, 0, 0, 0, 0) 17 | } 18 | 19 | ``` 20 | `CHSesameBotMechSettings`データクラスはSesame Bot機器の設定を保存と管理します。 21 | 22 | ## プロパティ 23 | 24 | - `userPrefDir`:ユーザーの好みや優先する方向を表し、Byte型です。 25 | - `lockSec`:ロックの秒数を表します。Byte型です。 26 | - `unlockSec`:解錠の秒数を表します。Byte型です。 27 | - `clickLockSec`:ロックの秒数をクリックします。Byte型です。 28 | - `clickHoldSec`:秒数を長押しします。Byte型です。 29 | - `clickUnlockSec`:解錠の秒数をクリックします。Byte型です。 30 | - `buttonMode`:ボタンモードです。Byte型です。 31 | 32 | ## メソッド 33 | 34 | - `data()`:指定されたすべてのByte型のプロパティを1つのByteArrayに結合し、その後に5バイトの0を追加するメソッドです。デバイスの設定を送信または保存可能なデータ形式に変換します。 35 | -------------------------------------------------------------------------------- /doc/touch/kbpc_mode_set_jp.md: -------------------------------------------------------------------------------- 1 | # KeyboardPassword Mode Set 説明 2 | アプリが130コマンドを送信して、ssm_touchの現在の数字ロックの状態を設定します。 3 | 4 | ### 送信フォーマット 5 | 6 | | バイト | 1 | 0 | 7 | |:------:|--------:|:-------:| 8 | | データ | 数字ロックモード | コマンド | 9 | 10 | - コマンド: 指令130(固定) 11 | - 数字ロックモード: 数字ロックモード 12 | 13 | ### 受信フォーマット 14 | 15 | | バイト | 3 | 2 | 1 | 0 | 16 | |:---:|:-------:|:------:|:----:|:---------:| 17 | | データ | 数字ロックモード | ステータス | コマンド |レスポンス | 18 | - コマンド: 指令130(固定) 19 | - レスポンス: 応答0x07(固定) 20 | - ステータス: 0x00(成功) 21 | - 数字ロックモード: 0x00->認証モード,0x01->新規追加モード 22 | 23 | ### シーケンス図 24 | ![アイコン](kbpc_model_set.svg) 25 | 26 | ### Androidの例 27 | ```java 28 | override fun keyBoardPassCodeModeSet(mode: Byte, result: CHResult) { 29 | if (checkBle(result)) return 30 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_PASSCODE_MODE_SET.value, byteArrayOf(mode))) { res -> 31 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/circular_progress.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 19 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /doc/command/reset.md: -------------------------------------------------------------------------------- 1 | # Reset リセット 2 | 3 | ### 送信フォーマット 4 | 5 | | Byte | 0 | 6 | |:------:|:------------:| 7 | | Data | command | 8 | 9 | 10 | - command:命令104(固定) 11 | 12 | 13 | ### 受信フォーマット 14 | 15 | | Byte | 2 | 1 | 0 | 16 | |:-------:|:------:|:---------:|:----------:| 17 | | Data | status | command | response | 18 | - command:命令104(固定) 19 | - response:応答0x07(固定) 20 | - status:状態0x00(成功) 21 | ### フローチャート 22 | ![icon](reset.svg) 23 | 24 | 25 | 26 | 27 | 28 | ### android例 29 | ``` java 30 | open fun reset(result: CHResult) { 31 | sendCommand(SesameOS3Payload(SesameItemCode.Reset.value, byteArrayOf()), DeviceSegmentType.cipher) { res -> 32 | if (res.cmdResultCode == SesameResultCode.success.value) { 33 | dropKey(result) 34 | } else { 35 | result.invoke(Result.failure(NSError(res.cmdResultCode.toString(), "CBCentralManager", res.cmdResultCode.toInt()))) 36 | } 37 | } 38 | } 39 | ``` 40 | -------------------------------------------------------------------------------- /doc/touch/finger_mode_get.md: -------------------------------------------------------------------------------- 1 | # Finger Mode Get 説明 2 | app は命令121を送信し、ssm_touchの指紋状態を取得します。 3 | ### 送信フォーマット 4 | 5 | | Byte | 0 | 6 | |:------:|-------:| 7 | | Data | command | 8 | 9 | - command:命令121(固定) 10 | 11 | 12 | 13 | 14 | ### 受信フォーマット 15 | 16 | | Byte | 3 | 2 | 1 | 0 | 17 | |:---:|:-----------:|:------:|:----:|:---------:| 18 | | Data | finger_mode | status | command |response | 19 | - command:命令121(固定) 20 | - response:応答0x07(固定) 21 | - status:0x00(成功) 22 | - finger_mode:0x00->認証モード,0x01->新規モード 23 | 24 | 25 | 26 | ### フローチャート 27 | ![icon](finger_mode_get.svg) 28 | 29 | 30 | 31 | 32 | 33 | ### android例 34 | ``` java 35 | override fun fingerPrintModeGet(result: CHResult) { 36 | if (checkBle(result)) return 37 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_FINGERPRINT_MODE_GET.value, byteArrayOf())) { res -> 38 | result.invoke(Result.success(CHResultState.CHResultStateBLE(res.payload[0]))) 39 | } 40 | } 41 | ``` 42 | -------------------------------------------------------------------------------- /doc/touch/kbpc_mode_get.md: -------------------------------------------------------------------------------- 1 | # KeyboardPassword Mode Get 説明 2 | app は命令129を送信し、ssm_touchの暗証番号の状態を取得します。 3 | ### 送信フォーマット 4 | 5 | | Byte | 0 | 6 | |:------:|-------:| 7 | | Data | command | 8 | 9 | - command:命令129(固定) 10 | 11 | 12 | 13 | 14 | ### 受信フォーマット 15 | 16 | | Byte | 3 | 2 | 1 | 0 | 17 | |:---:|:-------:|:------:|:----:|:---------:| 18 | | Data | pw_mode | status | command |response | 19 | - command:命令129(固定) 20 | - response:応答0x07(固定) 21 | - status:0x00(成功) 22 | - pw_mode:0x00->認証モード,0x01->新規モード 23 | 24 | 25 | 26 | ### フローチャート 27 | ![icon](kbpc_mode_get.svg) 28 | 29 | 30 | 31 | 32 | 33 | ### android例 34 | ``` java 35 | override fun keyBoardPassCodeModeGet(result: CHResult) { 36 | if (checkBle(result)) return 37 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_PASSCODE_MODE_GET.value, byteArrayOf())) { res -> 38 | result.invoke(Result.success(CHResultState.CHResultStateBLE(res.payload[0]))) 39 | } 40 | } 41 | 42 | ``` 43 | -------------------------------------------------------------------------------- /doc/class/SSM2ResponsePayload_jp.md: -------------------------------------------------------------------------------- 1 | # SesameNotifypayload クラスのドキュメント 2 | ```svg 3 | internal class SSM2ResponsePayload(val data: ByteArray) { 4 | val cmdItCode: UByte = data[0].toUByte()// login 5 | val cmdOPCode: UByte = data[1].toUByte()// sync 6 | val cmdResultCode: UByte = data[2].toUByte()// success 7 | val payload: ByteArray = data.drop(3).toByteArray() 8 | } 9 | 10 | ``` 11 | ### 説明 12 | 13 | `SesameNotifypayload` は、'Sesame' の通知に関連するペイロード(データの負荷部分)を処理するためのKotlinの内部クラスです。このクラスをインスタンス化する際には、バイト配列(ByteArray)を引数として渡す必要があります。 14 | 15 | ### プロパティ 16 | 17 | - `data`:ByteArray型のインスタンス変数です。この `data` 変数は、クラスのインスタンスを作成する際に提供する必要があります。 18 | 19 | - `notifyOpCode`:`data` 配列の最初のバイトの値を取得し、それを `SSM2OpCode.getByValue` 関数に渡して得られた結果を `notifyOpCode` とします。 20 | 21 | - `payload`:これは `notifyOpCode` の後に残る `data` 部分です。`data.drop(1)` を使用して、`data` 中の最初の要素を除いたすべての要素で新しい配列を生成します。 22 | 23 | ### 使用方法 24 | 25 | このクラスを使用するには、`SesameNotifypayload` クラスのインスタンスを作成し、そのコンストラクタにバイト配列を提供する必要があります。この配列の最初のバイトは、`notifyOpCode` に渡され、残りの部分は `payload` に格納されます。 26 | -------------------------------------------------------------------------------- /doc/class/SSM3ResponsePayload_jp.md: -------------------------------------------------------------------------------- 1 | # SSM3ResponsePayload クラスのドキュメント 2 | ```svg 3 | internal class SSM3ResponsePayload(val data: ByteArray) { 4 | val cmdItCode: UByte = data[0].toUByte() 5 | val cmdResultCode: UByte = data[1].toUByte() 6 | val payload: ByteArray = data.drop(2).toByteArray() 7 | } 8 | ``` 9 | ### 説明 10 | 11 | `SSM3ResponsePayload` は、SSM3プロトコルの応答ペイロード(データの負荷部分)を処理するためのKotlinの内部クラスです。このクラスをインスタンス化する際には、バイト配列(ByteArray)を引数として渡す必要があります。 12 | 13 | ### プロパティ 14 | 15 | - `data`:ByteArray型のインスタンス変数です。この `data` 変数は、クラスのインスタンスを作成する際に提供する必要があります。 16 | 17 | - `cmdItCode`:提供された `data` 配列の最初のバイトを `UByte` (符号なしバイト)に変換した値です。 18 | 19 | - `cmdResultCode`:提供された `data` 配列の2番目のバイトを `UByte` に変換した値です。通常、これは操作の結果コードを表します。 20 | 21 | - `payload`:これは `cmdResultCode` の後に残る `data` 部分です。`data.drop(2)` を使用して、`data` 中の最初の2つの要素を除いたすべての要素で新しい配列を生成します。 22 | 23 | ### 使用方法 24 | 25 | このクラスを使用するには、`SSM3ResponsePayload` クラスのインスタンスを作成し、そのコンストラクタにバイト配列を提供する必要があります。この配列の最初のバイトは `cmdItCode` に、2番目のバイトは `cmdResultCode` に渡され、残りの部分は `payload` に格納されます。 26 | -------------------------------------------------------------------------------- /doc/touch/card_model_set.md: -------------------------------------------------------------------------------- 1 | # Card Mode Set 説明 2 | 携帯電話で命令114を送信し、新規モードまたは認証モードに設置します。 3 | ### 送信フォーマット 4 | 5 | | Byte | 1| 0 | 6 | |:------:|----:|:-------:| 7 | | Data | card_mode| command | 8 | 9 | - command:命令114(固定) 10 | 11 | - card_mode:0x00->認証モード,0x01->新規モード 12 | 13 | 14 | ### 受信フォーマット 15 | 16 | | Byte | 3| 2 | 1 | 0 | 17 | |:---:|:----:|:-------:|:-----:|:----:| 18 | | Data | card_mode| status | command |response | 19 | - command:命令114(固定) 20 | - response:応答0x07(固定) 21 | - status:0x00(成功) 22 | - card_mode:0x00->認証モード,0x01->新規モード 23 | 24 | ### フローチャート 25 | ![icon](card_model_set.svg) 26 | 27 | 28 | 29 | 30 | 31 | ### android例 32 | ``` java 33 | override fun cardModeSet(mode: Byte, result: CHResult) { 34 | if (checkBle(result)) return 35 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_CARD_MODE_SET.value, byteArrayOf(mode))) { res -> 36 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 37 | } 38 | } 39 | ``` 40 | -------------------------------------------------------------------------------- /app/src/main/java/co/candyhouse/server/CHIRAPIClient.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.server 2 | 3 | import co.candyhouse.server.dto.IrDeviceDeleteRequest 4 | import co.candyhouse.sesame.BuildConfig 5 | import com.amazonaws.mobileconnectors.apigateway.annotation.Operation 6 | import com.amazonaws.mobileconnectors.apigateway.annotation.Parameter 7 | import com.amazonaws.mobileconnectors.apigateway.annotation.Service 8 | 9 | @Service(endpoint = BuildConfig.chjpserver) 10 | internal interface CHIRAPIClient { 11 | 12 | /** 13 | * 获取IR设备列表 14 | */ 15 | @Operation(path = "/device/v2/ir/{device_id}", method = "GET") 16 | fun fetchIRDevices( 17 | @Parameter(name = "device_id", location = "path") deviceId: String 18 | ): Any 19 | 20 | /** 21 | * 删除IR遥控器 22 | */ 23 | @Operation(path = "/device/v2/ir/{device_id}", method = "DELETE") 24 | fun deleteIRDevice( 25 | @Parameter(name = "device_id", location = "path") deviceId: String, 26 | body: IrDeviceDeleteRequest 27 | ): Any 28 | 29 | } 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/java/co/utils/balloon/OnBalloonOutsideTouchListener.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2019 skydoves 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.skydoves.balloon 18 | 19 | import android.view.MotionEvent 20 | import android.view.View 21 | 22 | /** Interface definition for a callback to be invoked when touched on outside of the balloon popup. */ 23 | interface OnBalloonOutsideTouchListener { 24 | fun onBalloonOutsideTouch(view: View, event: MotionEvent) 25 | } 26 | -------------------------------------------------------------------------------- /app/google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "123456789000", 4 | "firebase_url": "https://your-project-id.firebaseio.com", 5 | "project_id": "your-project-id", 6 | "storage_bucket": "your-project-id.appspot.com" 7 | }, 8 | "client": [ 9 | { 10 | "client_info": { 11 | "mobilesdk_app_id": "1:123456789000:android:0000000000000000000000", 12 | "android_client_info": { 13 | "package_name": "co.candyhouse.sesame2" 14 | } 15 | }, 16 | "oauth_client": [ 17 | { 18 | "client_id": "123456789000-00000000000000000000000000000000.apps.googleusercontent.com", 19 | "client_type": 3 20 | } 21 | ], 22 | "api_key": [ 23 | { 24 | "current_key": "AIza0000000000000000000000000000000000000" 25 | } 26 | ], 27 | "services": { 28 | "appinvite_service": { 29 | "other_platform_oauth_client": [] 30 | } 31 | } 32 | } 33 | ], 34 | "configuration_version": "1" 35 | } -------------------------------------------------------------------------------- /doc/wm2/setwifipw.md: -------------------------------------------------------------------------------- 1 | # setWifiPassword 讲解 2 | 3 | ### 发送格式 4 | 5 | | Byte | N~1 | 0 | 6 | |:------:|---------:|--------:| 7 | | Data | ssid_pw | command | 8 | 9 | - command:指令4(固定) 10 | - card_id:卡片ID 11 | 12 | 13 | 14 | ### 接收格式 15 | 16 | | Byte | 2 | 1 | 0 | 17 | |:---:|:----:|:----:|:-----:| 18 | | Data | status | command |response | 19 | - command:指令4(固定) 20 | - response:响应0x07(固定) 21 | - status:状态0x00(成功) 22 | 23 | 24 | ### 循序图 25 | ![icon](scanwifissid.svg) 26 | 27 | 28 | 29 | 30 | 31 | ### android示例 32 | ``` java 33 | override fun setWifiPassword(password: String, result: CHResult) { 34 | sendCommand(SesameOS3Payload(WM2ActionCode.UPDATE_WIFI_PASSWORD.value, password.toByteArray())) { res -> 35 | if (res.cmdResultCode == SesameResultCode.success.value) { // L.d("hcia", "設定密碼完畢:" + String(res.payload)) 36 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 37 | } 38 | } 39 | } 40 | ``` 41 | -------------------------------------------------------------------------------- /doc/class/CHSesameBike2MechStatus.md: -------------------------------------------------------------------------------- 1 | # CHSesameBike2MechStatus クラス 2 | 3 | ```svg 4 | class CHSesameBike2MechStatus(override val data: ByteArray) : CHSesameProtocolMechStatus { 5 | private val battery = bytesToShort(data[0], data[1]) 6 | private val flags = data[2].toInt() 7 | override var isInLockRange: Boolean = flags and 2 > 0 8 | override var isStop: Boolean? = flags and 4 > 0 9 | override fun getBatteryVoltage(): Float 10 | } 11 | 12 | ``` 13 | 14 | `CHSesameBike2MechStatus`クラスは、`CHSesameProtocolMechStatus`インターフェースを実装しており、主にesame Bike2の機械状態を表します。 15 | 16 | ## プロパティ 17 | 18 | - `data: ByteArray` - デバイスの状態を表すバイト配列です。 19 | - `isInLockRange: Boolean` - デバイスがロックの範囲内にあるかどうかを示す情報です。 20 | - `isStop: Boolean?` - デバイスが停止しているかどうかを示す情報です。 21 | 22 | ## メソッド 23 | 24 | - `fun getBatteryVoltage(): Float` - デバイスのバッテリー電圧を取得します。 25 | 26 | ## 非公開プロパティ 27 | 28 | - `battery: Short` - デバイスのバッテリー残量を示します。 29 | - `flags: Int` - デバイスのフラグを示します。 30 | 31 | ## 非公開メソッド 32 | 33 | - `bytesToShort(byte1: Byte, byte2: Byte): Short` - 2つのバイトをショート整数に変換します。 34 | 35 | -------------------------------------------------------------------------------- /doc/class/CHSesameBike2MechStatus_jp.md: -------------------------------------------------------------------------------- 1 | # CHSesameBike2MechStatus クラスのドキュメント 2 | ```svg 3 | class CHSesameBike2MechStatus(override val data: ByteArray) : CHSesameProtocolMechStatus { 4 | private val battery = bytesToShort(data[0], data[1]) 5 | private val flags = data[2].toInt() 6 | override var isInLockRange: Boolean = flags and 2 > 0 7 | override var isStop: Boolean? = flags and 4 > 0 8 | override fun getBatteryVoltage(): Float 9 | } 10 | 11 | ``` 12 | `CHSesameBike2MechStatus` クラスは、`CHSesameProtocolMechStatus` インターフェースを実装したもので、主に Sesame Bike2 の機械の状態を表します。 13 | 14 | ## プロパティ 15 | 16 | - `data: ByteArray` - デバイスの状態を表すバイト配列です。 17 | - `isInLockRange: Boolean` - デバイスがロック範囲内にあるかどうかを示します。 18 | - `isStop: Boolean?` - デバイスが停止しているかどうかを示します。 19 | 20 | ## メソッド 21 | 22 | - `fun getBatteryVoltage(): Float` - デバイスのバッテリー電圧を取得します。 23 | 24 | ## プライベートプロパティ 25 | 26 | - `battery: Short` - デバイスのバッテリー残量を示します。 27 | - `flags: Int` - デバイスのフラグを示します。 28 | 29 | ## プライベートメソッド 30 | 31 | - `bytesToShort(byte1: Byte, byte2: Byte): Short` - 二つのバイトを短整数に変換する関数です。 32 | -------------------------------------------------------------------------------- /sesame-sdk/src/main/java/co/candyhouse/sesame/open/device/sesameBiometric/capability/palm/CHPalmCapable.kt: -------------------------------------------------------------------------------- 1 | package co.candyhouse.sesame.open.device.sesameBiometric.capability.palm 2 | 3 | import co.candyhouse.sesame.open.CHResult 4 | import co.candyhouse.sesame.open.device.sesameBiometric.capability.baseCapbale.CHDataSynchronizeCapable 5 | import co.candyhouse.sesame.open.device.sesameBiometric.devices.CHSesameBiometricBase 6 | import co.candyhouse.sesame.server.dto.CHEmpty 7 | import co.candyhouse.sesame.server.dto.CHPalmNameRequest 8 | 9 | interface CHPalmCapable { 10 | fun palmModeSet(mode: Byte, result: CHResult) 11 | fun palmModeGet(result: CHResult) 12 | fun palmListGet(result: CHResult) 13 | fun palmDelete(palmID: String, deviceId: String, result: CHResult) 14 | fun getPalmDataSyncCapable(): CHDataSynchronizeCapable 15 | 16 | fun registerEventDelegate(device: CHSesameBiometricBase, delegate: CHPalmDelegate) 17 | fun unregisterEventDelegate(device: CHSesameBiometricBase, delegate: CHPalmDelegate) 18 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_up.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 23 | 24 | -------------------------------------------------------------------------------- /doc/class/CHSesameTouchCard.md: -------------------------------------------------------------------------------- 1 | 2 | # CHSesameTouchCard クラス 3 | ```svg 4 | class CHSesameTouchCard(data: ByteArray) { 5 | val cardType = data[0] 6 | val idLength = data[1] 7 | val cardID = data.sliceArray(2..idLength + 1).toHexString() 8 | val nameIndex = idLength + 2 9 | val nameLength = data[nameIndex] 10 | val cardName = String(data.sliceArray(nameIndex + 1..nameIndex + nameLength)) 11 | } 12 | 13 | ``` 14 | `CHSesameTouchCard`クラスは、タッチカードの情報を処理および管理します。このクラスのコンストラクタは、ByteArrayを引数として受取り、タッチカードの関連データを含みます。 15 | 16 | ## プロパティ 17 | 18 | - `cardType`:カードタイプです。データの最初のバイトで表されます。 19 | - `idLength`:カードIDの長さです。データの2番目のバイトで表されます。 20 | - `cardID`:カードIDです。データの3番目のバイトから始まり、長さが`idLength`であるデータセグメントで表されて、16進数の文字列に変換されます。 21 | - `nameIndex`:カード名のデータの始点インデックスです。`idLength + 2`で計算されます。 22 | - `nameLength`:カード名の長さです。データの`nameIndex`バイトで表されます。 23 | - `cardName`:カード名です。データの`nameIndex + 1`バイトから始まり、長さが`nameLength`であるデータバイト列で表されて、文字列に変換されます。 24 | 25 | ## コンストラクタ 26 | 27 | - `CHSesameTouchCard(data: ByteArray)`:コンストラクタは、ByteArrayをパラメータとして受取り、パラメータにはタッチカードの関連データが含まれています。コンストラクタではデータを解析し、対応する属性を初期化します。 28 | -------------------------------------------------------------------------------- /doc/class/CHSesameTouchCard_jp.md: -------------------------------------------------------------------------------- 1 | # CHSesameTouchCard クラスのドキュメント 2 | 3 | ```svg 4 | class CHSesameTouchCard(data: ByteArray) { 5 | val cardType = data[0] 6 | val idLength = data[1] 7 | val cardID = data.sliceArray(2..idLength + 1).toHexString() 8 | val nameIndex = idLength + 2 9 | val nameLength = data[nameIndex] 10 | val cardName = String(data.sliceArray(nameIndex + 1..nameIndex + nameLength)) 11 | } 12 | 13 | ``` 14 | `CHSesameTouchCard` クラスは、タッチカードの情報を処理および管理するためのクラスです。このクラスのコンストラクタは、ByteArray をパラメータとして受け取り、そのパラメータに関連するカードのデータを含んでいます。 15 | 16 | ## プロパティ 17 | 18 | - `cardType`:カードのタイプを表す、データの最初のバイトです。 19 | - `idLength`:カードのIDの長さを表す、データの2番目のバイトです。 20 | - `cardID`:カードのIDを表す、データの3番目のバイトから始まる、長さが `idLength` のデータを16進数の文字列に変換したものです。 21 | - `nameIndex`:カードの名前データの開始インデックスを表す、`idLength + 2` で計算されます。 22 | - `nameLength`:カードの名前の長さを表す、データの `nameIndex` バイトです。 23 | - `cardName`:カードの名前を表す、データの `nameIndex + 1` から始まる、長さが `nameLength` のデータを文字列に変換したものです。 24 | 25 | ## コンストラクタ 26 | 27 | - `CHSesameTouchCard(data: ByteArray)`:このコンストラクタは、ByteArray をパラメータとして受け取り、そのパラメータに関連するカードのデータを解析し、対応するプロパティを初期化します。 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/pop_layout_copy.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /doc/touch/finger_mode_set.md: -------------------------------------------------------------------------------- 1 | # Finger Mode Set 説明 2 | app は命令122を送信し、ssm_touchの指紋状態を設置します。 3 | ### 送信フォーマット 4 | 5 | | Byte | 1| 0 | 6 | |:------:|----:|:-------:| 7 | | Data | finger_mode| command | 8 | 9 | - command:命令122(固定) 10 | - finger_mode:指纹モード 11 | 12 | 13 | 14 | 15 | ### 受信フォーマット 16 | 17 | | Byte | 3 | 2 | 1 | 0 | 18 | |:---:|:-----------:|:------:|:----:|:---------:| 19 | | Data | finger_mode | status | command |response | 20 | - command:命令122(固定) 21 | - response:応答0x07(固定) 22 | - status:0x00(成功) 23 | - finger_mode:0x00->認証モード,0x01->新規モード 24 | 25 | 26 | 27 | ### フローチャート 28 | ![icon](finger_model_set.svg) 29 | 30 | 31 | 32 | 33 | 34 | ### android例 35 | ``` java 36 | override fun fingerPrintModeSet(mode: Byte, result: CHResult) { 37 | if (checkBle(result)) return 38 | sendCommand(SesameOS3Payload(SesameItemCode.SSM_OS3_FINGERPRINT_MODE_SET.value, byteArrayOf(mode))) { 39 | result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty()))) 40 | } 41 | } 42 | 43 | ``` 44 | --------------------------------------------------------------------------------