小编Dri*_*anX的帖子

Android如何在iOS中播放BLE本地名称?

我有一个Android应用广告数据广播数据与服务uuid​​和本地名称.问题是这个"本地名称"(又名蓝牙设备名称)限制为8个字符,每个字符是16位unicode表示,因此每个字符2个字节.每当我尝试将设备的名称更改为9个字符长时,由于错误1而导致播放无法启动

  public static final int ADVERTISE_FAILED_DATA_TOO_LARGE = 1;
Run Code Online (Sandbox Code Playgroud)

我知道GAP配置文件广播包长度为27个字节,7个用于标头,因此20个应该可以免费使用,而不仅仅是16个?

这是真正的泡菜,让我的镍发痒:

当iOS播放广告标题时,我将设备的完整本地名称作为ScanRecord的一部分,而不仅限于16字节.只是广播的一部分,我不是在这里建立GATT连接.

iOS如何做到这一点?例如,在我的Android上,我能够从iOS广告广播中检索14个字符,28个字节长的唯一ID.28字节长于蓝牙4.0标准规定的27字节限制.Android如何能够获取超过27个字节的完整广播?为什么我的"本地名称"或设备名称最多只能是8个字符或16个字节,否则将无法开始广播?

这是我的代码:

         final BluetoothLeAdvertiser advertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();

        //advertise settings
        final AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder();
        settingsBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY);
        settingsBuilder.setConnectable(true);
        settingsBuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH);

        //advertise data
        AdvertiseData.Builder dataBuilder = new AdvertiseData.Builder();
        ParcelUuid uuid = new ParcelUuid(UUID.fromString("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"));
        dataBuilder.addServiceUuid(uuid);

        mBluetoothAdapter.setName("12345678"); //8 characters works, 9+ fails
        dataBuilder.setIncludeDeviceName(true);

     if (advertiser!=null) {
         advertiser.startAdvertising(settingsBuilder.build(), dataBuilder.build(), mAdvertiseCallback);
     } 

     mAdvertiseCallback = new AdvertiseCallback() {
         @Override
         public void onStartSuccess(AdvertiseSettings settingsInEffect) {
             super.onStartSuccess(settingsInEffect);
             Log.d(LOGN, "BLE STARTED ADVERTISING BROADCAST "+settingsInEffect);

         }

         @Override
         public void onStartFailure(int errorCode) …
Run Code Online (Sandbox Code Playgroud)

android bluetooth broadcast discovery ios

13
推荐指数
1
解决办法
3531
查看次数

Android WifiManager和扫描电池性能

根据我的理解,可以请求WifiManager启动AP扫描,这很好,你可以获得扫描结果,但我的问题是关于在引擎盖下发生的连续wifi扫描.

除了取消注册用于扫描回调的wifi侦听器之外,禁用wifi是阻止硬件扫描的唯一方法吗?因此,如果我的设备连接到某些Wifi BSSID/SSID,它还会不断扫描?(是http://www.androidauthority.com/community/threads/how-to-get-wifi-to-stop-scanning-after-connected.7760/)因此,如果我在连接到某些Wifi时请求扫描,那么开始不断扫描,因为在没有关闭硬件的情况下无法实际停止扫描...此时你失去了与Wifi网络的连接,这是不可接受的.

似乎是谷歌的疏忽.他们为什么不单独离开硬件而不是让它不断扫描?!除非激起开始扫描,连接,断开连接或停止扫描,否则不要自己做任何事......为什么他们不这样做呢?我担心的是连续扫描的电池排水......无论我是否有听众都是无关紧要的.硬件不断查询附近网络的事实听起来相当资源和电池密集.

在没有生根的情况下,在这种情况下有什么可以做的吗?

performance android battery wifi

7
推荐指数
0
解决办法
1293
查看次数

React Native Navigator renderScene多次调用

我已经被RN Navigator弄了一段时间,试图弄清楚为什么Navigator会渲染其堆栈中推送的所有路由.

原来

<Navigator initialRoute={{name:"Route 1", index: 1}} />
Run Code Online (Sandbox Code Playgroud)

然后在发出navigator.push({ name : "Route 2", index: 2 })我的组件的render()方法时,会调用它重新渲染Navigator,而Navigator又会调用renderScene.

在推送第二个路径并在renderScene被调用时记录路由后,得到:

Render() - > renderScene(),{name:"Route 1",index:1}

Render() - > renderScene(),{name:"Route 2",index:2}

有没有人知道为什么renderScene()被调用的次数与导航器堆栈中的路径一样多?这是预期的行为,如果它是如何加速渲染?

在最终渲染最后一个推送路线的场景之前尝试渲染5条路线的场景时会有很大的性能损失,而实际上它应该只调用render()一次以仅渲染最后推送路线的场景.

任何帮助是极大的赞赏.谢谢!

这些是相关的片段:

nav.js

export function ListPage(){
    return {
        name: LIST_PAGE,
        index: 1
    }
}


Main App

<Navigator
        ref={(ref) => this.navigator = navigator = ref}
        initialRoute={nav.ListPage()}
        renderScene={(route,navigator)=>this.renderListingsScene(route,navigator)}
 />

renderListingsScene(route, navigator){
        console.log("renderScene()", route);

}
Run Code Online (Sandbox Code Playgroud)

render navigator react-native

5
推荐指数
1
解决办法
1171
查看次数