基于蓝牙和baidu地图的一个轨迹显示APP
最近帮别人做了一个简单的APP,主要的功能就是显示一个物体的路径,这个物体上自带了GPS和蓝牙,会不断将自己的位置信息通过蓝牙发送到我们的手机端,然后在手机端进行一个显示。
我们的界面上有两个按钮,一个是用来开关蓝牙的,一个用来收索周围的蓝牙设备。
but_On_Off.setOnClickListener(new View.OnClickListener() {//打开蓝牙的按钮
@Override
public void onClick(View v) {
if(!mBluetoothAdapter.isEnabled()){
mBluetoothAdapter.enable();
Toast.makeText(MainActivity.this, "蓝牙已开启", Toast.LENGTH_SHORT).show();
but_On_Off.setText("关闭蓝牙");
}else{
mBluetoothAdapter.disable();
Toast.makeText(MainActivity.this, "蓝牙已关闭", Toast.LENGTH_SHORT).show();
but_On_Off.setText("开启蓝牙");
}
}
});
but_search.setOnClickListener(new View.OnClickListener() {//搜索设备
@Override
public void onClick(View v) {
searchDevice();
}
});
和蓝牙设备建立连接之后,就开始不断读取数据,然后把数据保存在Bundle里边,通过MainActivity中的Handler来刷新界面。
下面是这个读取数据线程的关键代码:
public void run()
{
Log.i(TAG, "BEGIN mConnectedThread");
byte[] buffer = new byte[9];
int bytes;
// Keep listening to the InputStream while connected
while (true)
{
try {
// Read from the InputStream
if((bytes = mmInStream.read(buffer)) > 1)
{
byte[] buf_data = new byte[bytes];
for (int i = 0; i<bytes; i++)
{
buf_data[i] = buffer[i];
}
/*bytes = mmInStream.read(buffer);*/
// Send the obtained bytes to the UI Activity
/*mHandler.obtainMessage(MainActivity.MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();*/
Message msg = mHandler.obtainMessage();
msg.what = MainActivity.MESSAGE_READ;
Bundle bundle = new Bundle();
/*bundle.putString("info",buffer.toString());*/
bundle.putByteArray("info", buf_data);
msg.setData(bundle);
mHandler.sendMessage(msg);
}
} catch (IOException e) {
Log.e(TAG, "disconnected", e);
connectionLost();
break;
}
}
}
数据的格式直接是16进制的,这里要注意一个大小端的问题,注意发送和接收的顺序,如果数据反过来了,那么就是大小端的原因,还有就是在调试的时候我发现一个问题就是数据第一个会丢失掉,所以我让下位机端多发送了一个无用的数据,然后读取后面8位。至于这是什么原因,我现在还不是太清楚。。。。如果有人知道麻烦告知我一下~~
下面是主程序中的用来接收数据的关键代码:
case MESSAGE_READ:
Bundle bundle=msg.getData();
byte[] array=bundle.getByteArray("info");
/* System.out.println(bytesToFloat(array,0));
System.out.println(bytesToFloat(array,4));*/
/*for (int i=0;i<array.length;i++){
System.out.println(array[i]);
}
System.out.println("+++++++++++++++++++++");*/
if (array.length==8)
{
float longitude=bytesToFloat(array,0);
float latitude=bytesToFloat(array,4);
if((latitude>4)&&(longitude>73)){
addOverlays(latitude,longitude);
}
}
break;
至于baidu地图的使用,这里就不多讲了,主要就是接收到一个数据就添加一个覆盖物。很简单~
最后就贴一下下位机的代码,下位机是用stm32做的,占时只是发送一些假数据,如果真实使用的时候有什么问题再修改。
下面贴出关键代码:
union
{
u8 temp[4*2+1];
float num[2];
}senddata;
int main(void)
{
int i;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //延时初始化
uart_init(9600); //串口初始化波特率为115200
senddata.num[0]=31.602684f;
senddata.num[1]=120.296532f;
senddata.temp[8]=0xee;
while(1)
{
for(i=8;i>=0;i--)
{
USART_SendData(USART1,senddata.temp[i] ); //*((u8*)(&Y[0][0])+i)
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
}
delay_ms(10000);
}
}
最后是一个效果:

总共调试了一天多的时间,调试的时候经历了各种问题,但是最后自己一点点把这些问题解决感觉还是不错的~
最后贴出整个项目的链接:
http://download.csdn.net/detail/yalishadaa/9663189