ble 蓝牙在Read方法中读取数据每次只能读取一次,怎么做可以循环读取? 10C

ble蓝牙开发中我们onServicesDiscovered()方法中遍历服务后并且设置数据,然后再onCharacteristicRead()方法中读取数据,然而在读取的方法中每次只能自动读取一次,只有当有数据变化时才会再次读取,但是我想一次读取多个数据,不需要其他的操作,代码怎么实现?下面是我在读取方法中写的,每次只能读取一个数据。求大神帮帮忙?

   List<BluetoothGattService> services = gatt.getServices();
                for (BluetoothGattService s : services) {
                    List<BluetoothGattCharacteristic> gattCharacteristicss = s.getCharacteristics();
                    for (int i = 0; i < gattCharacteristicss.size(); i++) {
                        BluetoothGattCharacteristic gattCharacteristic = gattCharacteristicss.get(i);
                        Log.e("000", "gattCharacteristicss:" + i + ":" + gattCharacteristic.getUuid().toString());
                        if (gattCharacteristic.getUuid().toString().equals(SampleGattAttributes
                                .GAMESIR_BLE_CHARACTERISTICS_X1_Manifacturer)) {

                            try {
                                manifacturer = new String(gattCharacteristic.getValue(), "UTF-8");
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
                            Log.e("000", "Manifacturer:" + manifacturer);

                        }

//
                        if (gattCharacteristic.getUuid().toString().equals(SampleGattAttributes
                                .GAMESIR_BLE_CHARACTERISTICS_X1_Software)) {

                            try {
                                software = new String(gattCharacteristic.getValue(), "UTF-8");
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
                            Log.e("000", "Software:" + software);
                        }

                        else if (gattCharacteristic.getUuid().toString().equals(SampleGattAttributes
                                .dISHardwareREV_UUID)) {

                            try {
                                hardware = new String(gattCharacteristic.getValue(), "UTF-8");
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
                            Log.e("000", "Hardware:" + hardware);
//
                        }
                        else if (gattCharacteristic.getUuid().toString().equals(SampleGattAttributes
                                .GAMESIR_BLE_CHARACTERISTICS_X1_FIRMWARE)) {

                            try {
                                version = new String(gattCharacteristic.getValue(), "UTF-8");
                                Log.e("000", "firmware_version数据1:" + version);
                                UpdateUiUtil.setFirmWare(version);
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
////////
                        }
                        else if (gattCharacteristic.getUuid().toString().equals(SampleGattAttributes
                                .dISSerialNR_UUID)) {

                            try {
                                serial = new String(gattCharacteristic.getValue(), "UTF-8");
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
                            Log.e("000", "Serial:" + serial);
                        } else if (gattCharacteristic.getUuid().toString().equals(SampleGattAttributes
                                .dISModelNR_UUID)) {

                            try {
                                model = new String(gattCharacteristic.getValue(), "UTF-8");
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
                            Log.e("000", "Model:" + model);
//
                        } else if (gattCharacteristic.getUuid().toString().equals(SampleGattAttributes
                                .dISSystemID_UUID)) {

                            try {
                                systemID = new String(gattCharacteristic.getValue(), "UTF-8");
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
                            Log.e("000", "SystemID:" + systemID);
                        }

hanfengwuyu
某-某 onCharacteristicChanged,在这个回调里返回数据,可能是多条。我的做法是,在onCharacteristicChanged里面调用readCharacteristic(characteristic);然后把返回的数据,除了第一条都拼一起(第一条是你发送的数据),然后在onCharacteristicRead这个回调里面,吧拼好的byte[],发到你要用的地方,并且清除数据。
10 天之前 回复

2个回答

onCharacteristicChanged,在这个回调里返回数据,可能是多条。我的做法是,在onCharacteristicChanged里面调用readCharacteristic(characteristic);然后把返回的数据,除了第一条都拼一起(第一条是你发送的数据),然后在onCharacteristicRead这个回调里面,吧拼好的byte[],发到你要用的地方,并且清除数据。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
读取BLE蓝牙特征命令
LE Read Local Supported Features Command   代码路径:    system\bt\stack\include\hcidefs.h /* ** LE features encoding - page 0 (the only page for now) */ /* LE Encryption */ #define HCI_LE_FEATURE_LE...
关于read()读取的方法
请问read()不是读取下一个字节吗 ,它的返回值是int类型的,那为什么在system.out.print(b);可以输出读取的字节,rn这一点心我定义了int b=input.read()把的返回值给b了;
java InputStream中read()方法每次读取一个字节数据
import java.io.File; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.Date; import java.io.OutputStream; import java.io.FileOutputStream; import java.io.FileInputStream...
关于蓝牙4.0 BLE读取电量的问题
private void displayGattServices(List gattServices)n if(gattServices == null) return;n String uuid = null;n for(BluetoothGattService gattService : gattServices)n uuid = gattService.getUuid().toString();n if(uuid.equalsIgnoreCase(BATTERY_SERVICE))n String uuid_charas = null;n List gattCharacteristics = gattService.getCharacteristics();n for(BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics)n uuid_charas = gattCharacteristic.getUuid().toString();n if(uuid_charas.equalsIgnoreCase(BATTERY_CHARATERISTIC))n final int charaProp = gattCharacteristic.getProperties();n if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) n if (mNotifyCharacteristic != null) n mBluetoothLeService.setCharacteristicNotification(mNotifyCharacteristic, false);n mNotifyCharacteristic = null;n n mBluetoothLeService.readCharacteristic(gattCharacteristic);n n if ((charaProp | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) n mNotifyCharacteristic = gattCharacteristic;n mBluetoothLeService.setCharacteristicNotification(gattCharacteristic, true);n n n n n n n nprivate void broadcastUpdate(String action,BluetoothGattCharacteristic characteristic)n final Intent intent = new Intent(action);n if(UUID_HEART_RATE_MEASUREMENT.equals(characteristic .getUuid()))n int flag = characteristic.getProperties();n int format = -1;n if((flag&0x01) != 0)n format = BluetoothGattCharacteristic.FORMAT_UINT16;n else n format = BluetoothGattCharacteristic.FORMAT_UINT8;n n final int heartRate = characteristic.getIntValue(format,1);n intent.putExtra(EXTRA_DATA,String.valueOf(heartRate));n else n final byte[] data = characteristic.getValue();n if(data != null && data.length >0)n final StringBuilder stringBuilder = new StringBuilder(data.length);n for(byte byteChar: data)n stringBuilder.append(String.format("%02X",byteChar));n intent.putExtra(EXTRA_DATA,new String(data)+"\n"+stringBuilder.toString());n n n sendBroadcast(intent);n n 读取到了电量的特征值,但是显示d 64,怎么让它解析成百分比的形式显示在text文本?求各位大侠拔刀相助!~
request.getInputStream()只能读取一次的解决方案
最近,接手一个相关项目,而前端传递参数都是已json方式,在拦截器中要对某个必传参数进行校验,我就使用request.getInputStream(),这样到了controller时,对象属性都为空,后来确定问题是由于request.getInputStream()只能够读取一次。但是在实际的开发中往往需要多次读取。这样就需要我们将流写入进去,提供后续使用。方法可能有很多, 1:创建Req...
流只能读取一次的问题
    问题描述,直接看图 上一段测试代码 public void test() { //string url = &quot;https://ssl.ptlogin2.qq.com/ptqrshow?appid=501004106&amp;amp;e=0&amp;amp;l=M&amp;amp;s=5&amp;amp;d=72&amp;amp;v=4&amp;amp;t=#{t}&quot;; ...
AS3.0中SharedObject只能读取一次
btn_save.addEventListener(MouseEvent.CLICK,btn_saveclick);rn//保存功能;rnfunction btn_saveclick(e:MouseEvent)rnrn chess_stay.data.chess_x = x2;//保存每一步下棋的坐标 rn chess_stay.data.chess_y = y2;//保存每一步下棋的坐标 rn chess_stay.data.chessStep = q;//保存棋子的步数 rn chess_stay.data.bb = aa;//保存棋子的状态 rn chess_stay.flush();rn chess_stay.close();rn //chess_stay=null;rn txt3.text="";rn txt1.text = "保存成功!";rnrnbtn_read.addEventListener(MouseEvent.CLICK,btn_readclick);rn//读取功能;rnfunction btn_readclick(e:MouseEvent)rnrn //btn4click(e);//调用重新开始的函数rn q = chess_stay.data.chessStep;rn x2 = chess_stay.data.chess_x;rn y2 = chess_stay.data.chess_y;rn aa = chess_stay.data.bb;rn chess_stay.close();rn //chess_stay=null;rn}rn我在做一个五子棋的游戏,我保存后必须得把游戏关了再开才能读取出来,读取完后其他参数都没变就是数组bb里面的东西全被清0了。如果保存后清空棋盘再读取出来就什么都没有。求大神帮忙指点一下谢谢
有没有可以循环读取字段 = i 的方法?
我有个字段 type 是整形枚举值 rn我要把 匹配所有类型的数据找出来比如rnrnselect .....where type = 0rnselect......where type = 1 rn................................. rnselect..........................= 20rnrn然后返回一个 datatable rn原先我是有几个枚举 我就写几行 我想问下 有没有类似循环的方法 where type = i 让这个 i 从0到20
解决android端Ble蓝牙每次只能接收 20字节的 方法类
仅供参考 自行 修改
关于android读取BLE设备信息
研究了半个月的扫描蓝牙设备信息,从开始的不明白为什么读取不到任何的信息,到后来慢慢的深入,中间走了很多的弯路,总结一下,以后的自己遇到不至于忘了这会测试的一切。 1、开始使用的是旧的apimBluetoothAdapter.startLeScan(mLeScanCallback)启动的扫描,发现在一些设备上面运行很正常,可能运行一天也不会中断,其中在6.0的机子上面运行,总会出现一段时间的中断,
循环读取数据表的内容的方法?
怎么样能够高效率地循环读取SQL表里的数据,需要获取某几个字段的值!
求助SqlDataReader对象 只能读取一行,无法循环读取!??
public IList GetAllUsers()rn rn UserRoleService userRoleService = new UserRoleService();rn UserStateService userStateService = new UserStateService();rnrn SqlDataReader dataReader = null;rn List list = new List();rn tryrn rn dbHelper.RunProc("Get_AllUsers", out dataReader);rn while (dataReader.Read())rn rn User user = new User();rn user.Id = (int)dataReader["Id"];rn user.LoginId = (string)dataReader["LoginId"];rn user.LoginPwd = (string)dataReader["LoginPwd"];rn user.Name = (string)dataReader["Name"];rn user.Address = (string)dataReader["Address"];rn user.Phone = (string)dataReader["Phone"];rn user.Mail = (string)dataReader["Mail"];rn user.UserRole = userRoleService.GetUserRoleById((int)dataReader["UserRoleId"]);rn user.UserState = userStateService.GetUserStateById((int)dataReader["UserStateId"]);rnrn list.Add(user);rn rn dataReader.Close();rn return list;rn rn catch (Exception ex)rn rn Console.WriteLine(ex.Message);rn throw ex;rn rn rn 说明:RunPoc运行存储过程方法。rn 出现抛出异常,未将对象引用到实例,rn 把 while(dataReader.Read()) 改成 if(dataReader.Read())即前台正常读出一行数据。为什么只能读出第一行数据?rn 急啊,求助下,我怎么也找不出为什么来。
有关inputstream流只能读取一次的问题
最近在学习servlete,无意中发现在以post方法提交表单信息后,在servlet端用getInputStream()接收实体信息后,再用getParameter()获取是,发现为null.我就十分困惑。代码如下                //post获取实体信息    getinputstream InputStream in = request.getInputStream
如何循环读取文本文件所有行(一次读取一行)??
如何循环读取文本文件所有行(一次读取一行)??
在SpringMVC框架下HttpServletRequest inputStream只能读取一次的问题
场景描述:在异常日中打印请求url和请求传入的参数 采用的方式:使用slf4j+logback管理日志,在进入controller前将参数放入MDC中,在logba.xml中使用&amp;lt;pattern&amp;gt;%d  - %X{requestBody} - %X{requestUrl} - %msg%n&amp;lt;/pattern&amp;gt;输入日志 遇到问题:1、在获取body需采用获取request...
浅谈request.getinputstream只能读取一次的问题
首先,我们复习一下InputStream read方法的基础知识,   java InputStream read方法内部有一个,postion,标志当前流读取到的位置,每读取一次,位置就会移动一次,如果读到最后,InputStream.read方法会返回-1,标志已经读取完了,如果想再次读取,可以调用inputstream.reset方法,position就会移动到上次调用mark的位置,ma
解决request.getInputStream()只能读取一次的问题
request.getInputStream()只能够读取一次,但是在实际的开发中往往需要多次读取。这样就需要我们将流写入进去,提供后续使用。方法可能有很多, 这里提供其中一种! 1:创建HttpHelper类获取流中的数据。 public class HttpHelper { /** * 获取请求Body * @param request * @re
SqlServer7的text字段为何只能读取一次。
一条记录有两个text字段,读取第一个text字段时正常,读取第二个text字段时就出错。rn若先读取其他类型的字段,再读取text字段,正常。若先读取text字段,再读取其他类型的字段,返回值为空了。rn大侠们碰到过这情况吗?rn我是用adodb,odbc来连接的
read读取错误
System.InvalidOperationException: 阅读器关闭时 Read 的尝试无效,请教高手。rnrn报错部分:while(dr.Read())rnrn部分代码如下:rnrnrn private void Page_Load(object sender, System.EventArgs e)rn rn // 在此处放置用户代码以初始化页面rn if(!IsPostBack)rn rn System.Data.SqlClient.SqlDataReader dr;rn this.sqlConnection1.Open();rn dr = this.cmdGetAll.ExecuteReader();rn bool firstrow=true;rn while(dr.Read())rn rn ddlID.Items.Add(new ListItem(dr[0].ToString()));rn if(firstrow)rn rn txtName.Text=(string)dr["FirstName"];rn txtAddress.Text=(string)dr["LastName"];rn firstrow=false;rnrn rn dr.Close();rn this.sqlConnection1.Close();rn rn rn
Linux:read读取控制台输入
命令:read -t 10 -p "输入一个数字" num 一、基本语法 read(选项)(参数) 选项: -p:指定读取值时的提示符; -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。 参数 变量:指定读取值的变量名 应用实例 案例1:读取控制台输入一个num值 案例2:读取控制台输入一个num值,在10秒内输入。 ...
read 读取丢失
一个网络+串口程序。rnrn read()时,有时会读取不到来自串口的数据。rn 从网络收到命令后发给串口,此时串口会返回一些字符串,read()在一个线程里面,一直在跑,但是现在在ARM上,发两次才能收到一次的回复。采用的是非阻塞模式,因为是多线程程序。rn 奇怪的是相同的程序在PC上可以正常运行。 rn 这是什么原因?内核?编译器版本?应用程序本身?还是CPU的频率问题?
BLE蓝牙
这么说不对,但是我觉得这么理解比较好理解,蓝牙分为重量级和轻量级,轻量级的连接是在蓝牙4.0以上才有的,也就是 BLE技术 , 而Android是在API 18 也就是4.3以上才支持蓝牙4.0技术。BLE更省电,连接速度更快,使用3个连接通道,而普通的蓝牙连接则使用了32个,下面就来介绍着两种方式。重量级蓝牙- BluetoothManager - BluetoothAdapter - Bluet
Ble蓝牙
蓝牙 1.分类 传统蓝牙 低功耗蓝牙(ble) 2.API版本 传统蓝牙: 4.3(API&amp;lt;18)以下 低功耗蓝牙:4.3(API&amp;gt;=18)以上 3.低功耗蓝牙较传统蓝牙的的特点: 数据传输速度相比传统蓝牙低 覆盖范围更广 延迟更短 耗电低,快速搜索和等 4.蓝牙设备中存在着一个mac地...
一次循环读取1万条数据
求代码
读取数据无法读取出来。
我通过GridView来读取出当前行的ID了,rn[code=C#]rnprotected void LinkButton1_Click(object sender, EventArgs e)rn rn string sid;rn sid = ((LinkButton)sender).CommandArgument.ToString(); //这里获取到ID,已经测试输出sid的值为该行IDrn string sql;rn SqlConnection myconn;rn SqlCommand mycommand;rn myconn = new SqlConnection(ConfigurationManager.ConnectionStrings["dbs"].ConnectionString);rn sql = "select tname from users where id = '" + sid +"'" ; rn mycommand = new SqlCommand(sql, myconn);rn myconn.Open();rn SqlDataReader aaa = mycommand.ExecuteReader();rn Response.Write(aaa);rn rn rn rn rn[/code]rnrn现在输出aaa的值无法输出,我很菜希望能帮忙。分数少见谅
关于在读取输入流时的while循环和read方法
int len = 0 ; rnbyte[] buf = new byte[100];rnwhile((len=System.in.read(buf))!=-1)rn System.out.print(new String(buf,0,len));rnrnrn这是一段读取键盘输入并打印到屏幕的程序,在while循环里我一直不明白为什么要加上(len=System.in.read(buf))!=-1rn来做判断,按照我的理解,read(byte [])方法,本身就返回了一个整型变量,我直接这样写:rnwhile(System.in.read(buf)!=-1)rn System.out.print(new String(buf,0,len));rnrn不就已经把判断的条件写的很明白了吗,可是这样写运行之后发现并没有出现我想要的结果。rn另外,len=System.in.read(buf)本身是一个赋值语句,它的返回值是什么?用它和-1比较来作为while循环的条件,有意义?
InputStream的read方法读取字节不完全的解决方案
InputStream的read方法读取字节不完全的解决方案
怎么读取数据一个简单路径读取方法
现在数据有一组路径我想读取最后一个文件名是什么啊!rn比如 rnadmin/user/9d32/shop/[color=#FF0000]5_jpg!640x451[/color] rn要如何找到[color=#FF0000]5_jpg!640x451[/color] rnrnrnadmin/user/28091836d64caf/shop/[color=#FF0000]21862-87631_jpg!640x423[/color]rnrn找到 [color=#FF0000]21862-87631_jpg!640x423[/color]
android蓝牙BLE 通信,通过characteristic写入及读取
android蓝牙BLE 通信,通过characteristic写入及读取
Android蓝牙BLE开发,扫描、连接、发送和读取信息;
1、BLE开发权限 Android蓝牙BLE开发须打开蓝牙权限和6.0位置权限; &lt;uses-permission android:name="android.permission.BLUETOOTH" /&gt; &lt;uses-permission android:name="android.permission.BLUETOOTH...
如何读取BLE的数据?请教
小白,刚接触ble4.0,在网上看了很多资料都是讲一些基础,参照官方demo写了一个类似的demo。n想做一个app显示ble上的电量,步数,体重等信息该在哪写方法,这些服务的UUID在哪找,有没有写过的能不能给个demo。
JAVA中有关inputstream中的read方法读取中文乱码的问题
java中用fileinputstream中的read方法读取一个文件中的数据并打印出来,文件中的中文打印出来后会出现乱码现象。据说是因为inputstream是字节流,read方法每次只能读取一个字节的数据,而中文在java中是用两个字节表示的,相当于只读了一半,所以打印不出来。这样分析看似很有道理,但是我查了一下,java采用的是unicode编码,所以字符都是用两个字节表示的,这样的话问题就出来了:为什么同是两个字节表示,中文读一半打印不出来,而英文却可以呢
蓝牙文件接收和读取
蓝牙文件接收在哪儿,怎么利用这些数据做运算rn
NFC读取蓝牙地址
利用NFC读取蓝牙地址,后期可用于简化蓝牙配对
蓝牙串口读取问题
代码如下,我对java串口编程没有经验,我用的是别人的代码。实际上我要实现的是利用蓝牙连接到型号为HOLUX M-241的GPS。我已经配置好了蓝牙端口,在设备管理器中也可以看到COM5端口为蓝牙端口。用厂商的软件连接COM5口在输入密钥后也可以脸上。问题是我自己想连为什么连不上呢?以下代码中运行到 while (portList.hasMoreElements()) 就卡住了。protList始终获取不到新元素。如果强行去除掉这句则运行到if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)会报错。请教我该如何连接到该端口?rnrn[code=Java]rnprivate void connectToGPS() rnrn portList = CommPortIdentifier.getPortIdentifiers();rn while (portList.hasMoreElements()) rn portId = (CommPortIdentifier) portList.nextElement();rn if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) rn //com is foundrn if (portId.getName().equals(GPSPort)) rn System.out.println("GPS PORT " + GPSPort + " is found");rn try rn sPort = (SerialPort) portId.open("GPS", TIMEOUT);rn inputStream = sPort.getInputStream();rn sPort.addEventListener(this);rn sPort.notifyOnDataAvailable(true);rn sPort.setSerialPortParams(BAUDRATE,rn SerialPort.DATABITS_8,rn SerialPort.STOPBITS_1,rn SerialPort.PARITY_NONE);rn catch (PortInUseException e) rn e.printStackTrace();rn catch (IOException e) rn e.printStackTrace();rn catch (TooManyListenersException e) rn e.printStackTrace();rn catch (UnsupportedCommOperationException e) rn e.printStackTrace();rn rn this.jLabel4.setText("GPS Device connected at port " + GPSPort);rn this.isGPSConnected = true;rn rn //end of if rnrn //end of whilernrn rn[/code]
每次读取一行字符串输入
每次读取一行的字符串输入 getline() get()
一次读取INI中的部分内容
ini文件内容如下:rnrn[Items]rnCCA rnCCBrnCCCrnCC2rnrn读取Items下面的内容到ListBox里面.rn如何操作呢?
delphi 中循环读取记录
在delphi中使用ADOQuery 执行SELECT * FROM table 程序会卡老半天(数据库有50MB),不知道delphi中是否有类似于C# 中的DataReader 每次读取一条记录?请各位大侠指教
循环读取xml中的数据
d = Server.CreateObject("Msxml2.DOMDocument")rnd.async=falsernd.load("c:/match.xml")rn'开始循环..............................rnResponse.Write d.selectSingleNode("//versus/name").textrnResponse.Write d.selectSingleNode("//versus/pass").textrnResponse.Write d.selectSingleNode("//versus/add").textrnrnrn.........................rn
如何让 hibernate 每次读取数据从数据库实时读取,而不是从SESSION中读取??
如何让 hibernate 每次读取数据从数据库实时读取,而不是从SESSION中读取??
相关热词 c# stream 复制 android c# c#监测窗口句柄 c# md5 引用 c# 判断tabtip 自己写个浏览器程序c# c# 字符串变成整数数组 c#语言编程写出一个方法 c# 转盘抽奖 c#选中treeview