本文主要是介绍ML302 OpenCPU系列(9)---百度鹰眼轨迹点上传,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
ML302 OpenCPU系列(9)---百度鹰眼轨迹点上传
- 处理流程
- main()线程
- GNSS处理线程
- 轨迹点上传线程
- 上传示例
在 《GNSS系列(4)------百度地图显示ML302定位轨迹》这篇文章中讲解了如何使用ML302 AT指令上传百度鹰眼轨迹点,下面将用OpenCPU来实现这个功能。
处理流程
我们创建了1个消息队列和2个线程:线程1负责每1s获取一次GNSS位置点信息,并发送至消息队列;线程2负责从消息队列读取位置点信息,并通过HTTP接口POST至百度鹰眼。
main()线程
我们先定义一个结构体用于表示位置点,该结构体与API:cm_gnss_getlocateinfo()对应。
typedef struct Gnss_Point_Info
{char time[30];char longitude[20];char latitude[20];char altitude[10];char speed[10];char cntOfSatFix[5];
}Gnss_Point_Info;
创建一个消息队列用于存放位置点信息,由于CMSIS-FreeRTOS消息队列函数osMessagePut()只支持发送4个字节的整数或指针变量,我们这里要发送的是一个结构体,只能将指向该结构体的指针发送到消息队列,所以我们得再创建一个内存池来存放结构体数据,实现两个线程间数据的传递。
#define GNSS_POINTS_NUM 100 //消息队列的长度
osPoolDef(gnssInfoPoolId, GNSS_POINTS_NUM, Gnss_Point_Info); //内存池大小
osPoolId gnssInfoPoolId;
osMessageQDef(gnssPointInfoMsgId, GNSS_POINTS_NUM, uint32_t);
osMessageQId gnssPointInfoMsgId;
main_task()
{
......gnssInfoPoolId = osPoolCreate(osPool(gnssInfoPoolId));gnssPointInfoMsgId = osMessageCreate(osMessageQ(gnssPointInfoMsgId),NULL);
......
}
接着创建两个线程tim_gnss_task()和tim_baidu_track_task()
osThreadId OC_GNSS_TaskHandle;
osThreadId OC_HTTP_TaskHandle;
main_task()
{
......osThreadDef(OC_GNSS_Task, tim_gnss_task, osPriorityNormal, 0, 8192);OC_GNSS_TaskHandle = osThreadCreate(osThread(OC_GNSS_Task), 0);osThreadDef(OC_HTTP_Task, tim_baidu_track_task, osPriorityNormal, 0, 8192);OC_HTTP_TaskHandle = osThreadCreate(osThread(OC_HTTP_Task), 0)
这篇关于ML302 OpenCPU系列(9)---百度鹰眼轨迹点上传的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!