云子,作为一款智能iBeacon传感器,在室内定位、线下统计、顾客互动等方面均有大规模的应用。因此如何在大规模使用的情况下,高效使用云子变得尤为重要。
商业部署的过程中,我们将云子的使用过程分为如下几部分:
当我们采购一批云子时,常常遇到的问题就是如何对这些云子进行管理。
每个云子都有唯一的序列号标识(SN)来标记云子的唯一性,同时在云子附带的二维码中包含有与其相对应的密钥。基于这一特点,我们可以很轻松地实现精确到特定云子的管理。
入库操作步骤:
通过以上三步,我们就完成对云子最基本的入库操作,主要使用了SENSORO云平台,以及巡检工具。现在我们可以在云平台中通过搜索和浏览找到特定的云子。
进入部署环境,这是云子使用过程中比较复杂的一部分。
我们以某商场的室内定位为例,在商场一层部署100个云子。
部署操作步骤:
云子部署比较复杂,除了使用了配置工具外还使用了SENSORO云平台、巡检工具来辅助部署过程。部署结束后,您可以在SENSORO云平台中查看云子的配置数据以及部署位置。
当云子完成部署后,进入开发阶段。这里我们通常会有三个需求:获取云子设备的部署位置及相关配置的信息,批量修改云子设备的一些配置如UUID、功率、频率、密码等,检测配置是否正确。
1.云子的部署信息
在云子的部署过程中,我们生成了一套部署图。SENSORO云平台提供了一套完整的 REST API,您可以通过API获取到账号下的全部云子,可以获取每张部署图下云子的部署数据。
2.批量配置
我们基于云子的实际开发过程中,对云子的工作配置可能与云子部署时并不一致,这样我们就需要对云子进行重新的部署。最基本的部署方式,可以参照部署图查找云子对应的SN,再利用配置工具搜索对应的SN找到云子进行配置。 这个过程显得比较繁琐,我们通常的配置需求可能是批量修改UUID、功率、频率、设置密码等。我们提供了适用于这种情况的批量配置工具,使用它可以快速完成云子工作配置的统一设置。对于需要调整的特殊云子,我们可以继续使用配置工具来对其进行单独配置。
3.配置检测
在配置完成后,我们可以通过巡检工具来将云子最新的状态更新到SENSORO云平台。可通过云平台来检查并确认云子的配置是否正确。
在云子的使用过程中,我们要不断地检查云子以保证其在正确工作状态。这一过程,我们可分为巡检、替换两部分。
我们为云子的巡检提供了三种解决方案:
(1)iOS SDK
/* 初始化UUID */NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"23A01AF0-232A-4518-9C0E-323FB773F5EF"];
SBKBeaconID *beaconID = [SBKBeaconID beaconIDWithProximityUUID:uuid];/* 开始扫描 */
[[SBKBeaconManager sharedInstance] startRangingBeaconsWithID:beaconIDwakeUpApplication:NO];/* 申请权限 */
[[SBKBeaconManager sharedInstance] requestAlwaysAuthorization];/* 开启传感器数据上传 */
[[SBKBeaconManager sharedInstance] setCloudServiceEnable:YES];(需要v3.0版SDK,目前内测中)
Android SDK
/* 开启传感器数据上传 */beaconManager.cloudEnable(YES);(需要v3.0版SDK,目前内测中)/* 启动服务 */
beaconManager.startService();
替换操作:
我们可以通过SENSORO云平台来查看那些云子工作状态不正常,可以对其进行替换操作。
利用配置工具将一颗新的云子的UMM、功率、频率、传感器开关、加密广播已经密码设置与被替换的云子相同,然后将之前的云子摘除替换为新的云子。
进入 摇一摇周边平台,登录微信公众号。
参照微信官方文档
1.新增设备
,操作完成后你会获得一个未激活的设备。
2.查看设备
,获得设备的配置,每个设备均有一个 iBeacon ID,即 UUID、Major、Minor。
1.下载配置工具
参照配置工具文档
2.扫描硬件上的设备二维码
,进入此设备页面。
3.开始配置
,将微信给出的 iBeacon ID,通过配置工具设置到设备里。
4.保存
激活设备
提示公众号页面
摇一摇周边平台分配的设备在激活后,会关联到自身的公众号页面。您可以通过平台上的`页面管理`来新增页面。
页面类型
1.新增页面
,选择按照您的需求选择页面类型。2.对设备进行页面关联
,建立设备与页面的连接。3.摇一摇验证
,按照第四部分的配置验证进行重新验证。摇一摇配置总体上比较简单,只有两部分主要内容:
常见问题
由于 SDK 需要更多的 App 授权,所以如果您不需要下面列表中的功能,请使用 iOS 提供的标准 iBeacon SDK 进行开发。
- 1.需要动态修改设备。
- 2.需要使用防蹭用功能。
- 3.需要访问设备的传感器数据和电池数据。
欢迎使用云子/标签,本质上它们是一种带有iBeacon功能的无线智能传感器设备。
目前我们的iOS SDK,主要提供以下功能:
您可以从下面的地址下载最新版的iOS SDK:下载地址
解压缩下载的文件,将 Headers 目录中的所有文件,以及libSensoroBeaconKit.a、libSensoroCloud.a文件,加入您的 Xcode 项目中。
(1)因为SDK中含有Category,所以需要在 Other Linker Flags 增加 -ObjC
Targets --> Build Settings --> Linking --> Other Linker Flags
结果如下图所示:
(2)然后添加对系统框架的依赖 (Framework):
Targets --> Build Phases --> Link Binary With Libraries
- CoreBluetooth.framework
- CoreLocation.framework
- Security.framework
结果如下图所示:
引用头文件:
#import "SBKBeacon.h"
#import "SBKBeaconManager.h"
#import "SBKBeaconManager+Cloud.h"
在这一步,我们声明需要监听的硬件的UUID等,随后启动扫描服务。请求所需的各类权限如定位服务,并设置是否上传传感器数据(电池电量、UMM)等。
/*初始化UUID*/
NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:@"23A01AF0-232A-4518-9C0E-323FB773F5EF"];
SBKBeaconID *beaconID = [SBKBeaconID beaconIDWithProximityUUID:uuid];
/* 设置云子防蹭用密钥 (如果没有可以不设置) */
[SBKBeaconManager sharedInstance] addBroadcastKey("01Y2GLh1yw3+6Aq0RsnOQ8xNvXTnDUTTLE937Yedd/DnkHESUpvQ7YvLucs9YfwGR5R/jwW8Rqp9XtGbmwbKXzXQ==");
/*开始扫描*/
[[SBKBeaconManager sharedInstance] startRangingBeaconsWithID:beaconIDwakeUpApplication:NO];
/*申请权限*/
[[SBKBeaconManager sharedInstance] requestAlwaysAuthorization];
/* 设置启用云服务 (上传传感器数据,如电量、UMM等)。如果不设置,默认为关闭状态。*/
[[SBKBeaconManager sharedInstance] setCloudServiceEnable:YES];
通常我们进入或离开某些设备时需要进行一些操作,目前有两种监测方式。
1. 通过Notification监控传感器进出状态/*当有设备进入或离开时,SDK将发出 SBKBeaconInRangeStatusUpdatedNotification*/ [[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(beacon:)name:SBKBeaconInRangeStatusUpdatedNotificationobject:nil];2. 通过Delegate监控传感器进出状态/* 发现新传感器设备 */ - (void)beaconManager:(SBKBeaconManager *)beaconManager didRangeNewBeacon:(SBKBeacon *)beacon;/* 传感器设备离开 */ - (void)beaconManager:(SBKBeaconManager *)beaconManager beaconDidGone:(SBKBeacon *)beacon;/* 每秒返回还在范围内的传感器设备 */ - (void)beaconManager:(SBKBeaconManager *)beaconManager scanDidFinishWithBeacons:(NSArray *)
下表为云子传感器中常用的重要参数列表。
属性 | 描述 |
---|---|
beaconID | 包含UMM的ID值 |
serialNumber | 设备唯一表示 |
rssi | 信号强度 |
accuracy | 距离(米) |
proximity | 范围(很远,附近,很近,未知) |
temperature | 芯片温度 |
light | 光线 |
moving | 移动状态 |
accelerometerCount | 移动计数器 |
inRange | 是否在范围内 |
batteryLevel | 电池电量 |
hardwareModelName | 硬件版本 |
firmwareVersion | 固件版本 |
应用程序通常会在传感器数据状态发生变化时进行一些操作,如信号强度变化,光线变化,移动状态变化,计数器数值变化。目前有两种方式来监测:
1. 通过Delegate监控传感器设备各传感器数值状态/* 传感器设备信号强度变化*/ - (void)sensoroBeacon:(SBKBeacon *)beacon didUpdateRSSI:(NSInteger)rssi;
/* 传感器设备温度变化*/ - (void)sensoroBeacon:(SBKBeacon *)beacon didUpdateTemperatureData:(NSNumber *)temperature;
/* 传感器设备光线变化*/ - (void)sensoroBeacon:(SBKBeacon *)beacon didUpdateLightData:(NSNumber *)light;
/* 传感器设备移动计数器数值变化*/ - (void)sensoroBeacon:(SBKBeacon *)beacon didUpdateAccelerometerCount:(NSNumber *)accelerometerCount;
/* 传感器设备移动状态变化*/ - (void)sensoroBeacon:(SBKBeacon *)beacon didUpdateMovingState:(NSNumber *)isMoving;
2. 通过KVO方式监控传感器设备各传感器数状态
/* 定义对象SET方法 */ - (void)setBeacon:(SBKBeacon *)beacon{ if(self.beacon) { [self removeObserver]; } _beacon = beaco n; [self addObserver]; }
/* 添加观察者 */ - (void)addObserver { [self.beacon addObserver:self forKeyPath:@"rssi" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL]; ... }
/* 移除观察者 */ - (void)removeObserver { [self.beacon removeObserver:self forKeyPath:@"rssi"]; ... }
/* 监听数值变化 */ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"rssi"]){ if ([change objectForKey:@"new"] != [change objectForKey:@"old"]) { /* 处理函数 */ } } }
为保证iBeacon的正常使用,需要应用获得定位服务授权,同时开启了蓝牙服务。通过一下两种方式可分别检查应用的定位服务权限及蓝牙服务是否开启。
-(BOOL)checkLocationServices { if (!self.locationManager) { self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.desiredAccuracy=kCLLocationAccuracyBest; self.locationManager.distanceFilter=100.0f; } BOOL enable=[CLLocationManager locationServicesEnabled];//定位服务是否可用 int status=[CLLocationManager authorizationStatus];//是否具有定位权限 if(!enable || status<3){ if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]){ [self.locationManager requestAlwaysAuthorization];//请求权限 } return NO;//需求请求定位权限 } return YES; }
-(BOOL)checkBluetoothServices { if (!self.CM) { self.CM = [[CBCentralManager alloc]initWithDelegate:self queue:nil]; } if (self.CM.state == CBCentralManagerStatePoweredOff) { return NO; } else if(self.CM.state == CBCentralManagerStatePoweredOn){ return YES; } return YES; }
在iOS8以前的系统中,当您使用定位服务时,自动提示用户进行授权。在iOS8中,Apple对授权策略进行了更新,需要明确的调用函数请求用户授权。相应的SDK中也提供了相应的替代函数。
首先需要设定提示文字,在调用函数时,如果用户还未授权给App,系统会把此提示文字显示给用户的信息。 在Info.plist中添加如下的Key:
NSLocationAlwaysUsageDescription
同时设定相应的文字说明,如果不添加此提示文字则调用此函数没有效果。 其次调用授权函数
[[SBKBeaconManager sharedInstance] requestAlwaysAuthorization];
首先需要设定提示文字,在调用函数时,如果用户还未授权给App,系统会把此提示文字显示给用户的信息。 在Info.plist中添加如下的Key:
NSLocationWhenInUseUsageDescription
同时设定相应的文字说明,如果不添加此提示文字则调用此函数没有效果。 其次调用授权函数
[[SBKBeaconManager sharedInstance] requestWhenInUseAuthorization];
这两个函数的详细信息及区别参考如何获取定位服务授权。
iBeacon实现的推送原理几种:
这里给出本地推送的参考代码。
1. 通过Notification监测传感器进出,调用beacon:方法。 [[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(beacon:)name:SBKBeaconInRangeStatusUpdatedNotificationobject:nil];2. 当有传感器进出时,调用此方法产生本地推送。 - (void)beacon:(NSNotification *)notification {/*获取SBKBeacon对象*/ SBKBeacon *beacon = notification.object;/*判断应用是否在后台*/ if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground){/*判断是进入还是离开*/ if (beacon.inRange) { /*本地推送*/ UILocalNotification *notification = [[UILocalNotification alloc] init]; NSString * message = @"进入"; notification.alertBody = message; [[UIApplication sharedApplication] scheduleLocalNotification:notification]; } else{ UILocalNotification *notification = [[UILocalNotification alloc] init]; NSString * message = @"离开"; notification.alertBody = message; [[UIApplication sharedApplication] scheduleLocalNotification:notification]; } } }
iBeacon 协议的一个核心功能就是当 iDevice 遇到一个特定的 Beacon 时,可以将特定的应用唤醒。 首先您需要声明您的应用的后台运行模式,在 Xcode 进行勾选:
或者,也可以直接在 Info.plist 中添加:
UIBackgroundModes bluetooth-central location
最后,在配置 SBKBeaconManager 检测时,将 wakeUpApplication 参数设置为 YES,即
SBKBeaconID *beaconID = [SBKBeaconID beaconIDWithProximityUUID:SBKSensoroDefaultProximityUUID]; [[SBKBeaconManager sharedInstance] startRangingBeaconsWithID:beaconID wakeUpApplication:YES];
至此,您已完成将 SDK 整合进您项目之中的全部工作。后面,您可以使用 SDK 的功能来完成您 App 与 Beacon 之间的互动,更多技术细节,请参考完整的SDK文档,以及我们的Demo 程序源代码 。
欢迎使用云子/标签,本质上它们是一种带有 iBeacon 功能的无线智能传感器设备。
目前我们的 Android SDK,主要提供以下功能:
您可以从下面的地址下载最新版的 Android SDK:下载地址
集成 SDK jar 包
在工程根目录新建 libs 文件夹,将下载的 SDK 解压到到该文件夹中。
下面是 SDK 所包含的模块:
修改 AndroidManifest.xml
<manifest> ... <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> ... </manifest>
<manifest> ... <application> ... <service android:name="com.sensoro.beacon.kit.BeaconProcessService"/> <service android:name="com.sensoro.beacon.kit.BeaconService"/> <service android:name="com.sensoro.beacon.kit.IntentProcessorService"/> ... </application> ... </manifest>
首先你需要初始化一个SDK的实例,并设置是否上传传感器数据(电池电量、UMM)等,然后启动扫描服务。以下为 SDK启动的样例代码。
SensoroManager sensoroManager = SensoroManager.getInstance(context); /** * 检查蓝牙是否开启 **/ if (sensoroManager.isBluetoothEnabled()) { /** * 设置启用云服务 (上传传感器数据,如电量、UMM等)。如果不设置,默认为关闭状态。 **/ sensoroManager.setCloudServiceEnable(true); /** * 启动 SDK 服务 **/ try { sensoroManager.startService(); } catch (Exception e) { e.printStackTrace(); // 捕获异常信息 } }
提示:
如果 Android 设备的蓝牙没有打开,请使用下面样例代码请求打开蓝牙:
Intent bluetoothIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(bluetoothIntent, REQUEST_ENABLE_BT);
你可以通过实现并设置 BeaconManagerListener 接口,来检测 Beacon 的出现,显示以及更新。样例代码如下:
BeaconManagerListener beaconManagerListener = new BeaconManagerListener() { @Override public void onUpdateBeacon(ArrayListbeacons) { // 传感器信息更新 } @Override public void onNewBeacon(Beacon beacon) { // 发现一个新的传感器 } @Override public void onGoneBeacon(Beacon beacon) { // 一个传感器消失 } }; sensoroManager.setBeaconManagerListener(beaconManagerListener);
在这个接口中,传感器信息更新频率为 1 秒;发现一个新的传感器后,如果在 8 秒内没有再次扫描到这个设备,则会回调传感器消失。
提示:
请在 SDK 启动之前设置。
通常我们进入或离开某些设备时需要进行一些操作。下面是判断是否进入和离开 SN 为"0117C5456A36"的云子的样例代码:
BeaconManagerListener beaconManagerListener = new BeaconManagerListener() { @Override public void onUpdateBeacon(ArrayListbeacons) { // 传感器信息更新 } @Override public void onNewBeacon(Beacon beacon) { if (beacon.getSerialNumber().equals("0117C5456A36")){ // 进入 SN 为"0117C5456A36 的云子 } } @Override public void onGoneBeacon(Beacon beacon) { if (beacon.getSerialNumber().equals("0117C5456A36")){ // 离开 SN 为"0117C5456A36 的云子 } } }; sensoroManager.setBeaconManagerListener(beaconManagerListener);
提示:
回调函数是在非 UI 线程中运行的,请不要在回调函数中进行任何 UI 的相关相关操作,否则会导致 SDK 运行异常。如有需要,请通过 Handler 或者 Activity.runOnUiThread 方式来运行你的代码。
下表为云子传感器中常用的重要参数列表。
属性 | 描述 |
---|---|
serialNumber | SN,设备唯一标识 |
major | iBeacon协议中的 major 信息 |
proximityUUID | iBeacon协议中的 UUID 信息 |
rssi | 信号强度 |
accuracy | 距离(米) |
proximity | 范围(很远,附近,很近,未知) |
temperature | 芯片温度 |
light | 光线 |
movingState | 移动状态 |
accelerometerCount | 移动计数器 |
batteryLevel | 电池电量 |
hardwareModelName | 硬件版本 |
firmwareVersion | 固件版本 |
measuredPower | 1 米处测量 rssi |
transmitPower | 广播功率 |
advertisingInterval | 广播间隔 |
应用程序通常会在传感器数据状态发生变化时进行一些操作,如信号强度变化,光线变化,移动状态变化,计数器数值变化。你可以通过遍历传感器更新列表,找到你关心的设备,查看其状态是否有变化。下面是判断 SN 为"0117C5456A36"的云子,运动状态是否有变化的样例代码:
BeaconManagerListener beaconManagerListener = new BeaconManagerListener() { @Override public void onUpdateBeacon(final ArrayListbeacons) { // 检查串码为"0117C5456A36"的云子,运动状态是否有变化 for(Beacon beacon:beacons){ if (beacon.getSerialNumber().equals("0117C5456A36")){ if (beacon.getMovingState() == Beacon.MovingState.DISABLED){ // 运动传感器禁用 } else if (beacon.getMovingState() == Beacon.MovingState.STILL){ // 传感器静止 } else if (beacon.getMovingState() == Beacon.MovingState.MOVING){ // 传感器正在运动 } } } } @Override public void onNewBeacon(Beacon beacon) { // 发现一个新的传感器 } @Override public void onGoneBeacon(Beacon beacon) { // 一个传感器消失 } };
提示:
回调函数是在非 UI 线程中运行的,请不要在回调函数中进行任何 UI 的相关相关操作,否则会导致 SDK 运行异常。如有需要,请通过 Handler 或者 Activity.runOnUiThread 方式来运行你的代码。
你可以为你的云子开启防蹭用功能,使其变成你的专有设备,防止第三方人员查看和使用。使用防蹭用功能需要一个密钥,在 SENSORO 云平台 中注册后,你可以申请这个密钥,然后将其设置到 SDK 中。样例代码如下:
/** * 设置云子防蹭用密钥 (如果没有可以不设置) **/ sensoroManager.addBroadcastKey("01Y2GLh1yw3+6Aq0RsnOQ8xNvXTnDUTTLE937Yedd/DnkHESUpvQ7YvLucs9YfwGR5R/jwW8Rqp9XtGbmwbKXzXQ==");
提示:
至此,您已完成将 SDK 整合进您项目之中的全部工作。后面,您可以使用 SDK 的功能来完成您 App 与 云子传感器 之间的互动,更多技术细节,请参考完整的 SDK 文档 ,以及我们的 示例应用程序源代码 。
REST API 可以让您用任何可以发送 HTTP 请求的设备来与 SENSORO云平台进行交互。
基础介绍
URL | HTTP | 功能 |
---|---|---|
/sessions | POST | 邮箱密码验证 |
POST /sessions
参数
名称 | 类型 | 描述 | 必填 |
---|---|---|---|
String | 电子邮箱 | 是 | |
password | String | 密码 | 是 |
例子
curl -X POST \ -H "Content-Type: application/json" \
-d '{"email":"user1@sensoro.com","password":"123456"}' \
https://cloud-api.sensoro.com/sessions/
返回值
Status: 200 OK
URL | HTTP | 功能 |
---|---|---|
/users/me/beacons | GET | 云子列表 |
/users/me/beacons | POST | 添加云子 |
/users/me/beacons/:sn | DELETE | 删除云子 |
/users/me/beacons/:sn | PUT | 设置云子标签 |
GET /users/me/beacons
例子
curl -u user1@sensoro.com:123456 \
-X GET \
-H "Content-Type: application/json" \
https://cloud-api.sensoro.com/users/me/beacons
返回值
Status: 200 OK
POST /users/me/beacons
参数
名称 | 类型 | 描述 | 必填 |
---|---|---|---|
mac | String | mac地址(SN) | 是 |
token | String | 验证密钥 | 是 |
例子
curl -u user1@sensoro.com:123456 \
-X POST \
-H "Content-Type: application/json" \
-d '{"mac":"0117C5486322","token":"KfTNYy9tRzyOwNUG"}' \
https://cloud-api.sensoro.com/users/me/beacons
返回值
Status: 200 OK
{
"UMM": "63EA09C2-5345-4E6D-9776-26B9C6FC126C|2D03|00C3",
"mac": "0117C5486322",
"updatedTime": 1418269545245,
"users": [
{
"user": "53d5c846f3e54d2f4d42af8b",
"createdTime": "2014-12-11T03:53:40.120Z"
}
],
"createTime": "2014-09-19T06:03:48.552Z",
"lonlat": [
116.475426,
39.993717
],
"sensor": {
"accelerometer": 0,
"light": 153.36,
"power": 71,
"temperature": 19
}
}
DELETE /users/me/beacons/:sn
例子
curl -u user1@sensoro.com:123456 \
-X DELETE \
-H "Content-Type: application/json" \
https://cloud-api.sensoro.com/users/me/beacons/0117C5486322
返回值
Status: 200 OK
PUT /users/me/beacons/:sn
参数
名称 | 类型 | 描述 | 必填 |
---|---|---|---|
tags | Array | 标签数组 | 是 |
例子
curl -u user1@sensoro.com:123456 \
-X PUT \
-H "Content-Type: application/json" \
-d '{"tags":["Beijing","WJ","SOHO","2807"]}' \
https://cloud-api.sensoro.com/users/me/beacons/0117C5486322
返回值
Status: 200 OK
URL | HTTP | 功能 |
---|---|---|
/users/me/beacons/logs | GET | 云子记录 |
GET /users/me/beacons/logs
参数
名称 | 类型 | 描述 | 必填 |
---|---|---|---|
type | Int | 来源类型: 0: 所有用户上传的数据 1: 自己上传的数据 2: 自己巡检人员上传的数据 | 否 |
timestamp | String | 时间戳 | 否 |
mac | String | mac地址(SN) | 否 |
page | Int | 页码,默认0 | 否 |
count | Int | 返回数量,默认100 | 否 |
例子
curl -u user1@sensoro.com:123456 \
-X GET \
-H "Content-Type: application/json" \
https://cloud-api.sensoro.com/users/me/beacons/logs?mac=0117C5486322×tamp=1418279942
返回值
Status: 200 OK
[
{
"beaconMac": "0117C5486322",
"beaconUMM": "63EA09C2-5345-4E6D-9776-26B9C6FC126C|2D03|00C3",
"__v": 0,
"updatedTime": 1418281671108,
"location": {
"lat": 39.99475475859843,
"lon": 116.4750352755154
},
"sensor": {
"temperature": 19,
"light": 22.14,
"power": 71,
"accelerometer": 0
}
}
]
URL | HTTP | 功能 |
---|---|---|
/maps/:key | GET | 指定部署图的数据 |
GET /maps/:key
参数
名称 | 类型 | 描述 | 必填 |
---|---|---|---|
key | String | 地图ID | 是 |
例子
curl -u user1@sensoro.com:123456 \
-X GET \
-H "Content-Type: application/json" \
https://cloud-api.sensoro.com/maps/aNJGbkSj
返回值
Status: 200 OK
{
"__v": 1,
"address": "Beijing WJ SOHO",
"description": "",
"floor": "F1",
"imageURL": "http://sensoro-maps.qiniudn.com/819a02a0d5b9a21e9ca8d186666280c1.png",
"key": "aNJGbkSj",
"name": "MapOne",
"user": "53d5c846f3e54d2f4d42af8b",
"createdTime": 1418280779158,
"beacons": [
{
"mac": "0117C5486322",
"PosX": 0.6781768,
"PosY": 0.40375,
"label": "",
"title": "",
"updatedTime": "2014-12-11T06:53:32.197Z",
"id": "54893f6c0c1bc56f4ecb9fde"
}
],
"tags": [],
"yScale": 1,
"xScale": 1,
"id": "54893f4b0c1bc56f4ecb9fdd"
}
由于 iBeacon 协议的开放性,iBeacon 设备很容易被“蹭用”,也可以通过加入一些干扰 iBeacon 来破坏现有的系统。为了解决以上问题,我们推出了自己的私有协议。
iBeacon 安全性较差的主要是:
为了解决这两个问题,我们定义了私有协议:
每个硬件设备可以设置一个私有协议的广播密钥,如:01Y2GLh1yw3+6Aq0RsnOQ8xNvXTnDUTTLE937Yedd/DnkHESUpvQ7YvLucs9YfwGR5R/jwW8Rqp9XtGbmwbKXzXQ==。广播内容会根据广播密钥进行加密,在广播包中会给出密钥的摘要。 在SDK中,设定同样的广播密钥,在接收到广播包后利用广播密钥进行解密。通过这样的对称加密,我们可以实现: 1. 加密:防着他人蹭用设备。 2. 验证:防止他人伪造设备。
因为私有协议受广播包的限制,以及特定的生成逻辑,目前我们的私有协议密钥需要邮件申请。
邮箱地址:service@sensoro.com 申请通过后,我们会邮件通知您。
在开启私有协议后,对应的配套工具中也需要设置对应的广播密钥才能搜索到加密广播的云子。
配套工具包括:
“云子”示例应用,是一款帮助开发者体验云子传感器功能的手机客户端。目前支持iPhone版,你可以在我们的Github上找到对应的项目源码。
“云子”,基于SDK(Sensoro Beacon Kit)开发,需要在Xcode 6、iOS 8版本SDK下编译运行,支持iOS 7.0及以上版本。
显示周围云子的SN与ID,SN与ID和云子传感器对应的贴纸一致,可以通过搜索的方式找到指定的云子。
因为云子是一款基于iBeacon的智能传感器,所以需要使用iBeacon对应所需的系统权限,包括定位服务,和系统蓝牙。
“云子”的功能主要涵盖:
(1)iBeacon的RSSI值(信号强度),accuracy(距离),proximity(范围)。 (2)传感器:温度,光线,加速度传感器。 (3)利用云子可实现的功能及场景:距离、范围、光线、温度、移动、推送等。
当距云子的距离发生变化,页面会显示使用者距离云子的距离。
当距云子的距离发生变化,使用者所处的位置可能会发生变化。每个云子定义了四种范围状态“很近”、“较近”、“较远”、“未知”。
将云子的光线传感器开启,中心颜色会随着光线变化而变化。
将云子的温度传感器开启,云子芯片温度变化,页面背景会随着温度变化而变化。
将云子的加速度传感器开启,当云子移动时,地球会转动;当云子停止移动时,计数器会加1。
当进入或者离开云子传感器时,依据传感器可将“云子”应用唤醒。“云子”应用会根据传感器的配置,判断是否需要生成一个推送提示。
配置工具是提供给开发者来查看和修改云子参数的手机客户端,支持 iPhone 和 Android。
打开云子配置工具,首先能看到的是附近的云子列表。每个云子信息不仅包括 Major、Minor 等基本信息,还有一个以动画形式展现的 RSSI 强度,针对3.x的固件版本的硬件可以显示提供功率和频率。
如下图所示:
您还可以根据SN、UMM、型号、固件版本等进行搜索,或者扫描云子附带的二维码,快速找到相应的云子。
1.点击列表中的云子条目可以进入云子详情页面。每个云子都包含温度、光线以及加速度传感器数据等。所有传感器数据都以图示的方式实时展现,可以极为直观地全面了解一个云子的工作状态。
2.云子配置工具提供了实时 RSSI 折线图,使得开发者能够精确地了解到云子的信号变化状态,如下图所示:
云子,作为一款iBeacon智能传感器主要提供的配置功能主要分5部分:
iBeacon为Apple提出的标准功能,符合Apple 标准的iBeacon协议。包括iBeacon功能的开关、UUID、Major、Minor的设置。
云子会以一定功率和频率向外广播数据,广播的内容根据各功能的开关情况而定,包括iBeacon与传感器数据。在这部分可以设置云子的广播功率、频率。功率越高则覆盖范围越大,反之覆盖范围越小。频率越高时,云子更易被发现,数据状态更新也会更快。当云子的广播功率、频率较高时,如何100ms+8dBm时电池消耗速度会比较快。
云子除了标准的iBeacon功能外,还集成了温度、光线、加速度等多种传感器。这部分配置可以控制传感器的开关,还可对加速度计数器进行清零操作。
云子的iBeacon功能为Apple的标准协议,但iBeacon协议还存在着一些问题。例如部署好一套系统后,可以除了部署方可以使用,其他开发者也可以在未授权的情况下使用。同时iBeacon协议的防攻击功能比较弱,如果部署好一套100枚设备组成的系统,破坏者可以通过复制一些同样的设备放在部署环境中对已构建的系统造成破坏。
为了解决这个问题,我们可以通过设定密钥启动SENSORO私有协议来实现(需要3.x以上固件)。密钥数量有限,需要通过SENSORO云平台进行申请
。
每个云子可以设定一个唯一密码。设定密码后,如果需要修改云子则必须提供密码。 密码不可找回,请牢记密码。
扫码下载配置工具等更多App
“巡检工具” 应用,是一款帮助开发者轻松实现云子部署及管理的工具。开发者可以通过扫描云子对应的二维码来将云子填入到自己的账户下。
使用邮箱和密码登录,账号为云平台统一登录账号(http://cloud.sensoro.com)
通过扫描云子附带的二维码,巡检工具将自动读取二维码中的信息进行添加操作。
通过巡检工具和云平台,开发者可以对账号下的云子设置若干标签以标注部署位置。通过长按列表,弹出提示可进入标签管理。
支持通过SN、ID、标签来搜索云子。
当开启巡检时,巡检工具将会自动查找附近的云子,获取其传感器数据并将数据上传至云端。
执行这项操作可以清空本地的巡检数据,重新记录云子的巡检状态。
页面上方有状态栏,这里将显示账号中云子相关状态。包括账号下总计多少颗云子、已经巡检到多少颗云子、还有多少颗未巡检到、已经上传多少颗云子的数据。
可以在云平台端查看云子的传感器数据、电量状态等,并管理自己信任的巡检人员,查看他们的巡检记录。http://cloud.sensoro.com/
扫码下载更多App
部署工具是提供给开发者解决部署问题的手机客户端,目前仅支持 iPhone 。
在部署的过程,我们需要对设备设定统一的UUID、功率、频率以及密码等。我们将需要修改的项设为新的值,其余项设置为"不设置"。
如下图所示:
目前我们有两种添加方式:
1.通过扫描二维码添加
2.通过蓝牙扫描附近设备添加
当周围的设备均被设置完成后,可以移动到下一个位置配置那些不在范围内的设备。
配置状态:
扫码下载更多App
SENSORO云平台是一套针对云子传感器部署管理的专业云服务。开发者可以通过云平台,以及相关联的巡检工具,批量部署工具,相关SDK轻松实现对传感器设备的管理,监控。主要功能有如下几部分:
使用邮箱和密码登录/注册。
如下图所示:
展示账号下所有云子的状态,可以在这里添加/删除云子、搜索云子、对云子贴标签进行分类管理。您可以通过 REST-API 中的云子列表接口将账号下数据导出。
显示云子设备的型号、序列号(SN)、UMM(UUID+Major+Minor)、部署位置坐标、电池电量、光线、温度、移动次数、数据更新时间以及云子标签。
支持通过型号、SN与UMM的模糊搜索。
添加云子,需要云子的SN以及该SN对应的唯一Token。
您可以在云子设备的二维码中读取到SN与Token,同时我们在巡检工具
中提供扫码直接添加的功能。
每个云子都可以设置若干个标签,比如我将一颗云子放在北京望京SOHO办公室的冰箱里。
我可以对云子添加望京SOHO办公室
、冰箱
等标签,以此来实现对云子的归类管理。
显示单个云子目前的状态,以及历史的数据记录。
巡检记录会显示账号利用巡检工具巡检时,每一天发现多少云子设备。这个功能亦可用于商业地产定点巡逻。
部署图是在大规模部署时,记录云子实际部署位置的工具。
显示所有添加过的部署图,包含一些部署的基本信息以及部署图上云子的数量。
- 显示一张部署图上的所有云子位置。
- 同时我们提供了REST API中的部署图接口,您可以通过请求该接口拿到部署图的相关信息。
- 主要功能有:
添加部署点:可通过双击来添加新的部署点。
管理部署点:单击可对之前的部署点进行管理。
修改部署点:可通过拖动的方式修改部署点的位置。
创建应用后,即可获得应用Key与Secret,你可能会在部分REST API与SDK中会使用到它们。