# MinewTrackerKit说明文档
本套SDK仅支持基于的nordic52芯片寻物器,与过去的51芯片不兼容。请仔细阅读此文档以便尽快上手开发。
兼容性说明:过去用过MinewFinderSDK的开发者请注意:MinewFinder与MTTrackerKit互相不兼容,切不可用于同一个项目。
# 前期工作
此开发套件和过去的MinewFinder有些类似。我们在之前的基础上全面更新了加密算法和设备端稳定性,性能实际表现远远高于51版本的Tracker。
MTTrackerManager为设备管理类,在APP运行时始终是单例。MTTracker是设备实例类,此套件会为每一个设备生成一个MTTracker实例以便于对监听设备和操作设备。
整体设计思路如下图所示:
*MTTrackerManager:*设备管理类,可以扫描周围的Tracker设备,并且可以连接它们,校验它们等。
MTTracker:设备实例类,当Manager发现一个物理设备时,Manager会生成一个Tracker实例,这个实例就对应一个物理设备。
# 开始上手
# 开发环境:
- Xcode9+,当前SDK使用Xcode9编译,请使用Xcode9及以上版本进行开发;
- iOS8,限制最低系统版本为iOS8;
# 导入到工程:
# CocoaPods
MTTrackKit可通过CocoaPods获得 (opens new window)。要安装它,只需将以下行添加到您的Podfile中,然后导入 <MTTrackKit/MTTrackKit.h>:
pod 'MTTrackKit'
# 手动导入
将开发套件的framework文件:MTTrackit.framework拷贝到项目工程目录下,然后添加到工程中,target为当前的工程,然后点“Add”,如下图所示:
依次找到:“Target” -> General -> Embedded Binaries,点击下面的“+”,继续点击“Add Other”将MTTrackit.framework文件添加进来。同样的,也需要添加到 ”Linked Frameworks and Libraries“,添加完应该如下图:
由于APP需要在后台时也能正常响应Tracker的事件,因此需要开启相关的后台蓝牙权限。如下图:
*如果使用Swift开发,需要添加一个Objective C BridgingHeader .h文件(此处不再赘述),并且在此文件添加:import ,如果使用Objective C进行开发,在需要的文件的顶端添加:import
!!!在iOS10及以上版本,苹果对蓝牙APi添加了权限限制,你需要在工程的info.plist文件里添加一项字符串:Privacy - Bluetooth Peripheral Usage Description - "你的使用描述"。如下图所示:
# 开始开发
# 扫描设备
首先需要获取到MTTrackerManager的单例,然后检查手机当前的蓝牙状态,接着就可以进行设备扫描了。
// 获取Manager单例
MTTrackerManager *manager = [MTTrackerManager sharedInstance];
// 手机端当前的蓝牙开关状态
if(manager.bleState == Poweron) {
// 开始进行设备扫描
[manager startScan:^(NSArray<MTTracker *> *trackers){
// 当检测到周围的设备后,此block会回调。
}];
}
2
3
4
5
6
7
8
9
10
PS:trackers数组里包含的只有未绑定的设备(下文将会提供绑定相关说明)。
# 绑定校验
某个Tracker只有被绑定了才能正常使用,我们建议进行绑定操作时,Tracker与手机的距离不要超过10cm。
基于以前的经验,我们使用了全新的加密算法来保证手机和设备之间通信的安全性。另外,Tracker在出厂时默认密码为空,每个设备在绑定时都需要一个密码,一旦绑定成功,这个Tracker将只接受来自主人手机的连接。
/*
manager: MTTrackerManager单例
*/
// 设置密码,长度必须是8位,可以是大小写字母,数字,特殊符号。
manager.password = @"********";
// 开始进行设备绑定验证操作
[manager bindingVerify:aTracker completion:^(BOOL success, NSError *error) {
// 如果绑定验证成功了,tracker将会被自动添加到manager的bindTrackers数组里,
// 否则说明此设备因为种种原因无法成功绑定。
}];
2
3
4
5
6
7
8
9
10
11
PS:无法绑定的设备是不能正常使用的。
# 解绑设备
如果用户丢失了某个Tracker,或者想把Tracker送给别人。就需要进行解绑操作,严格的来说,除非Tracker丢失了。其它情况下都应该在保持设备与手机连接的状态下进行解绑操作。这是由于Tracker内部记录了当前主人的密码,解绑时需要擦除密码才能保证下一次的正常使用。
/*
manager: MTTrackerManager单例
*/
// 解除设备绑定
// 你想要解除绑定设备的mac地址
NSString *mac = @"acd498765432";
// 解除设备绑定
[manager unbindTracker:mac completion:^(BOOL success, NSError *error) {
// 同样的,操作成功后 success为YES,否则为NO。
}];
2
3
4
5
6
7
8
9
10
11
12
13
# 获取设备信息
你可以通过MTTracker实例获取到对应物理设备的信息,例如蓝牙名称,mac地址,rssi等数据。
// aTracker MTTracker实例
NSString *mac = aTracker.mac; // mac 地址
NSString *name = aTracker.name; // 蓝牙名称
NSInteger rssi = aTraker.rssi; // 信号强度
NSInteger battery = aTracker.battery; // 电池 0~100
Connection status = aTracker.connection; // 设备当前的连接状态
ModelType model = aTracker.model; // 设备型号
Distance dis = aTracker.distance; // 距离信息
2
3
4
5
6
7
8
9
# 呼叫设备
通过我们提供的APi,可以对设备进行呼叫,当然是在设备保持连接的状态下。
// aTracker MTTracker实例
// 当ring 为YES的时候是让设备响铃,为NO的时候是停止设备响铃。
BOOL ring = YES;
// 切换设备响铃状态
[aTracker switchBellStatus:ring completion:^(BOOL success, NSError *error) {
if (success) {
NSLog(@"响铃状态切换成功。");
}
}];
2
3
4
5
6
7
8
9
10
11
# 配置设备断开时的事件处理
Tracker在断开时会有相应的事件处理,比如断开响铃以告知用户等。
// aTracker MTTracker实例
// 为YES表示Tracker断开时将会响铃,否则不响铃
BOOL alert = YES;
[aTracker writeLossAlert:alert completion:^(BOOL success, NSError *error) {
if (success) {
NSLog(@"成功配置断开事件处理。");
}
}];]
2
3
4
5
6
7
8
9
10
11
# 接受来自设备的事件
手机可以接受来自设备的事件,需要做好相关监听。
// aTracker MTTracker实例
[aTracker didReceive:^(Receiving rec) {
// Tracker上的按钮被按下,
// 你可以在这里处理拍照,手机端报警等操作。
if(rec == ReceivingButtonPushed) {
NSLog(@"按下了设备上的按钮。");
}
}];
// 监听设备连接状态变化
[aTracker didConnectionChange:^(Connection con){
switch(con){
case ConnectionConnecting:
NSLog(@"正在连接到Tracker");
break;
case ConnectionConnected:
NSLog(@"Tracker已经连接");
break;
case ConnectionDisconnected:
NSLog(@"Tracker已经断开连接");
break;
};
}];
// 监听设备数据更新
[aTracker didValueUpdate:^(){
/*
设备的属性或状态更新了,你可以刷新UI界面了。
*/
}];
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
# 重启APP后的相关处理
你可能会发现,SDK的操作只涉及到内存数据,如果APP被Kill掉,之前的绑定数据什么的就失效了。所以需要你自行做数据永久化存储,比如当前用户的绑定密码,每个已绑定设备的Mac地址等。
当然,我们也提供了一些APi用于APP恢复后的相关操作。
以下代码均在APP重新运行时处理的。
// 获取一个已绑定Tracker的实例
/*
SDK会智能解析mac地址并生成一个MTTracker实例,如果Tracker在手机附近正常工作。SDK会自动处理连接配置等的相关操作。
唯一需要注意的就是需要保证所提供的mac地址是已绑定的,就是使用过 “- (void)bindingVerify:(MTTracker *)tracker completion:(void(^)(BOOL success, NSError *error))handler;” 方法并且获得了成功的回调。
在获取到MTTracker实例的同时,此Tracker实例也被添加到BindTrackers数组里。
*/
MTTracker *bindTracker = [aManager addTracker:@"xxxxxxxxxxxx"];
2
3
4
5
6
7
# 关于用户切换
有的时候可能出现当前用户注销自己的登录,然后登入另外一个账号,此时就需要从Manager中移除已经绑定的设备,然后加载新用户的已绑定设备。
// 移除当前用户的绑定设备
[aMTTrackerManager removeAllTrackers];
// 设置新用户的绑定密码
aMTTrackerManager.password = @"********";
/*
此处加载新用户的绑定设备Mac地址,假设为数组:bindMacs
*/
for(NSinteger i = 0; i < bindMacs.count; i ++) {
// tracker就是新用户的已绑定设备
MTTracker *tracker = [aMTTrackerManager addTracker:bindMacs[i]];
}
2
3
4
5
6
7
8
9
10
11
12
13
# !!!高级操作
此部分APi属于高级APi,我们把这部分开放给高级开发。除非你明白这些操作的将会导致什么样子的结果,否则不要轻易尝试。
// aTracker MTTracker实例
// 修改设备的断开延迟。
// 这个参数指的是在断开响铃的状态下,设备端将等待delay秒后开始发出声音。
// 需要注意,它的范围是1s-7s,如果设置的数据太小将会出现误报的问题。
NSInteger delay = 7;
// 写入断开延迟
[aTracker writeLossDelay:delay completion:^(BOOL success, NSError *error) {
if(success) { // 成功写入到设备。
}
}];
// 这个参数指的是设备的断开距离,设备将在配置的距离断开连接。
// 例如:如果配置的是“远”,设备将在30米左右断开连接。“中”:将在20米左右,“近”,将在10米左右。
// 需要注意的是,上述30米/20米/10米是举例值,实际使用中受限于环境
// 有远/中/近三档可选,默认情况下是“远”。
DistanceLevel level = DistanceLevelFar;
[aTracker writeLossDistance:level completion:^(BOOL success, NSError *error) {
if (success) { // 成功写入到设备
}
}];
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
#
# F5新特性
在F5设备中新增了修改设备铃声和查询设备铃声的功能。
NSInteger type = 0;//type :0/1/2/3/4
//写入设备铃声
[aTracker writeLossDeviceSound:type com:^(BOOL status) {
if (status) {//修改成功
}
}];
//查询设备铃声
[aTracker writeSelectLossDeviceSound:^(uint8_t type) {
}];
2
3
4
5
6
7
8
9
10
11
12
# F6新特性
在F6设备中新增了移动报警开关和移动报警灵敏度档位设置,并提供查询。
Bool isMoving = YES;
//写入移动报警开关数据,isMoving = YES:开,isMoving = NO:关
[aTracker writeMovingAlert:isMoving completion:^(BOOL success, NSError *error) {
if (success) {
NSLog(@"write moving alert success");
}
else {
NSLog(@"write moving alert error:%@",error);
}
}];
//查询移动报警开关
[aTracker writeSelectMovingAlert:^(uint8_t type) {//type=1:开,type=0:关
}];
2
3
4
5
6
7
8
9
10
11
12
13
14
15
NSInteger level = 0//0:低,1:中,2:高,如若传值非0/1/2,即默认选择低档位
//写入移动报警灵敏度档位设置
[aTracker writeMovingAlertLevelSetting:level completion:^(BOOL success, NSError *error) {
if (success) {
NSLog(@"write moving alert success");
}
else {
NSLog(@"write moving alert error:%@",error);
}
}];
//查询移动报警灵敏度档位
[aTracker writeSelectMovingAlertLevel:^(uint8_t type) {//type=0:低,type=1:中,type=2:高
self->_deviceACCLevel = type;
}];
2
3
4
5
6
7
8
9
10
11
12
13
14