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 位)。
所示。如图 6.3,在 123-129 行可以看到读取成功后将数据保存进了一个 unsigned
char[10]数组,其中 5,6 存储的是湿度信息,7,8 存储的是温度信息。
随后这个数组被发送至串口,由此可以知道收到的数据是一个 10 个元素的数组,
其中 5、6 表示湿度,7、8 表示温度。
3.收到的数据的解算的问题
如图 6.4 所示,通过第二步中的解析得到的数据是这样的,然而并不是可以直接使
用的温湿度数据。
解决方式:阅读传感器文档。如图 6.5、6.6 所示,可以得到这样的解算方式。
根据公式即可对数据进行解析
最后附上结构图和最终的app样品图