# MinewSensorKit说明文档

本套SDK仅支持Minew公司出品的蓝牙柔性资产标签设备。通过SDK可以帮助开发者处理手机和传感器之间的一切工作,包括:扫描设备,广播数据等。

目前SDK仅支持柔性资产标签的使用。

# 前期工作

整体框架:AssetTagSensorBleManager为设备管理类,在APP运行时始终是单例。AssetTagSensor是设备实例类,此套件会为每一个设备生成一个实例,在扫描使用,内部包含设备广播数据,在扫描期间该数据会随着设备不停广播而更新。

AssetTagSensorBleManager:设备管理类,可以扫描周围的MTB02设备;

AssetTagSensor:扫描时获取到的柔性资产标签设备实例,继承自SensorModule

# 导入到工程

  1. 开发环境

    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
  2. industry_ht_sensor_sdk.jar添加到module的libs文件夹下,并在该modulebuild.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。

  3. 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 -> {
            }
        }

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

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)//单位℃
}

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
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种广播帧类型。

  1. 设备资产标签帧

    • AssetTagFrame

      名称 类型 说明
      encryptoFlag int 0未加密 1加密
      cteFlag int 0 未配置,1配置
      cteLength int cte长度
      encryptoRange int 0 全段加密 全段加密范围为 Encrypto RangeMeasured 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 添加编辑文档;
上次更新:: 2024/12/13 18:31:26