2016.8.24:这里非常抱歉,做完这个综合训练我个人忙于考研,没能第一时间把这篇博文写完。由于时间已经过了一年,而且我个人正在改行研究NLP,导致我现在对于其中一些要点已经忘记了。之前有些朋友私信要代码也没能第一时间发过去,这里一并表示道歉。当然这篇文章以及我做的app也属于比较浅显的东西,只是给大家提供一些参考。
2017.4.18:过去两年总时不时有人问我这个程序的事,于是翻了翻资料,找到了当年的实验报告,把实验报告里有用的东西复制粘贴过来,希望能给各位一点启发。另外,我当时做的时候还处于android 4.0的时代,所以可能代码之类的有些过时,见谅。
—————————————————————————————————————————
最近做学校的硬件综合训练,实验箱上有一个带温湿度传感器的hc06蓝牙模块,于是准备用蓝牙与android端app通信,实时更新温湿度信息。本次开发由我全部负责移动端代码,还是压力比较大的。
因为蓝牙模块部分单片机程序肯定有特殊性,大家遇到的单片机代码或者自己设计的肯定跟我这次不是一样的,所以具体数据解算代码就不放出来了。
在网上很难搜到相关app的实现,于是我准备把几个主要的难点写下来,与大家交流分析。
1.android 连接蓝牙模块的问题
如果是两部手机进行通信,可以采用BluetoothSocket和BluetoothSeverSocket,提供相同的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 位)。
随后这个数组被发送至串口,由此可以知道收到的数据是一个 10 个元素的数组,
其中 5、6 表示湿度,7、8 表示温度。
3.收到的数据的解算的问题
如图 6.4 所示,通过第二步中的解析得到的数据是这样的,然而并不是可以直接使
用的温湿度数据。
解决方式:阅读传感器文档。如图 6.5、6.6 所示,可以得到这样的解算方式。
根据公式即可对数据进行解析
最后附上结构图和最终的app样品图