基于蓝牙和baidu地图的一个轨迹显示APP

来源:互联网 发布:什么是数据落差 编辑:程序博客网 时间:2024/06/03 18:17

最近帮别人做了一个简单的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);//设置系统中断优先级分组2delay_init(168);//延时初始化 uart_init(9600);//串口初始化波特率为115200senddata.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

0 0
原创粉丝点击