# MinewSensorKit说明文档
本套SDK仅支持Minew公司出品的蓝牙传感器设备。通过SDK可以帮助开发者处理手机和传感器之间的一切工作,包括:扫描设备,广播数据、连接设备,向设备写入数据,从设备接收数据等。
目前SDK仅支持毫米波雷达传感器的使用。
# 前期工作
整体框架:RadarSensorBleManager
为设备管理类,在APP运行时始终是单例。RadarSensor
是设备实例类,此套件会为每一个设备生成一个实例,在扫描和连接后都会使用,内部包含设备广播数据,在扫描期间该数据会随着设备不停广播而更新。
RadarSensorBleManager
:设备管理类,可以扫描周围的ESL设备,并且可以连接它们,校验它们等;
RadarSensor
:扫描时获取到的毫米波雷达传感器设备实例,继承自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将
MinewSensorKit.jar
添加到module的libs文件夹下,并在该module
的build.gradle
中添加如下语句(直接添加依赖):implementation files('libs/radar_sensor_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.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
1
2
3
4
5
6
# 使用
sdk分为扫描、连接和读写三个阶段。
# 扫描部分
# 开始扫描
Android6.0系统以上,进行BLE扫描时,需要先申请到定位权限后并且打开定位开关才能进行。
开启蓝牙扫描需要首先打开蓝牙,如果未打开蓝牙就去扫描,APP会闪退。可通过BLETool.isBluetoothTurnOn来判断蓝牙是否已经打开。如果没有打开,可以调用BLETool.setBluetoothTurnOn打开。
RadarSensorBleManager manager = RadarSensorBleManager.getInstance(context);
if(BLETool.isBluetoothTurnOn(context)){
manager.startScan(context,new OnScanSensorResultListener() {
@Override
public void onScanResult(List<RadarSensor> list) {
//scan result
}
@Override
public void onStopScan(List<RadarSensor> list) {
//stop scan result
}
});
//设置扫描时长5分钟,sdk默认扫描时长5分钟
manager.startScan(context,5*60*1000,new OnScanSensorResultListener() {
@Override
public void onScanResult(List<RadarSensor> list) {
//scan result
}
@Override
public void onStopScan(List<RadarSensor> list) {
//stop scan result
}
});
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
sdk内部并没有对蓝牙扫描时长进行处理,但是扫描是耗电操作,SDK默认5分钟就停止扫描了,如果还需要继续扫描,可以提供定时器或者刷新等操作以便继续调用扫描方法继续扫描设备。
# 取出数据
在扫描期间,APP能够通过sdk获取到设备当前的一部分数据。如下所示通过RadarSensor
获取雷达监测数据,该数据保存在广播帧对象中。
sdk提供了SensorModule
作为RadarSensor的基类,用于存储传感器设备的公有数据,如下表所示:
名称 | 类型 | 说明 |
---|---|---|
macAddress | String | 设备mac |
name | String | 设备名称 |
rssi | int | 信号强度 |
SensorModule
还保存了一个Map,内部用于存储其在扫描期间获取到的设备广播数据帧,可通过如下方式取出:
DeviceStaticInfoFrame deviceInforFrame = (DeviceStaticInfoFrame)module.getMinewFrame(RadarAdvertisingFrameType.DEVICE_STATIC_INFO_FRAME);
PeopleFlowMonitoringFrame peopleFlowFrame = (PeopleFlowMonitoringFrame)module.getMinewFrame(RadarAdvertisingFrameType.PEOPLE_FLOW_MONITORING_FRAME);
PeopleCoordinateInformationFrame peopleCoordinateFrame = (PeopleCoordinateInformationFrame)module.getMinewFrame(RadarAdvertisingFrameType.PeopleCoordinateInformationFrame);
if (deviceInforFrame != null) {
//设备mac地址
String macAddress = deviceInforFrame.getMacAddress();
//电量百分比
int battery = deviceInforFrame.getBattery();
//固件版本
String firmwareVersion = deviceInforFrame.getFirmwareVersion();
}
if (peopleFlowFrame != null) {
//雷达检测到的进门次数
int numberOfEntries = peopleFlowFrame.getNumberOfEntries();
//雷达检测到的出门次数
int numberOfExits = peopleFlowFrame.getNumberOfExits();
}
if (peopleCoordinateFrame != null) {
//雷达监测到的总人数
int totalNumberOfPerson = peopleCoordinateFrame.getTotalNumberOfPerson();
//雷达检测到的人员坐标信息
List<CoordinateInformation> coordinateInformationLists = peopleCoordinateFrame.getCoordinateInformationLists();
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
雷达设备有3种广播帧类型。但是同时只能存在2种广播。人流量监测雷达设备有设备静态信息帧和人流量监测帧,人员坐标信息雷达设备有设备静态信息帧和员坐标信息监测帧。
设备静态信息帧
DeviceStaticInfoFrame
名称 类型 说明 frameVersion int 设备类型 firmwareVersion String 固件版本 batteryLevel int 电池电量百分比 macAddress String 固件mac peripheralSupportInfo PeripheralSupportInfo 外设支持描述,包含设备产品id
人流量监测帧
PeopleFlowMonitoringFrame
名称 类型 说明 frameVersion int 设备类型 serialNumber int 雷达传感器每输出一次监测数据,该序列号自加 1 numberOfEntries int 雷达检测到的进门次数 numberOfExits int 雷达检测到的出门次数 digitalSignature int 数字签名 totalNumberOfPerson int 监测到的总人数 人员坐标信息帧
- PeopleCoordinateInformationFrame
名称 类型 说明 frameVersion int 设备类型 serialNumber int 雷达传感器每输出一次监测数据,该序列号自加 1 totalNumberOfPerson int 监测到的总人数 coordinateInformationLists List<CoordinateInformation> 坐标信息 - 坐标信息CoordinateInformation
名称 类型 说明 x float x轴坐标 y float y坐标 z float z轴坐标
# 连接
连接前一般需要先停止扫描。sdk提供了连接和断开连接方法。
//停止扫描
manager.stopScan(context);
//设置设备秘钥
String key;
manager.setSecretKey(key);
//连接,module为准备连接的设备
RadarSensor module;
manager.connect(context,module);
//断开连接。macAddress为设备mac
manager.disConnect(macAddress);
2
3
4
5
6
7
8
9
10
注意:连接设备前,请确认是否扫描到设备,如果没扫描到设备广播,调用连接方法,将连接失败。
在调用connect()
后,sdk中会对连接过程会有状态监听。
//设置监听器
manager.setOnConnStateListener(new OnConnStateListener() {
/*
* 连接过程中的状态回调
*
* @param macAddress 设备mac
* @param connectionState 状态
*/
@Override
public void onUpdateConnState(String address, MSensorConnectionState state) {
switch (state) {
case Disconnect:
//连接失败或者设备断开连接会回调,主动断开不会回调该状态
break;
case Connecting:
//调用connect()后就会回调该状态
break;
case Connected:
//初步连接成功,作为一个过渡阶段,此时并未真正成功
break;
case ConnectComplete:
//连接完成,此时设备可进行读写操作
break;
default:
break;
}
}
});
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
在连接过程中,sdk会返回多个连接状态到app中,app需要做好处理。
- MSensorConnectionState.Connecting,MSensorConnectionState.Connected: 连接设备中,在这里状态下不要做耗时操作,因为此时在连接设备发现服务,并发送认证数据等。
- MSensorConnectionState.ConnectComplete: 此时传感器设备已经连接成功,可以进行读写操作,比如配置广播参数、传感器配置等。
- MSensorConnectionState.Disconnect: 连接失败或者设备断开连接会回调。如果APP主动调用
manager.disConnect(macAddress);
不会回调该状态。
# 读写
读写API如下:
/**
* 设置设备的秘钥
* @param eaxKey 设备对应的秘钥
*/
@Override
public void setSecretKey(String macAddress, String password);
/**
* 设置设备信息帧广播参数
*
* @param macAddress 设备mac
* @param advertisingInterval 广播间隔 单位毫秒,广播间隔 100ms ~ 5000ms 可调,刻度为 100ms;
* @param txPower -40 -20 -16 -12 -8 -4 0 4dBm
* @param listener 监听器
*/
void setDeviceInfoFrameAdvertisingParametersConfiguration(String macAddress, int advertisingInterval, int txPower, OnModifyConfigurationListener listener);
/**
* 查询设备信息帧广播参数
*
* @param macAddress 设备mac
* @param listener 监听器
*/
void queryDeviceInfoFrameAdvertisingParametersConfiguration(String macAddress, OnQueryResultListener<DeviceInfoAdvertisingParametersConfiguration> listener);
/**
* 设置雷达帧广播参数
*
* @param macAddress 设备mac
* @param advertisingInterval 广播间隔 单位毫秒,广播间隔 100ms ~ 5000ms 可调,刻度为 50ms;
* @param txPower -40 -20 -16 -12 -8 -4 0 4dBm
* @param listener 监听器
*/
void setRadarFrameAdvertisingParametersConfiguration(String macAddress, int advertisingInterval, int txPower, OnModifyConfigurationListener listener);
/**
* 设置雷达帧广播参数
*
* @param macAddress 设备mac
* @param listener 监听器
*/
void queryRadarFrameAdvertisingParametersConfiguration(String macAddress, OnQueryResultListener<RadarMonitorAdvertisingParametersConfiguration> listener);
/**
* 设置雷达人流量配置
*
* @param macAddress 设备mac
* @param maps 配置maps
* @param listener 监听器
*/
void setRadarPeopleFlowMonitorConfiguration(String macAddress, Map<PeopleFlowMonitorCommandKeys,Object> maps, OnModifyConfigurationListener listener);
/**
* 查询雷达人流量配置
*
* @param macAddress 设备mac
* @param listener 监听器
*/
void queryRadarPeopleFlowMonitorConfiguration(String macAddress, OnQueryResultListener<RadarPeopleFlowMonitorParametersConfiguration> listener);
/**
* 设置雷达坐标配置
*
* @param macAddress 设备mac
* @param maps 配置maps
* @param listener 监听器 EnumMap
*/
void setRadarPeopleCoordinateMonitorConfiguration(String macAddress, Map<PeopleCoordinateMonitorCommandKeys,Object> maps, OnModifyConfigurationListener listener);
/**
* 查询雷达坐标配置
*
* @param macAddress 设备mac
* @param listener 监听器
*/
void queryRadarPeopleCoordinateMonitorConfiguration(String macAddress, OnQueryResultListener<RadarPeopleCoordinateMonitorParametersConfiguration> listener);
/**
* 查询雷达的类型
*
* @param macAddress 设备mac
* @param listener 监听器
*/
void queryMillimeterWaveRadarSensorType(String macAddress, OnQueryResultListener<MillimeterWaveRadarSensor> listener);
/**
* 该指令用于控制灯的亮灭,指令中的单周期时间 = 单周期亮灯时间 + 单周期灭灯时间。单周期时间必须 大于 单周期亮灯的时间,否则会上报 20 错误码 ,不执行该指令。
* @param macAddress
* @param colorTable
* @param totalOperationTime LE, 操作总时长, 1~65535 ( S )
* @param singleCycleLightingTime LE, 单周期内的亮灯时间, 1~65535 ( MS )
* @param singleCycleTime LE, 单周期时间, 1~65535 ( MS )
* @param brightness 亮度, 1~100
*/
void setLEDParameters(String macAddress, ColorTable colorTable,int totalOperationTime,int singleCycleLightingTime,int singleCycleTime,int brightness,OnModifyConfigurationListener listener);
/**
* 固件升级
*
* @param macAddress 设备mac
* @param upgradeData 升级包数据
* @param listener 监听器
*/
public void firmwareUpgrade(String macAddress,byte[] upgradeData, OnFirmwareUpgradeListener listener);
/**String macAddress
* 恢复出厂设置
*
* @param macAddress 设备mac
* @param listener 监听器
*/
public void reset(String macAddress, OnModifyConfigurationListener listener);
/**
* 关机
* @param macAddress 设备mac
* @param listener 监听器
*/
public void powerOff(String macAddress, OnModifyConfigurationListener listener);
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
对部分方法进行补充说明:
读取和设置设备信息帧广播参数配置
//读取广播参数信息 manager.queryDeviceInfoFrameAdvertisingParametersConfiguration(mAddress, new OnQueryResultListener<DeviceInfoAdvertisingParametersConfiguration>() { @Override public void OnQueryResult(boolean queryResult, DeviceInfoAdvertisingParametersConfiguration queryInfo) { //queryResult为true,表明查询成功,反之为失败 if(queryResult){ }else{ //查询失败 } } }); //设置广播参数信息 int advertisingInterval = 1000; int txPower = -4; manager.setDeviceInfoFrameAdvertisingParametersConfiguration(macAddress, advertisingInterval, txPower,new OnModifyConfigurationListener() { @Override public void onModifyResult(boolean success) { //success为true,表明设置成功,反之为失败 } });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21读取和设置设备雷达监测帧广播参数配置
//读取广播参数信息 manager.queryRadarFrameAdvertisingParametersConfiguration(mAddress, new OnQueryResultListener<RadarMonitorAdvertisingParametersConfiguration>() { @Override public void OnQueryResult(boolean queryResult, RadarMonitorAdvertisingParametersConfiguration queryInfo) { //queryResult为true,表明查询成功,反之为失败 if(queryResult){ }else{ //查询失败 } } }); //设置广播参数信息 int advertisingInterval = 1000; int txPower = -4; manager.setRadarFrameAdvertisingParametersConfiguration(macAddress, advertisingInterval, txPower,new OnModifyConfigurationListener() { @Override public void onModifyResult(boolean success) { //success为true,表明设置成功,反之为失败 } });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21读取和设置设备雷达人流量监测参数配置。
//读取人流量配置参数信息 manager.queryRadarPeopleFlowMonitorConfiguration(mAddress, new OnQueryResultListener<RadarPeopleFlowMonitorParametersConfiguration>() { @Override public void OnQueryResult(boolean queryResult, RadarPeopleFlowMonitorParametersConfiguration queryInfo) { //queryResult为true,表明查询成功,反之为失败 if(queryResult){ }else{ //查询失败 } } }); //设置人流量配置参数信息 Map<PeopleFlowMonitorCommandKeys,Object> maps = new HashMap<>(); maps.put(PeopleFlowMonitorCommandKeys.HEAT_TIME,100); maps.put(PeopleFlowMonitorCommandKeys.VERTICAL_HEIGHT,100); maps.put(PeopleFlowMonitorCommandKeys.SCAN_TIME,1000); maps.put(PeopleFlowMonitorCommandKeys.SENS,2); maps.put(PeopleFlowMonitorCommandKeys.XPOSI,50); maps.put(PeopleFlowMonitorCommandKeys.XNEGA,-50); manager.setRadarPeopleFlowMonitorConfiguration(macAddress, maps , new OnModifyConfigurationListener() { @Override public void onModifyResult(boolean success) { //success为true,表明设置成功,反之为失败 } });
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读取和设置设备雷达人员坐标监测参数配置。
PeopleFlowMonitorCommandKeys
类型 | 说明 |
---|---|
SCAN_TIME | 配置扫描间隔 (单位ms, 范围[100,10000], 默认值100) |
HEAT_TIME | 配置心跳间隔 (单位s, 范围[10,999], 默认值60) |
VERTICAL_HEIGHT | 设置垂直距离(单位cm, 范围(50,500),默认值270) |
SENS | 配置灵敏度 (范围[1,19], 默认值为2) |
RANGE | 配置径向距离 (单位cm, 范围[10,1000], 默认值1000) |
XPOSI | 配置 X 正向范围 (单位cm, 范围[-100,300), 默认值100) |
XNEGA | 配置 X 负向范围 (单位cm, 范围[-300,100), 默认值-100) |
YPOSI | 配置 Y 正向范围 (单位cm, 范围[-100,300), 默认值50) |
YNEGA | 配置 Y 负向范围 (单位cm, 范围[-300,100), 默认值-50) |
SCAN_XPOSI | 配置 X 正向扫描范围 (单位cm, 范围[0,300]) |
SCAN_XNEGA | 配置 X 负向扫描范围 (单位cm, 范围[-300,0)) |
SCAN_YPOSI | 配置 Y 正向扫描范围 (单位cm, 范围[0,300]) |
SCAN_YNEGA | 配置 Y 负向扫描范围 (单位cm, 范围[-300,0)) |
SCAN_HEIGHT | 配置扫描高度范围 (单位cm, 范围[50,500]) |
PeopleCoordinateMonitorCommandKeys
类型 | 说明 |
---|---|
SCAN_TIME | 配置扫描间隔 (单位ms, 范围[100,10000], 默认值100) |
MONITOR_TIME | 配置监测间隔 (单位s, 范围[1,99], 默认值1) |
HEAT_TIME | 配置心跳间隔 (单位s, 范围[10,999], 默认值60) |
RANGE | 配置径向距离 (单位cm, 范围[100,1000], 默认值600) |
SENS | 配置灵敏度 (范围[1,19], 默认值为2) |
DOOR1 | 门 1 配置(范围[-3,3],包含-3和3, 最多支持一位小数) |
DOOR2 | 门 2 配置(范围[-3,3],包含-3和3, 最多支持一位小数) |
DOOR3 | 门 3 配置(范围[-3,3],包含-3和3, 最多支持一位小数) |
WINDOWS1 | 窗帘 1 配置(范围[-3,3],包含-3和3, 最多支持一位小数) |
WINDOWS2 | 窗帘 2 配置(范围[-3,3], 包含-3和3,最多支持一位小数) |
WINDOWS3 | 窗帘 3 配置(范围[-3,3],包含-3和3, 最多支持一位小数) |
//读取人员坐标配置参数信息
manager.queryRadarPeopleCoordinateMonitorConfiguration(mAddress, new OnQueryResultListener<RadarPeopleCoordinateMonitorParametersConfiguration>() {
@Override
public void OnQueryResult(boolean queryResult, RadarPeopleCoordinateMonitorParametersConfiguration queryInfo) {
//queryResult为true,表明查询成功,反之为失败
if(queryResult){
}else{
//查询失败
}
}
});
//设置人员坐标配置参数信息
Map<PeopleCoordinateMonitorCommandKeys,Object> maps = new HashMap<>();
maps.put(PeopleCoordinateMonitorCommandKeys.HEAT_TIME,100);
maps.put(PeopleCoordinateMonitorCommandKeys.SCAN_TIME,1000);
maps.put(PeopleCoordinateMonitorCommandKeys.MONITOR_TIME,10);
maps.put(PeopleCoordinateMonitorCommandKeys.SENS,2);
List<CoordinateBean> doorList = new ArrayList<>();
doorList.add(new CoordinateBean(-3,0));
doorList.add(new CoordinateBean(0,3));
maps.put(PeopleCoordinateMonitorCommandKeys.DOOR1,doorList);
List<CoordinateBean> windowList = new ArrayList<>();
windowList.add(new CoordinateBean(-1,1));
windowList.add(new CoordinateBean(2,3));
maps.put(PeopleCoordinateMonitorCommandKeys.WINDOWS1,windowList);
manager.setRadarPeopleCoordinateMonitorConfiguration(macAddress, maps , new OnModifyConfigurationListener() {
@Override
public void onModifyResult(boolean success) {
//success为true,表明设置成功,反之为失败
}
});
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
固件升级。
/** * 固件升级 * * @param macAddress 设备mac * @param isLinkUpgrade 是否是连接升级,用升级包的方式设置false,用url升级方式设置true. * @param dfuTarget 升级蓝牙固件dfuTarget=0,升级雷达固件dfuTarget=1 * @param upgradeData 升级包数据 * @param listener 监听器 */ manager.firmwareUpgrade(mac, isLinkUpgrade, dfuTarget,upgradeData, new OnFirmwareUpgradeListener() { /** * 升级包数据写入进度 */ @Override public void updateProgress(int progress) { } /** * 升级成功回调,此时设备会主动跟手机断开连接,所以会触发OnConnStateListener回调,返回 * MSensorConnectionState.Disconnect状态 */ @Override public void upgradeSuccess() { } /** * 升级失败 */ @Override public void upgradeFailed() { } });
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设置雷达设备类型。
//查询雷达的类型 manager.queryMillimeterWaveRadarSensorType(mAddress, new OnQueryResultListener<MillimeterWaveRadarSensor>() { @Override public void OnQueryResult(boolean queryResult, MillimeterWaveRadarSensor queryInfo) { //queryResult为true,表明查询成功,反之为失败 if(queryResult){ RadarFirmwareType radarFirmwareType = queryInfo.getRadarFirmwareType(); switch (radarFirmwareType){ case PEOPLE_FLOW_MONITORING_FRAME: RadarPeopleFlowMonitorParametersConfiguration radarPeopleFlowConfiguration = getRadarPeopleFlowMonitorParametersConfiguration() break; case PEOPLE_COORDINATE_INFOMATION_FRAME: RadarPeopleCoordinateMonitorParametersConfiguration radarPeopleCoordinateConfiguration = getRadarPeopleCoordinateMonitorParametersConfiguration(); break; default: break; } }else{ //查询失败 } } });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22恢复出厂设置。
/** * 恢复出厂设置 * * @param macAddress 设备mac */ manager.reset(macAddress, new OnModifyConfigurationListener() { @Override public void onModifyResult(boolean success) { } });
1
2
3
4
5
6
7
8
9
10
11
8.关机。
/**
* 重置
*
* @param macAddress 设备mac
*/
manager.powerOff(macAddress, new OnModifyConfigurationListener() {
@Override
public void onModifyResult(boolean success) {
}
});
2
3
4
5
6
7
8
9
10
11
# 历史记录
- **2023/07/19添加编辑文档;