- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
基于Android平台和蓝牙的太阳辐照度采集系统
1 系统程序流程
辐照度采集系统由标准太阳电池测试太阳辐照度,集成环境温度、电池板温度等测试功能,下位机通过蓝牙模块连接具有蓝牙接口的Android移动终端,以利用便携式Android设备来实时监控和记录系统采集数据。程序执行的流程图如图1所示。
打开上位机Android软件,进入到蓝牙配置界面,首先打开蓝牙,匹配蓝牙模块,然后搜索蓝牙设备并显示搜索到的蓝牙设备名称,点击需要匹配的蓝牙模块名称项目进行匹配,匹配成功即可点击按钮进入到采集数据界面,设置好测试间隔时间之后,按启动按钮进行数据采集,按停止按钮结束采集。选上记录复选框,自动保存采集数据结果至设备根文件目录下。
2 Bluetooth模块匹配连接
在采集系统中,下位机通过标准太阳电池测得太阳辐照度数据,其蓝牙接口与Android设备蓝牙模块匹配之后,建立连接,进行数据采集。蓝牙模块的匹配是数据采集的前提,下面简述匹配步骤。
(1)开启蓝牙
要使用蓝牙,必须取得蓝牙适配器,我们可以通过BluetoothAdapter的getDefaultAdapter()方法来取得本地蓝牙适配器:
public BluetoothAdapter bluetooth= BluetoothAdapter.
getDefaultAdapter();
然后打开蓝牙:bluetooth.enable();
(2) 搜索蓝牙模块
在蓝牙打开之后,需要搜索蓝牙设备,然后才能进行匹配操作。搜索蓝牙设备需要使用BluetootDevice类,可以使用BluetoothAdapter类的getRemoteDevice方法来得到一个指定地址的BluetoothDevice。搜索蓝牙设备的具体流程如图2所示。
根据图2,获得蓝牙设备需要分别注册搜索完成和发现设备两类广播消息,并调用startDiscovery()方法。每次系统广播事件发生后,系统就会创建对应的BroadcastReceiver实例,并自动触发它的onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例就会被销毁。在该BroadcastReceiver实例的onReceive()方法中,我们处理注册的广播消息,将发现的蓝牙设备放在设备列表中进行显示。在点击蓝牙模块匹配按钮之后,调用startDiscovery()方法开始搜索。
( 3)蓝牙模块匹配
在蓝牙设备搜索完成之后,采集系统下位机的蓝牙模块名称和MAC地址显示在蓝牙设备列表中,下面是Android蓝牙与下位机蓝牙模块实现连接的部分代码:
通过蓝牙设备的MAC地址获取BluetoothDevice对象: device = bluetooth.
getRemoteDevice(BlueToothAddress);
BluetoothDevice对象通过UUID号创建一个Socket连:socket =
device.createRfcommSocketToServiceRecord(UUID.
fromString("00001101-0000-1000-8000-00805F9B34FB"));
连接远程蓝牙适配器:socket.connect();
至此,蓝牙模块匹配连接完成,将匹配的结果显示在蓝牙匹配信息列表中。
[p]3 数据采集显示与记录
在Android蓝牙与下位机蓝牙模块匹配成功之后,点击蓝牙配置界面中的数据采集按钮,即可以进入到数据采集界面。数据采集界面支持竖屏和横屏两种显示,以方便Android设备中手机和平板的使用。
(1)横竖屏显示
Android横竖屏要解决的两个问题:布局和重新载入。布局问题的解决,首先获得逻辑显示屏信息,比较宽度和高度的大小,判断当前横屏还是竖屏,分别设置不同的XML文件定义的界面布局,核心代码如下:
// 如果是横屏
if (width > height)
{
Orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
// 设置使用datacollectlandscape.xml文件定义的界面布局
this.setContentView(R.layout.datacollectlandscape);
}
// 如果是竖屏
else
{
Orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
// 设置使用datacollectportrait.xml文件定义的界面布局
this.setContentView(R.layout.datacollectportrait);
}
重新载入问题的解决,AndroidManifest.xml文件中添加android:configChanges="orientation|keyboardHidden| screenSize",然后重写onConfigurationChanged函数。在该函数中,实现横竖屏切换时保持屏幕原有方向:
this.setRequestedOrientation(Orientation);
这样在确定横竖屏显示之后,再旋转屏幕,界面保持不变,数据采集不会中断。
(2)发送采集命令
允许设置测试间隔时间,Android蓝牙向下位机蓝牙模块按照测试间隔时间定时发送采集命令,通过设置定时器任务来实现。每次启动一个发送采集命令的任务,部分代码如下:
// 获得输出流
OutputStream os = socket.getOutputStream();
// 向输出流中写入采集命令
for (int i = 0; i < len; i++)
{
socket.write(cmd[i]);
}
(3)接收数据,处理显示
首先创建读取线程,在读取线程中读取下位机蓝牙模块发来的数据。部分代码如下:
// 获得输入流
InputStream mmInStream =socket.getInputStream();
//读取数据
readCount += mmInStream.read(buffer, readCount, countAll - readCount);
这样采集的数据放在了buffer数组中,下面的工作即是根据通信协议,对数组中的数据进行处理,数据错误提示错误缘由,数据正确则构造Message信息,采用Handler消息传递机制显示在对应的文本框中。
(4)记录采集数据
选中记录复选框,可以自动记录测试结果,将测试结果以文本格式保存至Android设备中,部分代码如下:
// 以指定文件创建 RandomAccessFile对象
RandomAccessFile raf = new RandomAccessFile(targetFile, "rw");
// 将文件记录指针移动到最后
raf.seek(targetFile.length());
// 输出文件内容
raf.write(content.getBytes());
raf.close();
4 系统功能测试
在手机端运行上位机软件,进入到蓝牙配置界面,依次进行打开蓝牙、蓝牙模块匹配操作,匹配结果如图3所示。然后点击数据采集,根据手机屏幕进入到采集数据界面的横屏或者竖屏显示,设置好测试间隔时间,点击启动按钮,采集结果如图4、图5所示。采集结束,点击停止按钮,按返回键至蓝牙配置界面,点击退出,确认。经过测试,系统支持100米距离蓝牙连接,运行正常,健壮性良好。目前已成功应用于一款太阳辐照度计仪表中,并参展2014年国际太阳能产业及光伏工程(上海)展览会,获得好评。
射频工程师养成培训教程套装,助您快速成为一名优秀射频工程师...
天线设计工程师培训课程套装,资深专家授课,让天线设计不再难...
上一篇:高耗电移动设备的发展
下一篇:USB电池充电规范1.2版概述及充电检测器的重要角色