android 与 蓝牙模块 hc06通信app 开发要点

2016.8.24:这里非常抱歉,做完这个综合训练我个人忙于考研,没能第一时间把这篇博文写完。由于时间已经过了一年,而且我个人正在改行研究NLP,导致我现在对于其中一些要点已经忘记了。之前有些朋友私信要代码也没能第一时间发过去,这里一并表示道歉。当然这篇文章以及我做的app也属于比较浅显的东西,只是给大家提供一些参考。

2017.4.18:过去两年总时不时有人问我这个程序的事,于是翻了翻资料,找到了当年的实验报告,把实验报告里有用的东西复制粘贴过来,希望能给各位一点启发。另外,我当时做的时候还处于android 4.0的时代,所以可能代码之类的有些过时,见谅。

—————————————————————————————————————————


最近做学校的硬件综合训练,实验箱上有一个带温湿度传感器的hc06蓝牙模块,于是准备用蓝牙与android端app通信,实时更新温湿度信息。本次开发由我全部负责移动端代码,还是压力比较大的。

因为蓝牙模块部分单片机程序肯定有特殊性,大家遇到的单片机代码或者自己设计的肯定跟我这次不是一样的,所以具体数据解算代码就不放出来了。

在网上很难搜到相关app的实现,于是我准备把几个主要的难点写下来,与大家交流分析。

1.android 连接蓝牙模块的问题

如果是两部手机进行通信,可以采用BluetoothSocketBluetoothSeverSocket,提供相同的UUID进行连接。

连接蓝牙模块并不能采用这种方式,或者说我不知道怎么采用这种方式。

我的解决办法如下,总体来说还是

将手机作为客户端,通过一个不断监听并读取数据的循环接收信息。

连接蓝牙模块代码如下

private void connect(final String msg, final BluetoothDevice device) {
		// TODO Auto-generated method stub
		new Thread(new Runnable(){

			@Override
			public void run() {
				// TODO Auto-generated method stub
				BluetoothSocket tmp = null;
				Method method;
                try {
                    method = device.getClass().getMethod("createRfcommSocket", new Class[]{int.class});
                    tmp = (BluetoothSocket) method.invoke(device, 1);
                } catch (Exception e) {
                    Message message = new Message();
                	message.what = Bluetooth.CONNECT_FAILED;
                	handler.sendMessage(message);
                    Log.e("TAG", e.toString());
                }
                socket = tmp;
                try {
                    socket.connect();
                    Message message = new Message();
                	message.what = Bluetooth.CONNECT_SUCCESS;
                	handler.sendMessage(message);
                    isConnect = true;
                } catch (Exception e) {
                	Message message = new Message();
                	message.what = Bluetooth.CONNECT_FAILED;
                	handler.sendMessage(message);
                    Log.e("TAG", e.toString());
                }
                
                if (isConnect) {
                    try {
                        OutputStream outStream = socket.getOutputStream();
                        outStream.write(getHexBytes(msg));
                    } catch (IOException e) {
                    	Message message = new Message();
                    	message.what = Bluetooth.WRITE_FAILED;
                    	handler.sendMessage(message);
                        Log.e("TAG", e.toString());
                    }
                    try {
                        InputStream inputStream = socket.getInputStream();
                        //int data;
                        byte[] data = new byte[10];
                        while (true) {
                            try {
                                //data = inputStream.read();        
                                inputStream.read(data);
                            	Message message = new Message();
                            	message.what = Bluetooth.DATA;
                            	//message.arg1 = data;
                            	message.obj = data;
                            	handler.sendMessage(message);
                            } catch (IOException e) {
                            	Message message = new Message();
                            	message.what = Bluetooth.READ_FAILED;
                            	handler.sendMessage(message);
                                Log.e("TAG", e.toString());
                                break;
                            }
                        }
                    } catch (IOException e) {
                    	Message message = new Message();
                    	message.what = Bluetooth.WRITE_FAILED;
                    	handler.sendMessage(message);
                        Log.e("TAG", e.toString());
                    }
                }

                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        Log.e("TAG", e.toString());
                    }
                }
                
			}
			
		}).start();
	}

剩下的改天再写。


2017.4.18的更新

2.实验箱中蓝牙模块 hc-06 返回数据格式的问题
由于本人之前并没有做过嵌入式开发也没有读过单片机程序,所以拿到蓝牙模块发
过来的数据完全不知道是什么,开始的时候直接将他转换为字符,结果输出了满屏乱码。
解决方案:阅读蓝牙从模块 avr 单片机部分全部源程序。
首先找到控制温湿度传感器的 sht11.c 文件,其中在 148-150 行可以找到测量数据
的代码。如图 6.1 所示。其中 MSB 代表高八位、LSB 代表低八位。程序中用了一个 16
位的 unsigned int 保存这 16 位数据(默认湿度 12 位,温度 14 位)。


然后阅读 sencor.c,在其中 117,118 行可以看到分别读取了温湿度信息。如图 6.2
所示。如图 6.3,在 123-129 行可以看到读取成功后将数据保存进了一个 unsigned
char[10]数组,其中 5,6 存储的是湿度信息,7,8 存储的是温度信息。

随后这个数组被发送至串口,由此可以知道收到的数据是一个 10 个元素的数组,
其中 5、6 表示湿度,7、8 表示温度。

3.收到的数据的解算的问题
如图 6.4 所示,通过第二步中的解析得到的数据是这样的,然而并不是可以直接使
用的温湿度数据。

解决方式:阅读传感器文档。如图 6.5、6.6 所示,可以得到这样的解算方式。

根据公式即可对数据进行解析


最后附上结构图和最终的app样品图


  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值