Java 怎样实现接受android 蓝牙音频输出数据,分析与输出

java蓝牙接收端怎么写?请赐教_百度知道
java蓝牙接收端怎么写?请赐教
正在写一个程序,其中用到蓝牙接收,但不知道如何写,请大神赐教哈
我有更好的答案
首先要设备或虚拟设备支持JSR-82协议蓝牙开发接口。认真学习JSR82协议(不学怎么知道怎么写)。从找一些范例代码照抄开始在代码中按JSR 82 Bluetooth API and OBEX API 要求编写即可。java不需要涉及底层,只需要会用这个协议即可。
我装的java没有与蓝牙有关的包,能不能给几个源码例子
java的蓝牙是Java ME微型版为基础,手机或移动设备上具有的功能。你不会拿桌面版的Java去硬来吧。桌面版Java SE难有,无例子。学移动开发。
项目要求pc服务端使用j2se,蓝牙接收只是pc服务端的一部分,接收手机客户端通过蓝牙发送的信息。
已经说了,学JSR 82, PC服务端就学包括JSP在内的Java EE写个网站应用。
为您推荐:
其他类似问题
蓝牙的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。一直想写一份技术文档,但因为自感能力有限而无从下笔,近期做了个关于Android平台下实现与C语言的通讯来操作蓝牙模块的项目,中间碰到了很多问题,也在网上查了很多资料,在完毕主要功能后。也有一些人在网上问我一些问题。这里写下这篇文档算是一个阶段性的总结。假设反响好。兴许将会发上Android&Stub与新版Android&HAL的学习文档。
因为蓝牙模块是串口通讯机制。使用C语言来訪问,而Android的应用层採用Java。无法直接操作硬件。故使用JNI的技术实现主要功能。Android的JNI应该属于Android&HAL的一部分,因为Android的HAL机制眼下还没全然摸索透,所以这里的程序架构算是老版本号的HAL机制。程序架构例如以下图。
一、&什么是JNI?
JNI是Java&Native&Interface的缩写,中文为JAVA本地调用。从Java1.1開始,Java&Native&Interface(JNI)标准成为java平台的一部分,它同意Java代码和其它语言写的代码进行交互。JNI一開始是为了本地已编译语言。尤其是C和C++而设计的,可是它并最好还是碍你使用其它语言,仅仅要调用约定受支持就能够了。(以上内容摘自百度百科)
二、&怎样使用JNI?
1、在使用JNI之前,你要确保你的电脑中安装下面软件环境:
Android&SDK :版本号与你硬件測试环境版本号同样,在Google的Android官网下载
Android&NDK :用于编译C文件为.so的共享库。假设你是在Linux下进行开发而又具有Android的全然SDK,则不须要
Cygwin :用于编译C文件
Android&开发环境 :android开发环境的配置网上一大堆,这里不再赘述
2、程序中因为仅仅用到Java调C,而不须要C调Java,所以在应用层调C的函数非常easy,仅仅须要在一个方法前增加nativekeyword(native的方法不能有方法体),然后将编译的共享库导入就可以。
例如以下:
public&class&BluetoothJNI&{
System.loadLibrary(&jni&);
public&native&static&int&bluetoothOn(String&strAT);
public&native&static&void&bluetoothOff(String&strAT);
public&native&static&String&readSerial();
public&native&static&void&write(String&strAT);
3、Eclipse在保存project后,会自己主动把Java文件编译为class文件。我们使用javah命令把class文件编译成C头文件。例如以下:
运行此命令后将会在project的bin文件夹下生成一个.h的C头文件。头文件里会生成相应Java&native方法的函数声明。新建一个与头文件同名的C文件并实现全部函数。
4、因为Android的底层是基于Linux内核。所以一些Windows下的系统函数不可用。Linux下的串口通讯文章网上有非常多,此处代码繁多,就不贴出来了。。我们在C文件里引入jni.h与刚生成的头文件以确保JNI能调用。注意:整个程序的核心部分便是在此处,C语言与蓝牙模块的串口通讯处,我在此处碰到的问题也是最多的。
三、编译C文件
1、在Android-ndk-r5b\samples\下新建文件夹Bluetooth\jni,将C文件与头文件复制过来,新建Makefile。例如以下:
LOCAL_PATH&:=&$(call&my-dir)
include&$(CLEAR_VARS)
LOCAL_C_INCLUDES&:=&$(JNI_H_INCLUDE)
LOCAL_LDLIBS&:=&-lm&-llog
LOCAL_MODULE&&&&:=&jni
LOCAL_SRC_FILES&:=&com_android_semisky_bluetooth_util_BluetoothJNI.c
include&$(BUILD_SHARED_LIBRARY)
2、打开Cygwin&bash&shell,进入Bluetooth文件夹。运行ndk-build进行编译。
3、将libs/armeabi下生成的libjni.so文件拷入到Androidproject的libs/armeabi文件夹下。安装apk到开发板。运行程序。
四、可能出现的问题
1、串口读写权限的问题
网上的方法是在Java中获取su账号来改权限或者在init.rc中加入命令来改动权限最后编译成img烧录进开发板。而这两种方法我都没成功,最后没办法在dos下运行shell命令来改动
2、C文件的串口读写问题
我不知道是我的程序有问题还是蓝牙模块的问题,在蓝牙模块返回数据稍大的时候。会出现数据有时返回有时不返回的情况。
3、乱码问题
蓝牙返回的数据时而出现乱码,未解决。
4、串口号的问题
假设你open的时候返回的fd小于1,确保你的开发板串口号是否正确。协议是否正确,权限是否改动。
5、最大大大的问题
读取串口代码段的算法问题,优化问题,不然数据会返回不正常。
阅读(...) 评论()他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)&&&& 最近的android蓝牙开发项目也逐渐接近尾声,基本的功能都已经完成,只剩下界面的设计。现在真的是舒了一口气!
&&&& 作为编程学习经验只有1年的菜鸟,这是我独自完成的商业性产品,而且还是涉及到与单片机蓝牙模块的底层通信,难度自然不小。最大的难度不是知识点不懂,而是调试,因为干扰因素实在是太多,很难找出是软件的问题还是硬件的问题,所以,在代码中一定要设置好调试点,以方便查询问题的症结点。
&&&&& 线程也是一个考虑的因素。凡是涉及到I/O的编程,都是一个不小的难题,因为它里面会涉及到线程问题。java的线程库的确非常方便好用,但要想正确的使用还是一个值得研究的话题,最坏的情况就是我们胡乱的使用线程技巧结果导致无谓的线程开销。
&&&&& 当然,这里的线程还是非常简单,关于同步,锁机制这些高级的话题根本没有用到,基本的线程知识就已经够用了。
&&&&& 与蓝牙模块通信最重要的地方就是数据的发送和接收,因为是底层的操作,所以更多是发送16进制数据。
&&&&& 进制转换是我们程序员的必修课,属于基本素质。这里需要的是将字节数组转化为16进制字符串,方法都是通用的:
public static String bytesToHexString(byte[] bytes) {
String result = "";
for (int i = 0; i & bytes. i++) {
String hexString = Integer.toHexString(bytes[i] & 0xFF);
if (hexString.length() == 1) {
hexString = '0' + hexS
result += hexString.toUpperCase();
&&&&&接下来就是发送数据。
&&&& 发送数据非常简单,之前有关于蓝牙编程的博文已经讲到了,,这里只讲重要的一点:大容量字节数组的发送。
&&&&&我们需要发送64个字节的数组,如果一次性发送过去,单片机那里可能无法及时处理以致没有任何回应,因为单片机那里是设置了数据接收的延时时间。要想畅通的与蓝牙模块通信,考虑这个时间差非常重要。调整字节的发送速率,就成为非常关键的一步。值得注意的是,数据的发送是非常快的,就是因为这样才会导致单片机那里无法及时处理,所以,每次发送后的延时是非常重要的。我们单片机那里的延时是10毫秒,所以我们选择发送完每个字节后就延时10毫秒再发下个字节。
for (byte b : bytes) {
out.write(b);
Thread.sleep(10);
&&&&&具体的延时时间和字节发送速率得看单片机那里程序的设置。&&&&&在使用InputStream的时候,必须注意,InputStream的读取是阻塞的。这点在一般的情况下是不会影响到我们的程序,但是记住这个情况对于代码的设计是非常重要的,尤其是在考虑用户体验的时候。
&&&&&无参数的read()是每次只从流中读取一个字节,这种做法效率非常低,但是简单,像是读取整数值这种情况,使用read()就非常好,但如果是16进制字符串呢?使用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,这样一次就能读取多个字节。
&&&&& 如果是读取多个字节,我们常常使用InputStream.available()方法来获取数据流中可读字节的个数。读取本地数据的时候,该方法发挥得非常好,但如果是读取非本地数据,就可能出现字节遗漏的问题,像是要读取100个字节,可能就是90个,甚至是0个。
&&&&& 出现0个的情况就是单片机那边没有响应或者字节还没发送过来,这时我们就需要一个循环来保证我们能够拿到数据:
int count = 0;
while (count == 0) {
count = in.available();
byte[] bytes = new byte[count];
in.read(bytes);
&&&&&&但像是上面的90个字节的情况就是字节遗漏。对于这种情况,解决方法也很简单:
byte[] bytes = new byte[count];
int readCount = 0; // 已经成功读取的字节的个数
while (readCount & count) {
readCount += in.read(bytes, readCount, count - readCount);
&&&&&&最好是这么写,因为Java的API已经明确的告诉我们,read()方法并不能保证读取到我们想要的字节数。&&&&& 这样我们就能解决16进制数据的发送和读取了。
阅读(...) 评论()菜鸟提问:手机上用java和蓝牙功能算不算prgs流量的啊?_百度知道
菜鸟提问:手机上用java和蓝牙功能算不算prgs流量的啊?
手机上用java和蓝牙功能算不算prgs流量的啊?
我有更好的答案
使用蓝牙是不算GPRS流量的JAVA的话,如果是单机的,也是不算流量的只有需要联网的 才会算GPRS流量。就跟单机游戏是不需要联网的,而网游是需要连网是一个意思的。一般如果要连入网络,它都会有提示的。
采纳率:57%
首先纠正你一下,那叫GPRS不是PRGS!蓝牙功能不会算流量的,就像对讲机不会收你话费一样JAVA也要看了,要连接网络的它会有提示的,没有的话那就不收流量费
不算的,除非用的java和蓝牙功能要访问网络的~比如Java的浏览器啊等等。。
JAVA程序与蓝牙都有网络网际服务功能,你所使用的JAVA程序,比如浏览器,交友平台等需要使用上网服务的程序,在联网后就开始计算GPRS流量。不联网则不会扣流量。蓝牙则是当电脑通过蓝牙的网络网际服务共享手机的上网功能,将会计算流量,蓝牙对蓝牙传输是独立的服务,不涉及上网功能,故不会扣除流量。
如果他有询问你是否连接互联网就可能要收费因为有些游戏要上网才能玩的= =+
不算,就像电脑。你用杀毒软件一样。他只在手机内部运行,不设计到移动的数据传送。
其他16条回答
为您推荐:
其他类似问题
您可能关注的内容
蓝牙功能的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 mac 蓝牙耳机声音输出 的文章

 

随机推荐