| nav | 示例 |
|---|---|
| group | SESAME SDK |
| title | Android 版 |
| order | 2 |
- Sesame app on
https://play.google.com/store/apps/details?id=co.candyhouse.sesame2
- Sesame app on
https://drive.google.com/file/d/15aRQl6aWBVwJSE4l3ZL-eMisPoe-f2lW/
implementation project(':sesame-sdk') <uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT " />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> override fun onCreate()
{
super.onCreate()
CHBleManager(this)
}CHBleManager 的初始化可以判断终端的蓝牙是否正常运行,是否从终端获得权限,蓝牙是否启动。如果一切正常,蓝牙扫描就开始了。 Bluetooth Service Uuid:0000FD81-0000-1000-8000-00805f9b34fb
bluetoothAdapter.bluetoothLeScanner.startScan(
mutableListOf(
ScanFilter.Builder()
.setServiceUuid(
ParcelUuid(UUID.fromString('0000FD81-0000-1000-8000-00805f9b34fb')),
)
.build(),
),
ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build(),
bleScanner,
);将 bleScanner 扫描的设备放入 CHDeviceMap。
private var mDeviceList = ArrayList<CHDevices>()
CHBleManager.delegate = object : CHBleManagerDelegate {
override fun didDiscoverUnRegisteredCHDevices(devices: List<CHDevices>) {
mDeviceList.clear()
mDeviceList.addAll(devices.filter { it.rssi != null }
.filter { it.rssi!! > -65 }///註冊列表只顯示距離近的
)
mDeviceList.sortBy { it.getDistance() }
mDeviceList.firstOrNull()?.connect { }
leaderboard_list.post((leaderboard_list.adapter as GenericAdapter<*>)::notifyDataSetChanged)
}
}
} device.connect { }
doRegisterDevice(device)
device.delegate = object : CHDeviceStatusDelegate {
override fun onBleDeviceStatusChanged(device: CHDevices, status: CHDeviceStatus, shadowStatus: CHDeviceStatus?) {
if (status == CHDeviceStatus.ReadyToRegister) {
doRegisterDevice(device)
}
}
}
fun doRegisterDevice(device: CHDevices){
device.register {
it.onSuccess { // 登録成功
}
it.onFailure { // 登録失敗
}
}
} (device as? CHWifiModule2)?.let {
// CHWifiModule2
}
(device as? CHSesame2)?.let {
// CHSesame2
}
(device as? CHSesame5)?.let {
// CHSesame5
}
(device as? CHSesameTouchPro)?.let {
// CHSesameTouchPro
}獲取已配對的設備,就可以通過 APP 實現關鎖與開鎖
public func lock(historytag: Data?, result: @escaping (CHResult<CHEmpty>)) {
if deviceShadowStatus != nil,
deviceStatus.loginStatus == .unlogined {
CHIoTManager.shared.sendCommandToWM2(.lock, self) { _ in
result(.success(CHResultStateNetworks(input: CHEmpty())))
}
return
}
if (self.checkBle(result)) { return }
let hisTag = Data.createOS2Histag(historytag ?? self.sesame2KeyData?.historyTag)
sendCommand(.init(.lock,hisTag)) { responsePayload in
if responsePayload.cmdResultCode == .success {
result(.success(CHResultStateBLE(input: CHEmpty())))
} else {
result(.failure(self.errorFromResultCode(responsePayload.cmdResultCode)))
}
}
} override fun unlock(historytag: ByteArray?, result: CHResult<CHEmpty>) {
if (deviceStatus.value == CHDeviceLoginStatus.UnLogin && isConnectedByWM2) {
CHAccountManager.cmdSesame(SesameItemCode.unlock, this, sesame2KeyData!!.hisTagC(historytag), result)
} else {
if (checkBle(result)) return
// L.d("hcia", "[ss5][unlock] historyTag:" + sesame2KeyData!!.createHistagV2(historyTag).toHexString())
sendCommand(SesameOS3Payload(SesameItemCode.unlock.value, sesame2KeyData!!.createHistagV2(historytag)), DeviceSegmentType.cipher) { res ->
if (res.cmdResultCode == SesameResultCode.success.value) {
result.invoke(Result.success(CHResultState.CHResultStateBLE(CHEmpty())))
} else {
result.invoke(Result.failure(NSError(res.cmdResultCode.toString(), "CBCentralManager", res.cmdResultCode.toInt())))
}
}
}
}各指令互動細節詳見 BlueTooth協議 說明。
- 查看詳細:BlueTooth 協議
以下是 Android 项目结构示例,用于组织代码和资源文件。
libs/:文件夹通常用于存放第三方库(libraries)的二进制文件(如.jar、.aar 等)。java/:存放 Java 代码。按照功能模块划分子包,例如activities/存放活动类,adapters/存放适配器类等。res/:存放资源文件,包括布局文件、字符串、图标等。按照资源类型分目录存放,例如layout/存放布局文件,drawable/存放图片资源,values/存放字符串和样式资源。build.gradle:应用级别的 Gradle 配置文件,用于配置依赖项、插件和构建设置。proguard-rules.pro:ProGuard 配置文件,用于代码混淆和优化。这是可选的,适用于发布版本时。
- 注册登录:Amazon Web Services(Mobile)
- 权限框架:Easypermissions
- 本地数据库持久化:Room
- 云数据托管:Amazon Web Services (IOT)
- 界面导航:Navigation
- 界面数据管理:ViewModel
- 固件升级库:Dfu
- 地图组件:Maps for Google
- 本地存储:Preference
- 响应式框架:Rxjava
- QR 扫描:依赖 libs/qrcodecore-release.aar Zxing
- 消息传递:Firebase-messaging
- 下拉刷新: Swiperefreshlayout
- Recyclerview 头部粘贴:StickyHeaders
- EditText 自适应:AutoResizeEditText
- 轮播图:LoopView
- 滑动条库:Indicatorseekbar
SesameApp: Application 进程启动
MainActivity: 主应用程序界面
ScanQRcodeFG: 二维码扫描
ScanNewDeviceFG: 添加新设备
WM2SettingFG: WIFI Module 设置界面
SSM2SetAngleFG: SS4、SS2 角度设置界面
SSM5SettingFG: SS5、SS5PRO 设置界面
SSM2SettingFG: SS4、SS2 设置界面
SesameBotSettingFG: SesameBot1 设置界面
SesameBikeSettingFG: BiKeLock1、BiKeLock2 设置界面
SesameKeyboardSettingFG: Sesame5 设置界面
SesameOpenSensorNoBLESettingFG: SSMOpenSensor 设置界面
SesameTouchProSettingFG: SSMTouchPro、SSMTouch、BLEConnector 设置界面
SesameKeyboardCards: NFC 卡片设置界面
SSMTouchProFingerprint: 指纹设置界面
SesameKeyboardPassCode: 数字密码设置界面
SSMTouchProSelectLockerListFG: SSMTouchPro 设备分享界面
GuestKeyListFG: 访客列表界面
SSM2NoHandLockFG: 全自动上锁界面
MeFG: 首页->我的界面
MyQrCodeFG: 首页->我的界面->我的二维码界面
LoginMailFG: 首页->我的界面->注册界面
LoginVerifiCodeFG: 首页->我的界面->注册界面->二维码校验界面
FriendListFG: 首页->通讯录界面
FriendDetailFG: 首页->通讯录界面->好友详情界面
FriendSelectLockerListFG: 首页->通讯录界面->好友详情界面->共享设备界面
DeviceListFG: 首页->芝麻列表界面
MainRoomFG: 首页->芝麻列表界面->SS4、SS2 设备详情历史记录
MainRoomSS5FG: 首页->芝麻列表界面->SS5、SS5PRO 设备详情历史记录
AddMemberFG: 首页->芝麻列表界面->添加成员界面
KeyQrCodeFG: 首页->芝麻列表界面->分享芝麻二维码 QR 界面
WM2ScanSSIDListFG: 首页->芝麻列表界面->WIFI 详情->WIFI 扫面列表界面
WM2SelectLockerListFG: 首页->芝麻列表界面->WIFI 详情->选择芝麻设备界面
- [Android BLE] (https://developer.android.com/guide/topics/connectivity/bluetooth-le?hl=zh-cn)
- [Android NFC] (https://developer.android.com/guide/topics/connectivity/nfc?hl=zh-cn)
- [Android Jetpack] (https://developer.android.com/jetpack?hl=zh-cn)

