# MinewModuleKit说明文档

本套SDK仅支持Minew公司出品的蓝牙模块设备。通过SDK可以帮助开发者处理手机和蓝牙模块之间的一切工作,包括:扫描设备,连接设备,向设备写入数据,从设备接收数据等。

# 架构

整体框架如下图所示:MTModuleManager为设备管理类,在APP运行时始终是单例。MTModule是设备实例类,此套件会为每一个设备生成一个MTModule实例以便于对监听设备和操作设备。

整体设计思路如下图所示:

设计说明

MTModuleManager:设备管理类,可以扫描周围的Module设备,并且可以连接它们,校验它们等。

MTModule:设备实例类,当Manager发现一个物理设备时,Manager会生成一个Module实例,这个实例就对应一个物理设备。

# 准备工作

# 开发环境:

  • Android Studio

# 导入到工程:

  1. 将开发套件的MTModuleKit.jar文件拷贝到libs目录下,然后在对应模块的build.gradle文件中添加依赖。如下图所示:

    添加framework

  2. 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

# 新增扫描方法(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

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

# 向设备写入数据

接上一步,当手机成功与某个设备建立连接后,就可以对设备进行读写操作了。

// 对设备写入数据
// 首先要构造你想写入的数据,这里构造了一组四个字节的数据 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

# 从设备接收数据

由于手机并不知道什么时候设备会发送数据过来,所以在这里使用回调接口的方式来实现数据接收。

// 配置MTModuleListener回调接口等待接收数据
module.setMTModuleListener(new MTModuleListener() {
        @Override
        public void didReceiveData(byte[] bytes) {

        }
    });
1
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

系统信息由固件版本控制,支持的固件版本分别为:

固件版本(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 初版;
上次更新:: 2020/6/11 13:52:56