APP下载

基于高通QSC1110平台的北斗定位方案实现

2017-01-05

湖南邮电职业技术学院学报 2016年4期
关键词:高通代码北斗

符 军

(湖南邮电职业技术学院,湖南长沙410015)

基于高通QSC1110平台的北斗定位方案实现

符 军

(湖南邮电职业技术学院,湖南长沙410015)

高通QSC1110平台具备体积小、功能稳定、功耗小、运行要求低等优势,目前广泛运用在智能家电、智能配件等产品上。QSC1110本身并不支持定位功能,为了弥补此缺陷,文章提出一种方案,通过在QSC1110芯片上外挂北斗定位芯片,同时在QSC1110的软件平台上加入北斗芯片定位数据解析代码,在QSC1110上实现定位功能。

QSC1110;brew;北斗定位

1 实现基于高通QSC1110平台的北斗定位方案的意义

目前定位已经广泛应用于生活中,常用的定位方式有卫星定位,网络定位,基站定位、Wi-Fi定位以及各定位方式的联合定位,其中卫星定位精确度最高,使用免费,且全球覆盖,因此,需要定位功能的设备基本都具备卫星定位功能,美国、中国、欧洲、俄罗斯都有自己的卫星定位系统[1],美国的GPS率先实现民用化,我国积极推广的北斗卫星定位系统也出现了很多成熟的民用产品,我们日常生活中主要使用的也是这两种卫星定位系统。

定位芯片本身并不具备复杂的数据处理能力,输出的信号是满足一定标准的,如GPS满足NMEA标准,北斗满足北斗标准,按照这些标准输出数据是一串连续的字母数字组合,我们无法直接通过这些连续的字母数字组合获得相应的位置信息,因此实际的定位产品都是定位芯片输出的数据传递给另外一个主操作系统,由主操作系统按照定位标准分析和处理定位数据,然后直接显示到相关终端上[2]。因此,选择一个体积小、功能稳定、支持定位输出接口、并且价格合理的主芯片对定位功能地广泛应用具有非常重要的意义。QSC1110芯片能够很好地满足这一要求。出于国家安全性的考虑,许多政府和信息安全部门都要求定位设备具备北斗定位功能[3]。因此,实现基于QSC1110的北斗定位方案具有十分重要的意义。

2 实现基于高通QSC1110平台的北斗定位方案需要解决的问题

首先,需要定位芯片的输出接口与QSC1110相匹配,市场上有很多成熟的北斗定位芯片,这里我们选用西博科技的CNT226定位模块,这是一款支持BD&GPS双系统联合定位功能的集成模块,支持UART接口,支持NMEA 0183协议。QSC1110是支持UART口的,定位功能模块连接图见图1所示。

图1 定位功能模块连接图

其次,需要在QSC1110的brew软件平台上增加nmea协议和北斗协议的支持。nmea协议支持有公开的库和源码,这部分可以通过移植实现;北斗协议可以在nmea源代码的基础上进行扩展来实现。

最后,需要按照brew平台的架构,增加定位驱动和定位显示应用,以及连接两者的oem层代码。

3 功能实现关键代码说明

3.1 定位数据读取和分析

首先,定位是一个持续过程并需要占系统资源的,需要在底层新建一个任务来专门处理连接北斗定位模块,在tmc_define_tasks方法中加入如下新的任务tmc_define_tasks。

rex_def_task_ext2(&bd_gps_tcb,

(unsigned char*)bd_gps_stack,

BD_GPS_STACK_SIZ*sizeof(rex_stack_word_ type),

(rex_priority_type)BD_GPS_PRI,

bd_gps_task,

0L,

"BD_GPS",

FALSE,

DOG_BD_GPS_RPT);

然后,在bd_gps_task中实现如下功能:

1)接收上层启动定位请求信号,启动定位功能,包括配置UART口,启动北斗定位模块,并启动定时上报定时器。部分关键代码如下:

if((sigs&BD_GPS_START_SIG)!=0)

{

(void)rex_clr_sigs(&bd_gps_tcb,BD_GPS_START _SIG);

bd_gps_update_info_start();

(void)rex_set_timer(&bd_gps_cmd_timer,BD_GPS _CMD_TIMER_LEN);

}

当上报定时器到达时,会将保持的解析结果上报给上层。

2)接收从UART发送过来的满足NMEA标准[4]和BD标准的定位信号,并进行解析,然后将解析的结果保存起来,下一次定位信号发送过来时,如解析结果有更新的地方,则更新到结果保存处。

if((sigs&BD_GPS_RX_SIG)!=0)

{

(void)rex_clr_sigs(&bd_gps_tcb,BD_GPS_RX_SI G);

bd_gps_sio_rx_data();

}

其中bd_gps_sio_rx_data方法的实现中,移植了nmea标准库,并在其源代码的基础上扩展了北斗标准支持。使之能够同时解析GPS和北斗信号[5][6]。下面是部分关键代码:

/**

*rief Analysis of buffer and put results to information structure

*@return Number of packets was parsed

*/

int nmea_parse(

nmeaPARSER*parser,

const char*buff,int buff_sz,

nmeaINFO*info

)

{

int ptype,nread=0;

void*pack=0;

NMEA_ASSERT(parser&&parser->buffer);

nmea_parser_push(parser,buff,buff_sz);

while(GPNON!=PACK_TYPE_GET(ptype= nmea_parser_pop(parser,&pack)))

{

nread++;

switch(PACK_TYPE_GET(ptype))

{

case GPGGA:

nmea_GPGGA2info((nmeaGPGGA*)pack,info+SYS _TYPE_GET(ptype));

break;

case GPGSA:

nmea_GPGSA2info((nmeaGPGSA*)pack,info+SYS _TYPE_GET(ptype));

break;

case GPGSV:

nmea_GPGSV2inf((nmeaGPGSV*)pack,info+SYS_T YPE_GET(ptype));

break;

case GPRMC:

nmea_GPRMC2info((nmeaGPRMC*)pack,info+SYS_TYPE_GET(ptype));

break;

case GPVTG:

nmea_GPVTG2info((nmeaGPVTG*)pack,info+SYS _TYPE_GET(ptype));

break;

//begin add by fujun for bd support

case GPGLL:

nmea_GPGLL2info((nmeaGPGLL*)pack,info+SYS _TYPE_GET(ptype));

break;

//end add by fujun for bd support };

NMEA_FREE(pack); }

return nread;

}

3)接收上层结束定位的请求信号,关闭北斗定位模块。

if((sigs&BD_GPS_STOP_SIG)!=0)

{

(void)rex_clr_sigs(&bd_gps_tcb,BD_GPS_STOP_ SIG);

(void)rex_clr_timer(&bd_gps_cmd_timer);

bd_gps_update_info_stop();

}

3.2 上层负责启动和停止定位,同时接收分析结果数据并显示[7]

1)启动定位关键代码

void BdGpsLcs_LocateStart(void*pme)

{

CBdGpsLcs*pMe=(CBdGpsLcs*)pme;

PosDetNMEAEventData eventData={0};

if(NULL==pMe)

{

return;

}

if(pMe->m_bBdgpsStarted)

{

return;

}

pMe->m_bBdgpsStarted=TRUE;

eventData.cls=AEECLSID_BDGPSLCS;

eventData.reqMask=POS_DET_NMEA_EVENT_BD GPS_INFO;

CALLBACK_Init(&pMe->m_eCbInfo,BdGpsLcs_ CallbackNotifyFunc,pMe);

IPOSDETNMEA_GetPosDetNMEAInfo(pMe->m_p PosDetNMEA,eventData,&pMe->m_ePosDetNMEAInfo,&pMe->m_eCbInfo);

}

2)停止定位关键代码

void BdGpsLcs_LocateStop(void*pme)

{

CBdGpsLcs*pMe=(CBdGpsLcs*)pme;

PosDetNMEAEventData eventData={0xFFFFFFFF};

if(NULL==pMe)

{

return;

}

if(!pMe->m_bBdgpsStarted)

{

return;

}

pMe->m_bBdgpsStarted=FALSE;

eventData.cls=AEECLSID_BDGPSLCS;

eventData.reqMask=POS_DET_NMEA_EVENT_BD GPS_INFO;

CALLBACK_Cancel(&pMe->m_eCbInfo);

IPOSDETNMEA_StopPosDetNMEAInfo(pMe->m_p PosDetNMEA,eventData);

}

3)收到更新回调函数

static void BdGpsLcs_CallbackNotifyFunc(void*pm e)

{

CBdGpsLcs*pMe=(CBdGpsLcs*)pme;

if(NULL==pMe)

{

return;

}

if(POS_DET_NMEA_EVENT_BDGPS_INFO!=pMe ->m_ePosDetNMEAInfo.responseEvent)

{

return;

}

(void)ISHELL_PostEvent(pMe->m_pShell,AEECL SID_BDGPSLCS,EVT_USER,EVT_BDGPSLCS_BDGPS_INFO,0);

}

接收到的结果保存在当前应用程序的变量m_e-PosDetNMEAInfo中,结果更新时,会调用BdGp-sLcs_CallbackNotifyFunc并发送消息给应用,应用收到后就可以更新定位的显示结果。

3.3 brew oem层实现

为了不破坏brew平台的结构,我们还需要增加oem中间层来连接底层和应用层[8][9]。oem层的部分关键代码如下:

1)接口定义部分

AEEINTERFACE(IPosDetNMEA)

{

INHERIT_IQueryInterface(IPosDetNMEA);

int(*Enable)(IPosDetNMEA*p);

int(*Disable)(IPosDetNMEA*p);

boolean(*IsEnabled)(IPosDetNMEA*p);

int(*GetPosDetNMEAInfo)(IPosDetNMEA*p,Pos-DetNMEAEventData req,AEEPosDetNMEAInfo*pPos-DetNMEAInfo,AEECallback*pcb);

int(*StopPosDetNMEAInfo)(IPosDetNMEA*p,Pos-DetNMEAEventData req);

};

#define IPOSDETNMEA_AddRef(p)AEEGETPVTBL((p),IPosDetNMEA)->AddRef((p))

#define IPOSDETNMEA_Release(p)AEEGETPVTBL((p),IPosDetNMEA)->Release((p))

#define IPOSDETNMEA_QueryInterface(p,clsid,pp) AEEGETPVTBL((p),IPosDetNMEA)->QueryInterface((p), (clsid),(pp))

#define IPOSDETNMEA_Enable(p)AEEGETPVTBL((p),IPosDetNMEA)->Enable((p))

#define IPOSDETNMEA_Disable(p)AEEGETPVTBL((p),IPosDetNMEA)->Disable((p))

#define IPOSDETNMEA_IsEnabled(p)AEEGETPVTBL((p),IPosDetNMEA)->IsEnabled((p))

#define IPOSDETNMEA_GetPosDetNMEAInfo(p, req,pbi,pcb)AEEGETPVTBL((p),IPosDetNMEA)->Get-PosDetNMEAInfo((p),(req),(pbi),(pcb))

#define IPOSDETNMEA_StopPosDetNMEAInfo(p, req)AEEGETPVTBL((p),IPosDetNMEA)->StopPosDetNMEAInfo((p),(req))

2)接口实现部分入口

static const IPosDetNMEAVtbl gvtIPosDetNMEA={

AEEPosDetNMEA_AddRef,

AEEPosDetNMEA_Release,

AEEPosDetNMEA_QueryInterface,

AEEPosDetNMEA_Enable,

AEEPosDetNMEA_Disable,

AEEPosDetNMEA_IsEnabled,

AEEPosDetNMEA_GetPosDetNMEAInfo,

AEEPosDetNMEA_StopPosDetNMEAInfo,

};

4 结语

通过在QSC1110的芯片外挂北斗定位芯片,同时在它对应的brew平台代码上增加定位功能支持,QSC1110芯片就可以更广泛用于智能定位设备上,如智能定位手表,遗失物品追踪等。目前定位模块基本都可以通过uart、usb等接口进行nmea标准或北斗标准的通讯。因此,只要芯片具备足够的运行能力,并且支持uart或者usb接口,都可以移植本文的关键代码为该芯片增加北斗定位功能的支持。

[1]史恒林,李媛州,王子强.北斗定位导航技术的应用及展望[J].科技创新导报,2015(17):118-119.

[2]韦江华,钟盛壮,秦文东.基于Android平台的北斗GPS双模定位系统[J].中国科技信息,2016(2):38-39.

[3]张习国,刘建.基于北斗导航系统的移动监控管理系统研究[J].武汉理工大学学报(信息与管理工程版),2005(5):63-65.

[4]肖远亮.NMEA-0183数据标准在GPS技术中的应用[J].物探装备,2003(2):127-133..

[5]陈石平,杨晓明,史哲英.基于BD/GPS的北斗记录仪与导航仪的一体化设计[J].数字通信世界,2015(2):13-16.

[6]高星伟,过静珺,程鹏飞.基于时空系统统一的北斗与GPS融合定位[J].测绘学报,2012(5):743-748.

[7]许江伟,陈平.BREW平台上的手机软件开发[J].计算机应用,2003(10):89-92.

[8]朱哲然,郭莎莎,党华.BREW平台的类COM特性研究[J].软件导刊,2016(1):10-13.

[9]于天福,苏健民,李健.BrewMP OEM层开发研究[J].林业劳动安全,2010(1):24-26.

Implementation of Beidou positioning scheme based on Qualcomm QSC1110 platform

FUJun
(Hunan Post and Telecommunication College,Changsha,Hunan,China 410015)

QualcommQSC1110 platformhas the advantages ofsmall size,stable function,lowpower consumption and lowoperation requirements.It is widely used in smart appliances,smart accessories and other products.QSC1110 does not support the positioning function and in order to eliminate this defect,this paper proposes a scheme which uses a plug-in Beidou positioning chip on OSC1110 chip and adds Beidou positioningchip data analysis code on the QSC1110 software platformtoachieve the function ofpositioning.

QSC1110;brew;Beidou positioning

10.3969/j.issn.2095-7661.2016.04.012】

P228.4

A

2095-7661(2016)04-0040-04

2016-10-21

湖南省教育厅科学研究项目“移动互联网时代工会移动应用服务平台的研究与实践”(项目编号:No.15C1016)。

符军(1982-),男,湖南桃江人,湖南邮电职业技术学院教师,硕士,研究方向:移动互联网技术、智能检测。

猜你喜欢

高通代码北斗
北斗时钟盘
“北斗”离我们有多远
高通、苹果专利案新进展:苹果拒绝与高通和解
创世代码
创世代码
创世代码
创世代码
历史转折后的高通前执行董事长
《福布斯》欧盟罚高通
首个北斗全球“厘米级”定位系统开建