BLE黑屏后导致APP崩溃

场景1:手机刚刚重启完,运行APP与BLE设备通信,正常无问题(任何情况)
场景2:中断当前BLE操作,退出APP,然后重新与BLE设备通信,一旦把APP切换到后台并黑屏,APP会在几秒内崩溃,logcat没任何错误输出

求大神解答,跪求,以下是捕抓的bug输出(bugly也抓不到),但是重启手机后第一次正常操作,往后就一直会出现描述的问题
04-18 17:58:03.578 2971-3014/? E/BluetoothServiceJni: An exception was thrown by callback 'btgattc_notify_cb'.
04-18 17:58:03.578 2971-3014/? E/BluetoothServiceJni: android.os.DeadObjectException
at android.os.BinderProxy.transact(Native Method)
at android.bluetooth.IBluetoothGattCallback$Stub$Proxy.onNotify(IBluetoothGattCallback.java:835)
at com.android.bluetooth.gatt.GattService.onNotify(GattService.java:724)
at dalvik.system.NativeStart.run(Native Method)
04-18 17:58:03.578 2971-3014/? D/BtGatt.btif: btif_gattc_upstreams_evt: Event 10
04-18 17:58:03.578 2971-3014/? E/bt-btif: HAL bt_gatt_callbacks->client->notify_cb
04-18 17:58:03.578 2971-3014/? D/BtGatt.GattService: onNotify() - address=F0:C7:7F:73:68:20, charUuid=0000ffb2-0000-1000-8000-00805f9b34fb, length=19
04-18 17:58:03.578 2971-3014/? E/BluetoothServiceJni: An exception was thrown by callback 'btgattc_notify_cb'.
04-18 17:58:03.578 2971-3014/? E/BluetoothServiceJni: android.os.DeadObjectException
at android.os.BinderProxy.transact(Native Method)
at android.bluetooth.IBluetoothGattCallback$Stub$Proxy.onNotify(IBluetoothGattCallback.java:835)
at com.android.bluetooth.gatt.GattService.onNotify(GattService.java:724)
at dalvik.system.NativeStart.run(Native Method)
04-18 17:58:03.578 2971-2982/? D/BtGatt.GattService: Binder is dead - unregistering client (6)!
04-18 17:58:03.578 2971-2982/? D/BtGatt.GattService: stopScan() - queue=0
04-18 17:58:03.578 2971-2982/? D/BtGatt.GattService: stopScan() - queue empty; stopping scan
04-18 17:58:03.578 2971-2982/? D/BtGatt.btif: btif_gattc_scan
04-18 17:58:03.578 2971-2982/? D/BtGatt.GattService: unregisterClient() - clientIf=6
04-18 17:58:03.578 2971-2982/? D/BtGatt.btif: btif_gattc_unregister_app
04-18 17:58:03.578 2971-3014/? D/BtGatt.btif: btgattc_handle_event: Event 1003
04-18 17:58:03.578 2971-3014/? D/BtGatt.btif: btgattc_handle_event: Event 1001
04-18 17:58:03.578 2971-3088/? W/bt-l2cap: L2CA_RemoveFixedChnl() CID: 0x0004 BDA: f0c77f736820 not connected
04-18 17:58:03.578 1156-1539/? D/KeyguardViewMediator: setHidden false
04-18 17:58:03.578 1156-1539/? D/KeyguardUpdateMonitor: sendKeyguardVisibilityChanged(true)
04-18 17:58:03.578 1156-1156/? D/KeyguardUpdateMonitor: handleKeyguardVisibilityChanged(1)
04-18 17:58:03.578 2971-3014/? D/BtGatt.btif: btif_gattc_upstreams_evt: Event 5
04-18 17:58:03.578 2971-3014/? E/bt-btif: HAL bt_gatt_callbacks->client->close_cb
04-18 17:58:03.578 2971-3014/? D/BtGatt.GattService: onDisconnected() - clientIf=6, connId=6, address=F0:C7:7F:73:68:20
04-18 17:58:03.578 2971-3014/? E/BtGatt.ContextMap: Context not found for ID 6

2个回答

android ble很多坑,你只要理解了android ble具体的通信流程就会找到问题,我也做android ble应用,一堆坑,我现在单个连接通信没什么问题,一旦
重复连接,多个设备,会发现有时无法完全断开,反正闹心

以前研究过一段时间Android,当然现在不做了,主要做后台,我记得AndroidApp它的Activity或者fragment是有生命周期的!退出app是调用了stop方法,好像,退到后台是调用的休眠还是等待忘了,呢个方法,从App从后台状态到显示状态好像会走3个方法,其中一个是onResume,所以你要考虑的情况是如果在后台的时候,在调用方法之前我应该做什么事?保存什么数据?,在从后台到显示,我应该恢复什么数据?这些我觉得是必要的,当然现在不做这个了,可能还不对那,另外,其实我觉得你的这种情况不建议用Activity或者Fragment,可以用服务(service)来做,反正你在后台的时候也需要运行啊,但是Activity在后台就会进入"休眠"状态,所以我觉得用服务(service)来解决最好,我记得Android有4大核心组件,Activity,Service,BroadCastReceiver(单词可能拼错,太长了),还有一个忘了,

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
iOS app 开发,怎么对ble特征描述,写入长数据。
1. 问题描述: ios version 12 版本的手机,写 ble 特征描述,有长度限制(maxium: 182 byte) 2. 尝试过的方法: 分包发数据,但是写入后再读取,发现数据是不完整的,是最后一包的内容 ``` if (@available(iOS 13.0, *)) { [self.delegate bleDataWithData:textData]; } else { NSInteger datacount = 160; NSInteger number = textData.length / datacount + ((textData.length % datacount)>0? 1:0); for(NSInteger i = 0; i < number; i++){ if (i == number-1){ [self.delegate bleDataWithData:textData]; } else { NSData *data = [textData subdataWithRange:NSMakeRange(0, datacount)]; [self.delegate bleDataWithData:data]; textData = [textData subdataWithRange:NSMakeRange(datacount, textData.length-datacount)]; } } } ``` 求助大神们怎么实现写入超过长度的数据?
android BLE 扫描添加过滤后扫描不到设备
android BLE扫描设备不添加过滤是正常的,可以扫到设备(定位权限已开启) 一旦添加过滤后无法扫描得到设备。我是通过服务UUID进行过滤的。 我试过BluetoothLeScanner的startScan方法,也用过BluetoothAdapter的startLeScan方法。 两种方法在不添加过滤都是可以扫描到设备的。
win10系统,VS2017 winfrom无法找到Windows.Devices.Bluetoot,怎么解决?
公司用的激光测距的玩意,刚开始用的InTheHand.Net.Personal这个开发结果发现怎么都找不到我的设备,查找位置发现是BLE蓝牙,OK,虽然不知道这是什么,咱可以搜啊,问然后题来了,我找不到Windows.Devices.Bluetooth这个破玩意,继续找资料,卸载修改![图片说明](https://img-ask.csdn.net/upload/202001/04/1578129591_334787.png) 然后添加,然后崩溃的事情来了,![图片说明](https://img-ask.csdn.net/upload/202001/04/1578129702_840545.png)什么都没有,好吧去本地搜,system32下,找到了,添加,然后还是出错![图片说明](https://img-ask.csdn.net/upload/202001/04/1578129867_949933.png),这我就没什么办法了。哪位有过处理这方面的经验,或者其他方法还请指教,谢谢,不胜感激。
BLE的UUID是不是固定的?
请问,不同的硬件BLE设备,它们的Service和Characteristic的UUID是不是都是一样的? 最近写app做练习,在连接BLE模块时,可以正常收发信息,但是连接了另一个BLE设备时,会短暂连接后马上崩溃。下面是AS的报错, ``` E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.administrator.mi_home, PID: 5569 java.lang.RuntimeException: Error receiving broadcast Intent { act=com.example.bluetooth.le.ACTION_GATT_SERVICES_DISCOVERED flg=0x10 } in com.example.administrator.mi_home.DeviceFragment.OneDeviceFragment$1@c064ebc at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:1228) at android.os.Handler.handleCallback(Handler.java:761) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:156) at android.app.ActivityThread.main(ActivityThread.java:6523) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.UUID android.bluetooth.BluetoothGattCharacteristic.getUuid()' on a null object reference at android.bluetooth.BluetoothGatt.setCharacteristicNotification(BluetoothGatt.java:1104) at com.example.administrator.mi_home.Service.BleService.setCharacteristicNotification(BleService.java:175) at com.example.administrator.mi_home.DeviceFragment.OneDeviceFragment$1.onReceive(OneDeviceFragment.java:141) at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:1218) at android.os.Handler.handleCallback(Handler.java:761)  at android.os.Handler.dispatchMessage(Handler.java:98)  at android.os.Looper.loop(Looper.java:156)  at android.app.ActivityThread.main(ActivityThread.java:6523)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)  ``` 提示有个空指针异常, ``` mBluetoothGatt.setCharacteristicNotification(characteristic, enabled); // 关键代码 ```
BLE蓝牙如何手动分包发送数据?
从设备需要1s内发送4k数据,如果使用NTF 协议限制每次20字节,如何手动分包? 如果是主设备主动发送读命令,更改MTU后是不是一次最多能读512?
ble 扫描得到的设备类型改变,导致无法连接
mBluetoothDevice.gettype得到的类型正常情况是DEVICE_TYPE_LE = 2 , 但是在经过几次扫描连接操作后,gettype变成了 DEVICE_TYPE_DUAL, 导致设备再去连接的时候一直连接不上,错误就是133, 但是如果重新开关一下手机蓝牙,得到的设备类型又恢复正常,此时就可以重新连接,我想问问,为什么设备类型在变化,怎么让他一直保持不变,或者变化后也可以连接
android开发BLE蓝牙时蓝牙连接不稳定会自动断开重连
搜索、通讯均正常,只是连接不正常 public void onCreate(){ super.onCreate(); // Initializes a Bluetooth adapter. For API level 18 and above, get a reference to // BluetoothAdapter through BluetoothManager. final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = bluetoothManager.getAdapter(); // Checks if Bluetooth is supported on the device. if (mBluetoothAdapter == null) { Toast.makeText(this, "没有蓝牙", Toast.LENGTH_SHORT).show(); stopSelf(); return; } if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)){ Toast.makeText(this, "不支持BLE", Toast.LENGTH_SHORT).show(); stopSelf(); return; } } @Override public void onDestroy(){ if(mBluetoothGatt != null){ mBluetoothGatt.close(); } mBluetoothGatt = null; super.onDestroy(); } @Override public boolean onUnbind(Intent intent){ if(mBluetoothGatt != null){ mBluetoothGatt.close(); } mBluetoothGatt = null; return super.onUnbind(intent); } // Device scan callback. private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) { String str = device.getName() + "|" + device.getAddress(); LogUtil.d(TAG, "get BluetoothDevice.ACTION_FOUND:" + str); sendLocalBroadcast(ACTION_SCAN_FOUND,str); } }; public void startScan(){ Handler mHandler = new Handler(); mHandler.postDelayed(new Runnable() { @Override public void run() { stopScan(); } },SCAN_PERIOD ); LogUtil.d(TAG, "get startScan"); mScanning = true; mBluetoothAdapter.startLeScan(mLeScanCallback); sendLocalBroadcast(ACTION_SCAN_STARTED); } public void stopScan(){ if(mScanning){ LogUtil.d(TAG, "get stopScan"); mScanning = false; mBluetoothAdapter.stopLeScan(mLeScanCallback); sendLocalBroadcast(ACTION_SCAN_FINISHED); } } public void findService(List<BluetoothGattService> gattServices) { Log.i(TAG, "Count is:" + gattServices.size()); for (BluetoothGattService gattService : gattServices) { Log.i(TAG, gattService.getUuid().toString()); Log.i(TAG, UUID_SERVICE.toString()); if(gattService.getUuid().toString().equalsIgnoreCase(UUID_SERVICE.toString())) { List<BluetoothGattCharacteristic> gattCharacteristics = gattService.getCharacteristics(); Log.i(TAG, "Count is:" + gattCharacteristics.size()); for (BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) { if(gattCharacteristic.getUuid().toString().equalsIgnoreCase(UUID_NOTIFY.toString())) { Log.i(TAG, gattCharacteristic.getUuid().toString()); Log.i(TAG, UUID_NOTIFY.toString()); mNotifyCharacteristic = gattCharacteristic; setCharacteristicNotification(gattCharacteristic, true); //broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED); return; } } } } } // Implements callback methods for GATT events that the app cares about. For example, // connection change and services discovered. //设备连接 private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { String intentAction; Log.i(TAG, "oldStatus=" + status + " NewStates=" + newState); if(status == BluetoothGatt.GATT_SUCCESS) { if (newState == BluetoothProfile.STATE_CONNECTED) { intentAction = ACTION_CONNECTED; sendLocalBroadcast(intentAction); Log.i(TAG, "Connected to GATT server."); // Attempts to discover services after successful connection. Log.i(TAG, "Attempting to start service discovery:" + mBluetoothGatt.discoverServices()); } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { intentAction = ACTION_DISCONNECTED; mBluetoothGatt.close(); mBluetoothGatt = null; Log.i(TAG, "Disconnected from GATT server."); sendLocalBroadcast(intentAction); } } } //发现服务 @Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { Log.w(TAG, "onServicesDiscovered received: " + status); findService(gatt.getServices()); } else { if(mBluetoothGatt.getDevice().getUuids() == null) Log.w(TAG, "onServicesDiscovered received: " + status); } } @Override public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { byte[] bufRecv = characteristic.getValue(); int nRecv = bufRecv.length; if(nRecv > 1024 + nReadPtr - nRecvPtr) nRecv = 1024 + nReadPtr - nRecvPtr; if(nRecv + nRecvPtr <= 1024){ System.arraycopy(bufRecv, 0, bRecv, nRecvPtr, nRecv); nRecvPtr += nRecv; } else{ System.arraycopy(bufRecv, 0, bRecv, nRecvPtr, 1024-nRecvPtr); System.arraycopy(bufRecv, 1024-nRecvPtr, bRecv, 0, nRecv - (1024-nRecvPtr)); nRecvPtr = nRecv - (1024 - nRecvPtr); } sendLocalBroadcast(ACTION_DATA_RECV); } } /** * 发送数据后的回调 * @param gatt * @param characteristic * @param status */ @Override public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { Log.e(TAG, "OnCharacteristicWrite"); } @Override public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor bd, int status) { Log.e(TAG, "onDescriptorRead"); } @Override public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { byte[] bufRecv = characteristic.getValue(); int nRecv = bufRecv.length; if(nRecv > 1024 + nReadPtr - nRecvPtr) nRecv = 1024 + nReadPtr - nRecvPtr; if(nRecv + nRecvPtr <= 1024){ System.arraycopy(bufRecv, 0, bRecv, nRecvPtr, nRecv); nRecvPtr += nRecv; } else{ System.arraycopy(bufRecv, 0, bRecv, nRecvPtr, 1024-nRecvPtr); System.arraycopy(bufRecv, 1024-nRecvPtr, bRecv, 0, nRecv - (1024-nRecvPtr)); nRecvPtr = nRecv - (1024 - nRecvPtr); } sendLocalBroadcast(ACTION_DATA_RECV); Log.e(TAG, "onCharacteristicChanged"); } @Override public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor bd, int status) { Log.e(TAG, "onDescriptorWrite"); } @Override public void onReadRemoteRssi(BluetoothGatt gatt, int a, int b) { Log.e(TAG, "onReadRemoteRssi"); } @Override public void onReliableWriteCompleted(BluetoothGatt gatt, int a) { Log.e(TAG, "onReliableWriteCompleted"); } @Override public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) { Log.e(TAG, "onMtuChanged"); } }; public boolean connect(final String address){ if (mBluetoothAdapter == null || address == null) { Log.w(TAG, "BluetoothAdapter not initialized or unspecified address."); return false; } BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); if (device == null) { Log.w(TAG, "Device not found. Unable to connect."); return false; } // We want to directly connect to the device, so we are setting the autoConnect // parameter to false. if(mBluetoothGatt != null) { mBluetoothGatt.close(); mBluetoothGatt = null; } mBluetoothGatt = device.connectGatt(this, false, mGattCallback); Log.d(TAG, "Trying to create a new connection."); return true; } public void disconnect(){ if (mBluetoothAdapter == null || mBluetoothGatt == null) { Log.w(TAG, "BluetoothAdapter not initialized"); return; } mBluetoothGatt.disconnect(); } @Override public int read(byte[] data) { int readLen = data.length; int bufLen; int retLen; if(nRecvPtr >= nReadPtr) bufLen = nRecvPtr - nReadPtr; else bufLen = nRecvPtr + 1024 - nReadPtr; if(readLen <= bufLen) retLen = readLen; else retLen = bufLen; if(nReadPtr + retLen < 1024){ System.arraycopy(bRecv, nReadPtr, data,0,retLen); nReadPtr += retLen; } else{ System.arraycopy(bRecv, nReadPtr, data, 0, 1024-nReadPtr); System.arraycopy(bRecv, 0, data, 1024-nReadPtr, retLen - (1024-nReadPtr)); nReadPtr = retLen-(1024-nReadPtr); } return retLen; } public byte[] write(byte[] data){ mNotifyCharacteristic.setValue(data/*strValue.getBytes()*/); mBluetoothGatt.writeCharacteristic(mNotifyCharacteristic); LogUtil.i(TAG, "12154123164512332465451218451231654561233545612"); //return data.length; return data; } public final void onCharacteristicChanged(final BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic) { byte[] value = characteristic.getValue(); Log.d(TAG, "onCharacteristicChanged: " + value); String s0 = Integer.toHexString(value[0] & 0xFF); String s = Integer.toHexString(value[1] & 0xFF); Log.d(TAG, "onCharacteristicChanged: " + s0 + "、" + s); for (byte b : value) { Log.d(TAG, "onCharacteristicChanged: " + b); } } /** * Request a read on a given {@code BluetoothGattCharacteristic}. The read result is reported * asynchronously through the {@code BluetoothGattCallback#onCharacteristicRead(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic, int)} * callback. * * @param characteristic The characteristic to read from. */ public void readCharacteristic(BluetoothGattCharacteristic characteristic) { if (mBluetoothAdapter == null || mBluetoothGatt == null) { Log.w(TAG, "BluetoothAdapter not initialized"); return; } mBluetoothGatt.readCharacteristic(characteristic); } /** * Enables or disables notification on a give characteristic. * * @param characteristic Characteristic to act on. * @param enabled If true, enable notification. False otherwise. */ public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic, boolean enabled) { if (mBluetoothAdapter == null || mBluetoothGatt == null) { Log.w(TAG, "BluetoothAdapter not initialized"); return; } mBluetoothGatt.setCharacteristicNotification(characteristic, enabled); /* // This is specific to Heart Rate Measurement. if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) { BluetoothGattDescriptor descriptor = characteristic.getDescriptor( UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG)); descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); mBluetoothGatt.writeDescriptor(descriptor); } */ } /** * Retrieves a list of supported GATT services on the connected device. This should be * invoked only after {@code BluetoothGatt#discoverServices()} completes successfully. * * @return A {@code List} of supported services. */ public List<BluetoothGattService> getSupportedGattServices() { if (mBluetoothGatt == null) return null; return mBluetoothGatt.getServices(); } } ``` ```
android BLE 连接不稳定问题
使用android4.3提供的BLE API,可以找到外围设备(用于检测心率的BLE设备,手机用的galaxy s3 刷的是三星官方给的rom),但在连接时,很快就断开(有连接成功的时候,昙花一现,后面再也没成功过),在BluetoothGatt内部看到有129的错误。 代码很简单,开关BT模块的判断,然后扫描BLE设备,与扫描到的设备进行连接。没有其他多余动作。刚使用android 4.3提供api进行开发,跪求大神解答。
android 5.1 下 BLE 通信问题
android5.1 下 使用ble扫描设备,发现设备后,进行连接,程序会调用: 1.onConnectionStateChange 2.onServicesDiscovered 然后,在发送数据的时候,程序又会像上面一样走一遍...导致发送出去的数据丢包一样.不完整. 主机无法解析...就好比23个字节的数据发出去,只发了20,然后后面再发,它又多了N个字节,就是找不到规律.乱七八糟的..... 我使用小米.系统5.0的,运行很流畅. 酷派的也正常. 现在发现华为和魅族的手机都是这个样子. 我以为是我程序问题, 我使用BLE设备生产厂家的APP源码调试也是这样的. 请问大家有遇到这样的问题吗?
请教android连接ble设备需要先配对吗?可以和ble设备进行rfcomm通信吗?
请教android手机连接ble设备需要先配对吗?如果需要,方法和class bluetooh的配对方法一样吗?可以用和class bluetooth设备进行rfcomm通信一样的方法来和ble设备进行rfcomm通信吗?
Android BLE 在不知道蓝牙设备的Notify特征的情况下如何接收数据
之前有个设备,使用nRFConnect工具扫描出了所有的UUID,然后通过Notify的特征值实现了接收数据。今天忽然换了个不知道从哪儿找来的设备,居然扫描不出Notify。但是用nRFConnect工具依然可以收到数据,而且还是通过Notify的方式。这就很懵了,现在这个设备用我自己的代码是能发数据,但是不能接收数据。可否给个思路,图在下面~~~然后多句嘴,这个设备是老板(兼硬件)不知道从哪儿翻出来的,估计是很久以前的库存,为了节约成本已经决定用这款设备了,问他一问三不知……![图片说明](https://img-ask.csdn.net/upload/201911/07/1573127036_174409.png)
Android BLE 连接上立即断开
最近开发遇到一个很烦的问题,App成功连接蓝牙后(STATE CONNECTED)就会立即断开(STATE DISCONNECTED),在网上搜了很久的没有答案。我每次连接之前都睡disconnect和close,但是没什么作用。
android BLE 断开后连接的问题
我的Bluetooth是对蓝牙遥控器的按钮进行监听,用安卓5.0手机是没有问题的,都是用小米4.4的系统测试的时候,会出现断开之后,再次连接时非常缓慢,点击连接按钮,需要一分钟才能连接上
如何读取BLE的数据?请教
小白,刚接触ble4.0,在网上看了很多资料都是讲一些基础,参照官方demo写了一个类似的demo。 想做一个app显示ble上的电量,步数,体重等信息该在哪写方法,这些服务的UUID在哪找,有没有写过的能不能给个demo。
NRF52840 自定义UUID read属性问题
我现在调试nrf52840用的官方ble_app_blink这个例程,例程中定义的LBS_UUID_LED_CHAR 属性为read和write,app可以给nrf52840发送数据。但是没有找到app读取nrf52840数据的流程,请问当app发起读取请求的时候,nrf52840中处理流程是什么样的。 ![图片说明](https://img-ask.csdn.net/upload/201908/15/1565841916_510182.png)
AP6212的蓝牙模块是BLE模块(单模)还是传统+BLE双模(支持BLE)?
AP6212的蓝牙模块是BLE模块(单模)还是传统+BLE双模(支持BLE)? 单模能向双模发送数据,但双模不能像单模发送数据对么?
BLE sample在不同的手机上的表现不同,求解
最近新开发了一个BLE的APP,发现了一个奇怪的问题,在一些手机上自己的APP和官方的BLEsample都扫不到设备,在一些设备上又都能扫到,而且能建立连接,很奇怪,扫描的设备都是同一个。
android BLE4.0防丢器多连接
请问在做多连接的时候 samsung_ble_sdk_200.jar包最多能连接几个BLE。有实现过的吗?帮帮忙?
android BLE 调用characteristic的getValue方法,返回null
现在在做BLE相关的项目,与设备连接之后,获取到了Service中的characteristic,但是调用characteristic的getValue方法,返回值为null.
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方...
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
如何防止抄袭PCB电路板
目录 1、抄板是什么 2、抄板是否属于侵权 3、如何防止抄板 1、抄板是什么 抄板也叫克隆或仿制,是对设计出来的PCB板进行反向技术研究;目前全新的定义:从狭义上来说,抄板仅指对电子产品电路板PCB文件的提取还原和利用文件进行电路板克隆的过程;从广义上来说,抄板不仅包括对电路板文件提取、电路板克隆、电路板仿制等技术过程,而且包括对电路板文件进行修改(即改板)、对电子产品外形模具进行三维...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
相关热词 c#委托 逆变与协变 c#新建一个项目 c#获取dll文件路径 c#子窗体调用主窗体事件 c# 拷贝目录 c# 调用cef 网页填表c#源代码 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天
立即提问