易安卓如何用蓝牙发送十六进制的4是多少hex数据?

闯荡江湖,行侠仗义.
蓝牙之数据传输问题
蓝牙数据传输问题
对于蓝牙来说google已经封装好了很多api所以使用起来并不会很难,但是实际开发中蓝牙开发最头疼的问题不是如何去调用api,而是数据的交互方面,如长连接,数据续传,硬件接受速率等问题.
打开蓝牙有几种方式?
首先我们先了解下几种常用的打开方式.
第一种方法相对简单,直接调用系统对话框启动蓝牙:
在AndroidManifest文件中添加需要的权限,高版本也不需要动态授权:
android:name="android.permission.BLUETOOTH" /&
//处理回调对话框
startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), 1);
第二种方法,静默开启,不会有方法一的对话框:
在AndroidManifest文件中添加需要的权限:
在AndroidManifest中配置需要的权限.
对于6.0的运行时权限进行适配,在java中动态授权.
最后直接调api开启
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
mBluetoothAdapter.enable();
如何搜索蓝牙设备?
搜索分为:主动搜索和被动搜索。
创建BluetoothAdapter对象
配对的蓝牙设备列表
定义发送接收广播
蓝牙的UUID是什么?有什么用?
UUID(Universally Unique Identifier) 统一表示定义.
蓝牙是通过串口发送AT命令,蓝牙默认是在数据模式的,要配置为AT命令模式,对其进行设置,不过UUID在出厂前是设置过的.
对于蓝牙设备,每个服务都有一个与它对应的UUID(唯一的).
信息同步服务:0-805F9B34FB
文件传输服务:0-805F9B34FB
如何使用蓝牙进行数据传输?
蓝牙模块通信最重要的地方就是数据的发送和接收,其传输数据与Socket类似。
在网络中使用Socket和ServerSocket控制客户端和服务端的数据读写。
而蓝牙通讯也由客户端和服务端Socket来完成。蓝牙客户端Socket是BluetoothSocket,蓝牙服务端Socket是BluetoothServerSocket。这两个类都在android.bluetooth包中。
无论是BluetoothSocket,还是BluetoothServerSocket,都需要一个UUID(全局唯一标识符,Universally Unique Identifier),UUID相当于Socket的端口,而蓝牙地址相当于Socket的IP。
实际开发中需要注意的地方.
需要注意的
1. 因为涉及涉及到I/O编程,所以需要注意两端的编码’utf-8’要一致.
2. 客户端与服务端的UUID也要相同.
3. 蓝牙属于底层数据传输,所以实际开发更多发送的是16进制数据.
4. 因为涉及到了I/O编程,所以对线程控制这块(同步,锁机制)需要注意使用.
5. 对于一些大容量字节数组的发送需要注意的地方.
6. 为了用户更好的体检避免流量的过度浪费,使用阻塞式的InputStream读取.
1. 因为涉及涉及到I/O编程,所以需要注意两端的编码’utf-8’要一致.
os.write("datas....".getBytes("utf-8"));
2. 客户端与服务端的UUID也要相同.
device.createRfcommSocketToServiceRecord(MY_UUID);
mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
3. 蓝牙属于底层数据传输,所以实际开发更多发送的是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();
5. 对于一些大容量字节数组的发送需要注意的地方.
我们需要发送64个字节的数组,如果一次性发送过去,单片机那里可能无法及时处理以致没有任何回应,因为单片机那里是设置了数据接收的延时时间。要想畅通的与蓝牙模块通信,考虑这个时间差非常重要。调整字节的发送速率,就成为非常关键的一步。值得注意的是,数据的发送是非常快的,就是因为这样才会导致单片机那里无法及时处理,所以,每次发送后的延时是非常重要的。我们单片机那里的延时是10毫秒,所以我们选择发送完每个字节后就延时10毫秒再发下个字节。
for (byte b : bytes) {
out.write(b);
Thread.sleep(10);
6.为了用户更好的体检避免流量的过度浪费,使用阻塞式的InputStream读取.
在使用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);
没有更多推荐了,android ble4.0发送16进制_百度知道
android ble4.0发送16进制
您的回答被采纳后将获得:
系统奖励15(财富值+成长值)+难题奖励30(财富值+成长值)
我有更好的答案
// byte转十六进制字符串public static String bytes2HexString(byte[] bytes) {String ret = &&;for (byte aByte : bytes) {String hex = Integer.toHexString(aByte & 0xFF);if (hex.length() == 1) {hex = '0' +}ret += hex.toUpperCase(Locale.CHINA);}}/** * 将16进制的字符串转换为字节数组 ** @param message * @return 字节数组 */public static byte[] getHexBytes(String message) {int len = message.length() / 2;char[] chars = message.toCharArray();String[] hexStr = new String[len];byte[] bytes = new byte[len];for (int i = 0, j = 0; j & i += 2, j++) {hexStr[j] = && + chars[i] + chars[i + 1];bytes[j] = (byte) Integer.parseInt(hexStr[j], 16);}}
为您推荐:
其他类似问题
您可能关注的内容
16进制的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。目标赋予我们生命的意义和目的。有了目标,我们才会把注意力集中在追求喜悦,而不是在避免痛苦上。...
android 蓝牙编程重点---如何发送和接收16进制数据
与蓝牙模块通信最重要的地方就是数据的发送和接收,因为是底层的操作,所以更多是发送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);
没有更多推荐了,&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
android 蓝牙编程重点---如何发送和接收16进制数据
摘要:最近的android蓝牙开发项目也逐渐接近尾声,基本的功能都已经完成,只剩下界面的设计。现在真的是舒了一口气!作为编程学习经验只有1年的菜鸟,这是我独自完成的商业性产品,而且还是涉及到与单片机蓝牙模块的底层通信,难度自然不小。最大的难度不是知识点不懂,而是调试,因为干扰因素实在是太多,很难找出是软件的问题还是硬件的问题,所以,在代码中一定要设置好调试点,以方便查询问题的症结点。线程也是一个考虑的因素。凡是涉及到I/O的编程,都是一个不小的难题,因为它里面会涉及到线程问题。ja
最近的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();} }
接下来就是发送数据。
发送数据非常简单,之前有关于蓝牙编程的博文已经讲到了,/content/3810025.html,这里只讲重要的一点:大容量字节数组的发送。
我们需要发送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进制数据的发送和读取了。
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
android 蓝牙编程重点---如何发送和接收16进制数据相关信息,包括
的信息,所有android 蓝牙编程重点---如何发送和接收16进制数据相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
Internationalandroid 蓝牙如何发送十六进制数据_百度知道
android 蓝牙如何发送十六进制数据
String Fr=&5A A5 04 01 00 05 AA&;
String Ba=&5A A5 04 02 00 06 AA&;
String Le=&5A A5 04 00 01 05 AA&;
String Ri=&5A A5 04 00 02 06 AA&;
String St=&5A A5 04 00 00 04 AA&;
我现在要用蓝牙串口发十六进制数据给单片机,数据...
我有更好的答案
确切讲你说到的发送是service下的write特性.传入数据前都需要将字符串转换成byte类型数组,然后crc校对;校对无误后拼入;这是转换工具类:public static byte[] hexStringToBytes(String hexString) {if (hexString == null || hexString.equals(&&)) {}hexString = hexString.toUpperCase();int length = hexString.length() / 2;char[] hexChars = hexString.toCharArray();byte[] d = new byte[length];for (int i = 0; i & i++) {int pos = i * 2;d[i] = (byte) (charToByte(hexChars[pos]) && 4 | charToByte(hexChars[pos + 1]));}}结合serviceUUID, characterUUID,写入蓝牙设备即可.
采纳率:70%
与蓝牙模块通信最重要的地方就是数据的发送和接收,因为是底层的操作,所以更多是发送16进制数据。进制转换是我们程序员的必修课,属于基本素质。这里需要的是将字节数组转化为16进制字符串,方法都是通用的:[java] view plain copy 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毫秒再发下个字节。[java] view plain copy 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个的情况就是单片机那边没有响应或者字节还没发送过来,这时我们就需要一个循环来保证我们能够拿到数据:[java] view plain copy int count = 0;
while (count == 0) {
count = in.available();
byte[] bytes = new byte[count];
in.read(bytes);
但像是上面的90个字节的情况就是字节遗漏。对于这种情况,解决方法也很简单:[java] view plain copy byte[] bytes = new byte[count];
int readCount = 0; // 已经成功读取的字节的个数
while (readCount & count) {
readCount += in.read(bytes, readCount, count - readCount);
发送十六进制数要转换成二进制才能发送。16进制转为二进制,方法就是一分四,即一个十六进制数分成四个二进制数,用四位二进制按权相加,最后得到二进制,小数点依旧即可。希望我能帮助你解疑释惑。
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 十六进制转换 的文章

 

随机推荐