# MinewModuleKit说明文档
本套SDK仅支持Minew公司出品的蓝牙模块设备。通过SDK可以帮助开发者处理手机和蓝牙模块之间的一切工作,包括:扫描设备,连接设备,向设备写入数据,从设备接收数据等。
# 架构
整体框架如下图所示:MTModuleManager为设备管理类,在APP运行时始终是单例。MTModule是设备实例类,此套件会为每一个设备生成一个MTModule实例以便于对监听设备和操作设备。
整体设计思路如下图所示:
MTModuleManager:设备管理类,可以扫描周围的Module设备,并且可以连接它们,校验它们等。
MTModule:设备实例类,当Manager发现一个物理设备时,Manager会生成一个Module实例,这个实例就对应一个物理设备。
# 准备工作
# 开发环境:
- Android Studio
# 导入到工程:
将开发套件的MTModuleKit.jar文件拷贝到libs目录下,然后在对应模块的build.gradle文件中添加依赖。如下图所示:
AndroidManifest.xml 文件下添加蓝牙权限和相应的组件注册。如下所示:
<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.READ_PHONE_STATE"/>
1
2
3
4
5在Android-6.0以上版本蓝牙扫描需要动态申请地理位置权限,具体如下:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_COARSE_LOCATION); }
1
2
3
4
5
# 开始开发
# 扫描设备
首先需要获取到MTModuleManager的单例,然后检查手机当前的蓝牙状态,接着就可以进行设备扫描了。
// 获取Manager单例,并传入context对象
MTModuleManager mMTModuleManager=MTModuleManager.getInstance(context);
//获取手机当前蓝牙开关状态
BluetoothState bluetoothState = MTModuleManager.getInstance(this).checkBluetoothState();
//根据状态进行响应
switch (bluetoothState) {
case BluetoothStateNotSupported:
//不支持蓝牙
break;
case BluetoothStatePowerOff:
//蓝牙关闭状态
break;
case BluetoothStatePowerOn:
//蓝牙开启状态,可进行扫描设备
MTModuleManager.getInstance(getContext()).startScan(mScanMTModuleCallback);
break;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 新增扫描方法(20200408)
开放系统扫描的过滤条件以及扫描的设置属性配置,属于高级操作,不建议随意使用,如下
if (Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP) {
ScanSettings scanSettings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.setReportDelay(0)
.build();
ArrayList<ScanFilter> list = new ArrayList<>();
list.add(new ScanFilter.Builder()
.setServiceUuid(ParcelUuid.fromString("0000ffe1-0000-1000-8000-00805f9b34fb"))
.build());
list.add(new ScanFilter.Builder()
.setManufacturerData(0x004c, new byte[]{})
.build());
mtModuleManager.startScan(scanMTModuleCallback, list, scanSettings);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
PS: 只有手机蓝牙状态处于Power on时,整个SDK才能够正常工作。
# 连接到设备
// 从上一步能够获取到扫描到的设备
MTModule mtModule = mtModules.get(position);
// 监听设备连接状态。
// !!!只有在连接状态为Connected的时候,这个设备才是可以写入数据的
MTModuleManager.getInstance(getContext()).setModuleChangeConnection(new ModuleChangeConnection() {
@Override
public void onDeviceChangeStatus(final MTModule device, ConnectionState status) {
switch (status) {
case DeviceLinkStatus_Connected:
break;
case DeviceLinkStatus_ConnectFailed:
case DeviceLinkStatus_Disconnect:
break;
}
}
});
// 连接到一个模块设备
MTModuleManager.getInstance(getContext()).connect(mtModule);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 向设备写入数据
接上一步,当手机成功与某个设备建立连接后,就可以对设备进行读写操作了。
// 对设备写入数据
// 首先要构造你想写入的数据,这里构造了一组四个字节的数据 0x01,0x02,0x03,0x04.
byte[] bytes = {0x01,0x02,0x03,0x04};
// 然后可以直接执行一下方法,将上述构造的数据写入到设备中。
// 同时你可以在WriteCallback回调中获取到写入是否成功的结果。
module.writeData(bytes, new WriteCallback() {
@Override
public void write(final boolean success, ModuleException exception) {
if (success) {
//写入成功
} else {
//写入失败
}
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 从设备接收数据
由于手机并不知道什么时候设备会发送数据过来,所以在这里使用回调接口的方式来实现数据接收。
// 配置MTModuleListener回调接口等待接收数据
module.setMTModuleListener(new MTModuleListener() {
@Override
public void didReceiveData(byte[] bytes) {
}
});
1
2
3
4
5
6
7
2
3
4
5
6
7
# 从设备读取系统信息
如果固件带有系统信息,可进行获取,方法如下
// 获取设备对应的系统信息
HashMap<String, String> systemInfos = mMTModule.getSystemInfos();
systemInfos.get(Constants.MANUFACTURER);
systemInfos.get(Constants.MODLENUMBER);
systemInfos.get(Constants.SOFTWARE_VERSION);
systemInfos.get(Constants.HARDWARE_VERSION);
systemInfos.get(Constants.FIRMWARE_VERSION);
systemInfos.get(Constants.SERIALNUMBER);
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
系统信息由固件版本控制,支持的固件版本分别为:
固件版本(Verison) | 是否支持 |
---|---|
Version < 1.6.0 | 否 |
1.6.0 <= Version < 2.0.0 | 是 |
2.0.0 <= Version < 2.3.0 | 否 |
2.3.0 <= Version < 3.0.0 | 是 |
3.0.0 <= Version < 3.1.0 | 否 |
3.1.0 <= Version | 是 |
# 附表
# MTModuleManager 属性说明
名称 | 类型 | 备注 |
---|---|---|
mBluetoothState | BluetoothState | 当前的手机蓝牙状态 |
scannedModules | LinkedList | 扫描到的设备 |
connectedModules | HashMap | 当前连接中的设备 |
# MTModule
名称 | 类型 | 备注 |
---|---|---|
name | String | 设备的蓝牙名称 |
macAddress | String | 设备的mac地址 |
advertisingData | byte[] | 设备的广播数据 |
lastUpdate | long | 设备最后一次被扫描到的时间戳 |
connection | ConnectionState | 设备的连接状态 |
rssi | int | 设备的RSSI |
# 文档版本:
- 20200408 新增扫描方法;
- 20190905 注释log日志;
- 20180830 新增获取系统信息;
- 20180614 初版;