第一范文网 - 专业文章范例文档资料分享平台

专业综合实验报告远程灯光控制系统 (3)

来源:用户分享 时间:2020-06-22 本文由眺望远方 分享 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

而Wi-Fi 模块则价格昂贵,不便于普遍使用。因此本文基于通信距离和经济方面考虑,选用了无线蓝牙串口模块—HC-06。

HC-06 从机模块是低功耗,高性能无线收发系统,其无线收发的灵敏度(误码率)可以达到-80d Bm,并且具有-4->6d Bm可调功率输出。具有4 个引脚:VCC/GND/RXD/TXD,在设计过程中,可以通过面包板将此模块与arduino进行连接。 HC-06 其具体结构如下图所示

图3-3HC-06 无线串口蓝牙模块

四 系统软件设计

智能灯光系统的手机端APP 主要由五大功能模块构成,分别是:蓝牙设备搜索与匹配、RGB-LED 灯光的开启和关闭、RGB-LED灯光的亮度调节、RGB-LED 灯光的颜色调节和RGB-LED 灯光的闪烁调节。 4.1蓝牙设备搜索与匹配功能模块实现

传统的Android 平台提供了完整的Bluetooth APIS,其中包括Bluetooth Adapter(Bluetooth Adapter 代表本地设备的蓝牙适配器。Bluetooth Adapter 控制执行基本的蓝牙操作,例如启动蓝牙设备搜索,查询已连接(配对)设备清单,并且使用已知的MAC 地址实例化一个蓝牙设备,并创建一个Bluetooth Server Socket 监听连接请求)、Bluetooth Device (Bluetooth Device 方法可以同已配对设备建立连接或查询其相关信息,如设备名、设备地址、连接状态等)及Bluetooth Class (Bluetooth Class 这个类描述蓝牙设备的特征。手机、耳机、打印机等都会是蓝牙设备,Bluetooth Class就是用来表不该设备为何种类型。)等。Android 平台同样实现了大部分蓝牙Profile,本系统将会用到Serial Port Profile(SPP 蓝牙串口)。在文中,改进传统的功能实现,运用android NDK 技术将蓝牙串口的通信通过JNI 机制编写相应的本地代码,然后依据android NDK 的要

求编写.mk文件,这样android 手机操作系统就可以识别并生成能够被系统使用的动态库.so 文件;最后在android 的应用层上编写调用动态库和使用函数的接口。根据蓝牙串口通信实现的流程图,首先需要进行的是本地接口的实现,对NDK 开发环境进行配置,然后使用本地方法实现JNI 的接口设计。由于串口通信中不同接口有不同的波特率,只有当接口选定和波特率确定后接口才能使用,达到数据传输的目的。在本地文件中用以下代码实现:

staticspeed_t get Baudrate(jintbaudrate) {

switch(baudrate) { case 0: return B0; case 50: return B50; …

(省略部分代码)

default:return -1; }

上述代码的返回值是speed_t用于特定的波特率类型,在Linux 操作系统中宏定义0 就是B0,同样其它速率也按此格式。蓝牙串口通信的接口主要包括两个部分:蓝牙串口的打开和关闭。其中,在蓝牙串口打开的函数部分主要有四个部分:验证串口参数、打开蓝牙设备、配置蓝牙设备和创建蓝牙通信对应的相关文件描述符。其参数需要包括 JNIEnv指针和当前实体的jobject,同时还要有串口文件所处路径和可用波特值,例如 JNIEXPORT jobject JNICALL Java_Android _Serial Port_open (JNIEnv *env,jobjectthiz,jstring path,jintbaudrate)。函数中有三个参数:fd表示文件号,speed 表示串口速率(结构为linux系统的speed_t)和m File Descriptor 则为JNI 中对象。通过使用get Baudrate检查蓝牙串口参数并将相关值传给speed,假如speed = get Baudrate(baudrate),此处也要加入异常判断机制,这里波特率判断函数的默认值。以下就是打开串口的主要代码:

jbooleaniscopy;

const char *path_utf = (*env)->Get String UTFChars(env, path,&iscopy); fd = open(path_utf, O_RDWR | O_DIRECT | O_SYNC);

(*env)->Release String UTFChars(env, path,path_utf); if (fd == -1) {

LOGE(\ return NULL; }

在生成文件描述符的时候要将设备表示成android 平台能够识别的形式,需要采用JNI 提供的函数表示,见如下:

jclassIH_File Descriptor = (*env)->Find Class(env, \ jmethod ID IH_File Descriptor = (*env)->Get Method ID(env,IH_File Descriptor, \, \

jfield ID IH_descriptor ID = (*env)->Get Field ID(env,IH_FileDescriptor,\,

\

IH_File Descriptor = (*env)->New Object(env,IH_File Descriptor,IH_File Descriptor); (*env)->Set Int Field(env,IH_File Descriptor,IH_descriptor ID, (jint)fd);

其中通过使用Find Class(JNIEnv *env,const char *name)方法来加载本地定义的文 件标识符类,其作用是搜索环境变量CLASSPATH 中第二个参数所指明的目录和zip 文件。参数分别是:JNI 接口指针env和类全名name。在完成如上蓝牙串口通信的JNI 层函数后,下面所需的工作是将所写代码与Android 平台连接起来,目的是要形成动态连接库文件以供应用程序调用。既在Linux 平台下编译成.so 文件,需要完成 Android.mk 文件编写,其主干代码如下: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)

TARGET_PLATFORM := Android-5 LOCAL_MODULE:= serial_port LOCAL_SRC_FILES := Serial Port.c LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)

“TARGET_PLATFORM := Android-5”主要是指所处的平台的名字,它同样也会在 Android.mk 这个文件中被解析编译。通常情况下只针对某些平台特性做出指出,在高版本的平台中会向下兼容。

“LOCAL_LDLIBS := -llog”表示需要连接的库(lib),这些lib 自身之间不产生依赖的关系,在不需要重新编译lib 的时候进行使用,如果加载的lib 不存在则会抛 出系统无法找到的异常。即使导入更多的lib,但目标软件最终只能链接那些本模块所需要连接的lib。当某一个lib 既有动态库又有静态库的情况时,那么在默认情况下系统会选择链接动态库而非静态库。

通过以上部分实现主要的底层通信功能,但在蓝牙设备的搜索与匹配功能模块 中,最主要的问题是找到蓝牙设备并将设备与如上本地通信代码联系起来,因此, 设计Serial Port Finder 和 Serial Port 两个专门的类。前者功能是查找设备中所有可 用的蓝牙设备文件名,后者是调用预先生成的动态链接库中的函数:打开蓝牙串 口设备并进行配置,并且赋予这个蓝牙设备可写、可读和可执行的操作权限,并 在后续生成一个通用模板。 在实现

serialport Finder

过程中需要设计一个驱动,这个驱动的主干就是通过在 Android

文件系统对找到的文件驱动的名字和位置进行赋值,其主要代码如下: e.print Stack Trace();

throw new Security Exception(); }… ( 省略部分代码 )

}

public class Driver { ??

省略部分代码

private String m Driver Name; private String m Device Root;

Vector m Devices = null; public Vector get Devices() { if (m Devices == null) {

m Devices = new Vector(); File dev = new File(\ File[] files = dev.list Files(); inti;

for (i=0; i

if (files[i].get Absolute Path().starts With(m Device Root)) { mDevices.add(files[i]); } } }

return m Devices; } ??

省略部分代码

} 将

serialport Finder 实现完成后,需要对 Serial Port

类进行完成,其中部分关键代码 如下:

try {

Process su;

su = Runtime.get Runtime().exec(\

String cmd = \ + \

su.get Output Stream().write(cmd.get Bytes()); if ((su.wait For() != 0) || !device.can Read() || !device.can Write()) { throw new Security Exception(); }

} catch (Exception e) { e.print Stack Trace();

throw new Security Exception(); }… (

省略部分代码 ) }

在实现了Serial Port 和Serial Port Finder 两个类的编写以后,为了使程序能够使用, 在这之前需要编写一个设备类(Application),这个类是Android.app.Application的 一个子类。由于在Android 应用中要使用全局变量,除了public 的静态变量以外的 另外一种方式。首先需要明确的是在每次创建一个application 后,系统都会创建 一个表示这个应用的进程ID(PID),这个应用(工程)中的所有Activity 就会依 据这个进程 ID 识别并运行。通过创建这样一个Application 以后,那些初始化的 全局变量就可以被所有拥有PID 的activity 使用。通过这种方式混合android SDK 编程,就可以实现该核心功能模块。

蓝牙设备的搜索与匹配功能效果图如下所示:

图4-1蓝牙设备搜索与匹配

4.2Ardunio IDE 编程

在完成硬件设备互联之后,需要根据系统要求,编写硬件端程序并将其烧录到arduino开发板中。 在本文中,arduino控制板需要实现的功能是将android 手机APP 通过HC-06 传送的数字信号,接受并通过pmw输出引脚传送给RGB-LED,具体C 语言编程代码如下所示:

//pins for the LEDs: constint red Pin = 3; constint green Pin = 5;

搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新幼儿教育专业综合实验报告远程灯光控制系统 (3)全文阅读和word下载服务。

专业综合实验报告远程灯光控制系统 (3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/wenku/1096937.html(转载请注明文章来源)
热门推荐
Copyright © 2018-2022 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top