# MinewSensorKit说明文档
本套SDK仅支持Minew公司出品的蓝牙柔性资产标签设备。通过SDK可以帮助开发者处理手机和传感器之间的一切工作,包括:扫描设备,广播数据等。
目前SDK仅支持柔性资产标签的使用。
# 前期工作
整体框架:AssetTagSensorBleManager
为设备管理类,在APP运行时始终是单例。AssetTagSensor
是设备实例类,此套件会为每一个设备生成一个实例,在扫描使用,内部包含设备广播数据,在扫描期间该数据会随着设备不停广播而更新。
AssetTagSensorBleManager
:设备管理类,可以扫描周围的MTB02设备;
AssetTagSensor
:扫描时获取到的柔性资产标签设备实例,继承自SensorModule
;
# 导入到工程
开发环境
sdk最低支持Android 5.0,对应API Level为18。在module的
build.gradle
中设置minSdkVersion
为21或21以上android { defaultConfig { applicationId "com.xxx.xxx" minSdkVersion 21 } }
1
2
3
4
5
6
7将
industry_ht_sensor_sdk.jar
添加到module的libs文件夹下,并在该module
的build.gradle
中添加如下语句(直接添加依赖):implementation files('libs/mtb02_asset_tag_sdk.jar') implementation files('libs/sensor_sdk_base.jar') implementation 'org.lucee:bcprov-jdk15on:1.52.0'
1
2
3或者右键该jar文件,选择
Add as Library
,添加到当前module。在
AndroidManifest.xml
需要以下权限,如果targetSdkVersion
大于23,则需要做权限管理以获取权限:<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" tools:node="replace" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" tools:node="replace" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/> <uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED"/> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" />
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 使用
sdk只有扫描一个阶段。
# 扫描部分
# 开始扫描
Android6.0系统以上,进行BLE扫描时,需要先申请到定位权限后并且打开定位开关才能进行。
开启蓝牙扫描需要首先打开蓝牙,如果未打开蓝牙就去扫描,APP会闪退。可通过BLETool.isBluetoothTurnOn来判断蓝牙是否已经打开。如果没有打开,可以调用BLETool.setBluetoothTurnOn打开。
val mBleManager = AssetTagSensorBleManager.getInstance()
when (BLETool.checkBluetooth(this@ScanDevicesListActivity)) {
BluetoothState.BLE_NOT_SUPPORT -> {
Toast.makeText(this@ScanDevicesListActivity, "Not Support BLE", Toast.LENGTH_SHORT).show()
}
BluetoothState.BLUETOOTH_OFF -> {
val enableIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
launcherActivityResultForBle.launch(enableIntent)
}
BluetoothState.BLUETOOTH_ON -> {
manager.startScan(this@ScanDevicesListActivity.application, 5*60*1000,object : OnScanAssetTagResultListener {
override fun onScanResult(scanList: MutableList<AssetTagSensor>?) {
}
override fun onStopScan(scanList: MutableList<AssetTagSensor>?) {
}
})
}
else -> {
}
}
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
sdk内部并没有对蓝牙扫描时长进行处理,但是扫描是耗电操作,SDK默认5分钟就停止扫描了,如果还需要继续扫描,可以提供定时器或者刷新等操作以便继续调用扫描方法继续扫描设备。
# 取出数据
在扫描期间,APP能够通过sdk获取到设备当前的一部分数据。如下所示通过AssetTagSensor
获取设备广播数据,该数据保存在广播帧对象中。
sdk提供了SensorModule
作为AssetTagSensor
的基类,用于存储传感器设备的公有数据,如下表所示:
名称 | 类型 | 说明 |
---|---|---|
macAddress | String | 设备mac |
name | String | 设备名称 |
rssi | int | 信号强度 |
mMinewFrameMap | HashMap | 广播数据map |
SensorModule
还保存了一个Map,内部用于存储其在扫描期间获取到的设备广播数据帧,可通过如下方式取出:
val module:PT100SensorEntity
val assetTagFrame: AssetTagFrame? =module.getMinewFrame(AssetTagAdvertisingFrameType.ASSET_TAG_FRAME)?.let {
it as AssetTagFrame
}
if (assetTagFrame != null) {
//设备mac地址
val macAddress = module.macAddress
//rssi
val rssi = module.rssi
//cteFlag
val cteFlag = assetTagFrame.cteLength
//encryptoFlag
val encryptoFlag = assetTagFrame.encryptoFlag
//noneCounter
val noneCounter = assetTagFrame.noneCounter
//measuredPower
val measuredPower = assetTagFrame.measuredPower
//rawDataHex
val rawDataHex = assetTagFrame.rawDataHex
//cteFlag
val cteFlag = assetTagFrame.cteLength
//cteFlag
val cteFlag = assetTagFrame.cteLength
//cteFlag
val cteFlag = assetTagFrame.cteLength
//encryptoDataByte 加密数据
val encryptoDataByte = assetTagFrame.encryptoDataByte
//加密数据
val secretKey = ""//用户输入的秘钥字符串
val encryptoDataByte = when (encryptoFlag) {
1 -> {
//加密
if (secretKey != null && secretKey.isNotEmpty()) {
CipherWrapper.data_decrypt(
AssetTagSensorUtil.hexStringToBytes(secretKey),
none,
encryptoDataByte
)
} else {
encryptoDataByte
}
}
else -> encryptoDataByte
}
val macData = ByteArray(6)
System.arraycopy(encryptoDataByte, 0, macData, 0, macData.size)
Tools.reverse(macData)
val macAddressHex = Tools.bytesToHexString(macData, ":")
// //battery vlotage
val batteryByte = ByteArray(2)
System.arraycopy(encryptoDataByte, 6, batteryByte, 0, batteryByte.size)
val battery=NumberUtil.setScale((assetTagFrame.getBatterVoltage(batteryByte)) / 1000f,3)//单位V
//socTemperature
val socTemperatureByte = ByteArray(2)
System.arraycopy(encryptoDataByte, 8, socTemperatureByte, 0, socTemperatureByte.size)
val socTemperatur=assetTagFrame.getSocTemperature(socTemperatureByte)//单位℃
}
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
柔性资产设备只有1种广播帧类型。
设备资产标签帧
AssetTagFrame
名称 类型 说明 encryptoFlag int 0未加密 1加密 cteFlag int 0 未配置,1配置 cteLength int cte长度 encryptoRange int 0 全段加密 全段加密范围为 Encrypto Range
与Measured Power
之间的数据measuredPower int Power noneSalt int NoneSalt encryptoDataByte byte[] 加密数据byte noneCounter int NoneCounter none byte[] none值等于4个字节的noneCounter+2个字节的noneSalt rawDataHex String 广播数据hex字符串 updateTime long 记录广播帧数据更新时间, calculateAdvInterval long 记录广播数据间隔,可能会有丢包,该数值不精确仅供参考。
# 历史记录
- **2024/12/11 添加编辑文档;