远程传感服务概述

远程传感服务是构建在互联(uniconnect)服务和传感(smartsense)服务之上的跨机器的远程服务。该服务可将链接对端设备上的传感器信息读取到本地,目前只支持手机端读取手表端传感器信息。

传感器概述

基于Android的设备有内置的传感器,用于测量运动,方向,和各种环境条件。这些传感器能够提供原始数据并保证其精确度和高准确度。比如,一个天气应用程序可能使用设备的温度传感器和湿度传感器来计算和报告环境状态。同样,一个健康应用会通过计步传感器和心率传感器测量消耗的卡路里和当前的心率值。

IWOP平台支持的远程传感器分为三大类:

 
运动传感器:
 
这些传感器用于测量当前身体或手臂的运动状态。这类传感器包括运动传感器,手势传感器和计步传感器。
   
这些传感器用于测量身体的健康状态,目前只支持心率传感器。
 
环境传感器:
 
这些传感器用于测量各种环境参数,如空气温度、压力和湿度,光照。 这一类包括气压计,湿度计,温度计。

你可以访问对端设备上所有支持的的传感器,利用IWOP远程传感器服务获取传感器原始数据。传感器服务提供了一些类和接口,帮助你执行各种各样的传感器相关的任务。例如,你可以使用的传感器服务进行如下操作:

  • 确定远端设备上存在某种传感器。
  • 监听远端设备上传感器的变化。

远程传感器介绍

远端传感器支持列表

IWOP远程传感服务目前支持以下传感器:

 
心率传感器,测量心率:
 
Android:TYPE_HEART_RATE
 
iOS:IWDSSensorTypeHeartRate
 
手势传感器,测量当前手的状态(抬手/摇手等):
 
Android:TYPE_GESTURE
 
iOS:IWDSSensorTypeGesture
 
运动传感器,测量身体运动姿态(跑步/骑行等):
 
Andriod:TYPE_MOTION
 
iOS:IWDSSensorTypeMotion
 
计步传感器,测量步数:
 
Android:TYPE_STEP_COUNTER
 
iOS:IWDSSensorTypeStepCounter
 
环境湿度传感器,测量环境湿度:
 
Android:TYPE_RELATIVE_HUMIDITY
 
iOS:IWDSSensorTypeRelativeHumidity
 
环境温度传感器,测量环境温度:
 
Android:TYPE_AMBIENT_TEMPERATURE
 
iOS:IWDSSensorTypeAmbientTemperature
 
气压传感器,测量环境大气压:
 
Android:TYPE_PRESSURE
 
iOS:IWDSSensorTypePressure

远程传感服务框架

你可以访问以上的传感器通过IWOP远程传感服务框架吗,Android端服务在com.ingenic.iwds.smartsense包中;iOS端没有服务,直接调用接口。其中包含了以下的类和接口:

 
Android:RemoteSensorServiceManager
 
iOS:IWDSRemoteSensorManager
 
你可以使用这个类获取远端设备上不同类型传感器的实例。这个类提供了访问远程传感器的方法,注册和注销远程传感器事件监听器。这个类还提供了手势和运动传感器的常量,用于对比对应远程传感器上报的数据。
 
Android:RemoteSensorListener
 
iOS:IWDSRemoteSensorDelegate
 
对端传感器服务监听器,用户监听对端设备传感服务是否可用,该结果直接决定本地是都能获取远端传感器信息。
 
Sensor:
 
传感器的实例,这个类提供了一些方法可以用来确定传感器的信息。
 
SensorEvent:
 
服务使用这个类创建一个传感器的事件对象,它提供了一个传感器的数据,类型,数据的准确性。
 
Android:SensorEventListener
 
iOS:IWDSRemoteSensorEventDelegate
 
传感器事件监听器,可以监听两种事件,传感器数值变化和传感器精度变化。

访问对端设备传感器

IWOP远程传感器服务框架可以让你很容易的在运行时获取对端设备传感器以及所支持的传感器列表。

为了访问对端设备传感器,Android端首先需要连接远程传感器服务,iOS端没有服务。你需要先先实例化ServiceClient并传递SERVICE_REMOTE_SENSOR作为参数。例如:


private ServiceClient mClient = new ServiceClient(this,ServiceManagerContext.SREVICE_REMOTE_SENSOR); 
...
mClient.connect();

然后,Android端在服务连接之后必须注册远端设备传感服务监听器并等待远端服务可用,iOS端可直接获得IWDSRemoteSensorManager实例,之后你可以获取远端设备传感器以及传感器列表:


ANDROID CODE:

private RemoteSensorServiceManager mService;
...
public void onConnected() {
    mService = (RemoteSensorServiceManager) mClient.getServiceManagerContext();
    mService.registerRemoteListener(mRemoteListener);
}

private RemoteSensorListener mRemoteListener = new RemoteSensorListener(){
    @Override
    public void onSensorAvailable(ArrayList<Sensor> sensorList) {
        if (sesorList != null) {
            // Remote sensor available
            // Here you can get default sensor
            mSensor = mService.getDefaultSensor(Sensor.TYPE_HEART_RATE);
            if (mSensor != null) {
                // Success! There's a heart rate sensor.
            } else {
                // Failure! No heart rate sensor.
            }
        } else {
            // Remote sensor unavailable
        }
    }
};

IOS CODE:

@interface RemoteSensorDelegate : NSObject <IWDSRemoteSensorDelegate>
@end

@implementation RemoteSensorDelegate

- (void)sensorAvailabled:(NSArray *)sensors
{
    if (sensors)
    {
        // Remote sensor available
        // Here you can get default sensor
        _sensor = [manager defaultSensor:IWDSSensorTypeHeartRate];
        if (_sensor)
        {
            // Success! There's a heart rate sensor.
        }
        else
        {
            // Failure! No heart rate sensor.
        }
    }
}

@end

IWDSRemoteSensorManager *manager = [IWDSRemoteSensorManager shareInstance];
[manager startTransaction];
[manager addDelegate:uuid delegate:[RemoteSensorDelegate new]];

监听传感器事件

以下说明基于Andoird端:

为了监听远端设备传感器数据你需要SersorEventListener监听器中的事件两个回调方法:onSensorChanged()和onAccuracyChanged()。传感器服务将会回调这两个方法当:

 
传感器精度变化:
 
这种情况下将调用onAccuracyChanged()方法,现在只支持心率传感器的精度变化处理。
 
目前心率传感器的上报精度值有两种,分别为ACCURACY_HEART_RATE_UNAVALIABLE和ACCURACY_HEART_RATE_AVALIABLE。 这两种分别描述了心率传感器的工作状态。
 
当上报精度为ACCURACY_HEART_RATE_UNAVALIABLE时,表示心率传感器工作状态不正常,有可能是心率没有正常接触人体皮肤,或者手表佩戴不适导致测量心率超时。当上报精度为ACCURACY_HEART_RATE_AVALIABLE时,表示心率传感器工作状态正常,手表佩戴良好,心率测量数据即将上报(通常会在1~5s内上报心率数据)。
 
传感器数据变化:
 
这种情况下将调用onSensorChanged()方法,SensorEvent作为参数传进来,SensorEvent包含了新传感器数据以及事件产生时的时间戳。

以上类、方法和变量iOS端的对应关系为:

 
类:
 
SersorEventListener对应IWDSRemoteSensorEventDelegate。
 
方法:
 
onAccuracyChanged对应accuracyChanged。
 
onSensorChanged对应sensorChanged。
 
变量:
 
ACCURACY_HEART_RATE_UNAVALIABLE对应IWDSSensorAccuracyHeartRateUnavaliable。
 
ACCURACY_HEART_RATE_AVALIABLE对应IWDSSensorAccuracyHeartRateAvaliable。

以下是典型用法:


ANDROID CODE:

public class RemoteSensorActivity implements ConnectionCallbacks,
        SensorEventListener {
    private RemoteSensorServiceManager mService;
    private ServiceClient mClient;
    private Sensor mSensor;

    @Override
    public final void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mClient = new ServiceClient(this,
                ServiceManagerContext.SERVICE_REMOTE_SENSOR, this);
    }

    @Override
    public void onConnected() {
        mService = (RemoteSensorServiceManager) mClient.getServiceManagerContext();
        mService.registerRemoteListener(mRemoteListener);
    }

    @Override
    public void onDisconnected(boolean unexpected) {
        mService.unregisterRemoteListener(mRemoteListener);
        mService.unregisterListener(mListener, mSensor);
    }

    private RemoteSensorListener mRemoteListener = new RemoteSensorListener() {
        @Override
        public void onSensorAvailable(ArrayList sensorList) {
            if (sesorList != null) {
                // Remote sensor available
                mSensor = mService.getDefaultSensor(Sensor.TYPE_HEART_RATE);
                mService.registerListener(this, mSensor,
                        RemoteSensorServiceManager.SENSOR_DELAY_NORMAL);
            } else {
                // Remote sensor unavailable
            }
        }
    };

    @Override
    public final void onAccuracyChanged(Sensor sensor, int accuracy) {
        // Do something here if sensor accuracy changes.
    }

    @Override
    public final void onSensorChanged(SensorEvent event) {
        float heartRate = event.values[0];
        // Do something with this sensor value.
    }

    @Override
    protected void onResume() {
        super.onResume();
        mClient.connect();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mClient.disconnect();
    }
}

IOS CODE:

@interface RemoteSensorVC : UIViewController <IWDSRemoteSensorDelegate, IWDSRemoteSensorEventDelegate>
@property (nonatomic, retain) IWDSRemoteSensorManager *manager;
@property (nonatomic, retain) Sensor *sensor;
@end

@implementation RemoteSensorVC

- (void)viewDidLoad
{
    _manager = [IWDSRemoteSensorManager shareInstance];
    [_manager addDelegate:uuid delegate:self];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [_manager startTransaction];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [_manager stopTransaction];
    [super viewDidDisappear:animated];
}

- (void)sensorAvailabled:(NSArray *)sensors
{
    if (sensors)
    {
        // Remote sensor available
        // Here you can get default sensor
        _sensor = [manager defaultSensor:IWDSSensorTypeHeartRate];
        [_manager registerDelegate:uuid delegate:self sensor:_sensor rate:0];
    }
    else
    {
        // Remote sensor unavailable
    }
}

- (void)accuracyChanged:(Sensor *)sensor accuracy:(int)accuracy
{
    // Do something here if sensor accuracy changes.
}

- (void)sensorChanged:(SensorEvent *)event
{
    float heartRate = event.values[0];
    // Do something with this sensor value.
}

@end

以上示例中Android端使用RemoteSensorServiceManager.SENSOR_DELAY_NORMAL作为参数用来注册传感器事件监听器,但目前传感服务不支持事件延迟指定;iOS端使用0。示例中Android端在onResume()和onPause中、iOS端在iOS端在viewDidAppear和viewDidDisappear连接/断开传感服务,这样在你不需要使用远端设备传感器时及时注销监听器关闭传感器可以节省远端设备电量。示例中iOS端的uuid为用户指定。