源码路径:hardware/libhardware/include/hardware/gps.h
gps.h定义了各种常量和信息,包括定位模式、状态等,并同时给JNI层调用的接口。对于GPS的具体实现,需要跟具体的GPS驱动来定,因为某些GPS设备能直接输出所需要的NMEA数据,有的则需要自己实现解析才能得到。
typedef struct {
// set to sizeof(GpsLocation) */
size_t size;
//标志位. */
uint16_t flags;
//维度
double latitude;
//经度
double longitude;
//以WSG 84坐标系统表示高度信息
double altitude;
//速度
float speed;
//方向
float bearing;
//精确度
float accuracy;
//时间戳
GpsUtcTime timestamp;
} GpsLocation;
GpsLocation用于表示GPS的定位信息.
typedef struct {
size_t size;
GpsStatusValue status;
} GpsStatus;
GpsStatus表示状态信息
typedef struct {
/** set to sizeof(GpsSvInfo) */
size_t size;
/**伪差分 */
int prn;
/**信噪比 */
float snr;
/**海拔 */
float elevation;
/**方向 */
float azimuth;
} GpsSvInfo;
GpsSvInfo表示卫星信息
typedef struct {
/** set to sizeof(GpsSvStatus) */
size_t size;
int num_svs;
GpsSvInfo sv_list[GPS_MAX_SVS];
uint32_t ephemeris_mask;
uint32_t almanac_mask;
uint32_t used_in_fix_mask;
} GpsSvStatus;
typedef struct {
//
size_t size;
//初始化GPS时设置回调函数的结构体GpsCallbacks
int (*init)( GpsCallbacks* callbacks );
//开始导航
int (*start)( void );
//停止导航
int (*stop)( void );
//关闭接口
void (*cleanup)( void );
//置入当前时间
int (*inject_time)(GpsUtcTime time, int64_t timeReference,int uncertainty);
//置入位置信息
int (*inject_location)(double latitude, double longitude, float accuracy);
//删除帮助数据
void (*delete_aiding_data)(GpsAidingData flags);
//设置位置模式
int (*set_position_mode)(GpsPositionMode mode, GpsPositionRecurrence recurrence,uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time);
//得到扩展信息指针
const void* (*get_extension)(const char* name);
} GpsInterface;
typedef void (* gps_location_callback)(GpsLocation* location);
typedef void (* gps_status_callback)(GpsStatus* status);
typedef void (* gps_sv_status_callback)(GpsSvStatus* sv_info);
typedef void (* gps_nmea_callback)(GpsUtcTime timestamp, const char* nmea, int length);
typedef void (* gps_set_capabilities)(uint32_t capabilities);
typedef void (* gps_acquire_wakelock)();
typedef void (* gps_release_wakelock)();
typedef void (* gps_request_utc_time)();
typedef pthread_t (* gps_create_thread)(const char* name, void (*start)(void *), void* arg);
typedef struct {
size_t size;
gps_location_callback location_cb;
gps_status_callback status_cb;
gps_sv_status_callback sv_status_cb;
gps_nmea_callback nmea_cb;
gps_set_capabilities set_capabilities_cb;
gps_acquire_wakelock acquire_wakelock_cb;
gps_release_wakelock release_wakelock_cb;
gps_create_thread create_thread_cb;
gps_request_utc_time request_utc_time_cb;
} GpsCallbacks;
Init函数会注册这些回调函数,当触发某个状态时可以通过该回调函数像JNI层相应函数,JNI在回调到java层,完成数据的回调通知。
typedef void (* gps_xtra_download_request)();
typedef pthread_t (* gps_create_thread)(const char* name, void (*start)(void *), void* arg);
typedef struct {
gps_xtra_download_request download_request_cb;
gps_create_thread create_thread_cb;
} GpsXtraCallbacks;
typedef struct {
size_t size;
int (*init)( GpsXtraCallbacks* callbacks );
//植入XTRA数据到GPS
int (*inject_xtra_data)( char* data, int length );
} GpsXtraInterface;
inject_xtra_data函通过网络下载的Xtra数据植入GPS中,同样在init函数中设置回调结构体GpsXtraCallbacks,作为下载Xtra数据的会的回调函数。
struct gps_device_t {
struct hw_device_t common;
//获取Gps硬件接口
const GpsInterface* (*get_gps_interface)(struct gps_device_t* dev);
};
实现get_gps_interface方法在gps.c中,去实现查找具体的硬件接口,如果设备没有GPS硬件,可以模拟GPS接口,这样应用程序就不会因为没有硬件支持而挂掉。
源码路径:/hardware/interfaces/gnss
/**
* 卫星信息
*/
@export(name="", value_prefix="GNSS_CONSTELLATION_")
enum GnssConstellationType : uint8_t {
UNKNOWN = 0,
GPS = 1,
SBAS = 2,
GLONASS = 3,
QZSS = 4,
BEIDOU = 5,
GALILEO = 6,
};
针对各种的导航卫星.
/** Represents a location. */
struct GnssLocation {
/** Contains GnssLocationFlags bits. */
bitfield<GnssLocationFlags> gnssLocationFlags;
/** Represents latitude in degrees. */
double latitudeDegrees;
/** Represents longitude in degrees. */
double longitudeDegrees;
/**
* Represents altitude in meters above the WGS 84 reference ellipsoid.
*/
double altitudeMeters;
/** Represents speed in meters per second. */
float speedMetersPerSec;
/** Represents heading in degrees. */
float bearingDegrees;
/**
* Represents expected horizontal position accuracy, radial, in meters
* (68% confidence).
*/
float horizontalAccuracyMeters;
/**
* Represents expected vertical position accuracy in meters
* (68% confidence).
*/
float verticalAccuracyMeters;
/**
* Represents expected speed accuracy in meter per seconds
* (68% confidence).
*/
float speedAccuracyMetersPerSecond;
/**
* Represents expected bearing accuracy in degrees
* (68% confidence).
*/
float bearingAccuracyDegrees;
/** Timestamp for the location fix. */
GnssUtcTime timestamp;
};
返回到jni层的gps位置信息.