为啥在 xamarin 表单中写入操作后,我在 iOS 中获得 BLE 配对请求对话框?

Posted

技术标签:

【中文标题】为啥在 xamarin 表单中写入操作后,我在 iOS 中获得 BLE 配对请求对话框?【英文标题】:Why I'm getting pairing request dialog in iOS for BLE after write operation in xamarin forms?为什么在 xamarin 表单中写入操作后,我在 iOS 中获得 BLE 配对请求对话框? 【发布时间】:2020-11-10 15:34:56 【问题描述】:

我创建了一个应用程序,我可以在其中连接到 BLE 设备并获取 GATT 服务和特征。但是在我在 GATT 特性中写了一些东西之后,我在 ios 中得到了配对请求对话框,并且在我接受配对请求后特性值变为空。我不知道为什么这个配对请求只有在我写我的 GATT 特性时才会出现。根据我的研究,BLE 并不要求在 iOS 中配对。即使配对请求对话框即将到来,我也需要在连接之后或连接之前而不是在写入操作之后发出配对请求。这是我收到的配对请求的图像。

这是我连接并写入 GATT 服务器的代码

 private async Task<string> ProcessDeviceInformationService(IService deviceInfoService)
        
            try
            
               await adapter.ConnectToDeviceAsync(device);
                var sb = new StringBuilder("Getting information from Device Information service: \n");
                var characteristics = await deviceInfoService.GetCharacteristicsAsync();
                var characteristic = await deviceInfoService.GetCharacteristicAsync(Guid.Parse("00002A39-0000-1000-8000-00805F9B34FB"));
               
                    try
                    
                        
                     
                        if (characteristic != null)
                        
                        var sbnew = new StringBuilder("BLE Characteristics\n");
                        byte[] senddata = Encoding.UTF8.GetBytes(string.IsNullOrEmpty(SendMessageLabel.Text) ? "Judson was here" : SendMessageLabel.Text);
                            await Task.Delay(300);
                            var newbytes = await characteristic.WriteAsync(senddata);
                        
                            var bytes = await characteristic.ReadAsync();
                        var str = Encoding.UTF8.GetString(bytes);

                        sbnew.AppendLine($"Characteristics found on this device: string.Join(", ", str.ToString())");
                        CharactericsLabel.Text = sbnew.ToString();
                       
                    

                
                    catch (Exception ex)
                    
                        return ex.Message;
                    
                
                return CharactericsLabel.Text;
           
            
            catch (Exception ex)
            
                
                return ex.ToString();
            
 

我的特征值在 WriteAsync 方法之后变为 null。我不知道如何解决这个问题有什么建议吗?

【问题讨论】:

你写的特性也必须有加密要求。如果需要加密,则需要配对/绑定。删除加密要求,配对请求将不会显示。 @Paulw11 如何删除加密?请给我一个例子。 它将在您的外围代码中,您没有显示。 @Paulw11 你能分享删除加密的代码吗,因为我没有得到它。 你的项目中还有其他外设代码吗? 【参考方案1】:

没有从外设端进行写操作的权限。我在外围端为我的特性添加了这段代码,它起作用了

BluetoothGattCharacteristic sampleText = new BluetoothGattCharacteristic(SAMPLE_TEXT,
        //Read-only characteristic
        BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE,
        BluetoothGattCharacteristic.PERMISSION_WRITE);

【讨论】:

以上是关于为啥在 xamarin 表单中写入操作后,我在 iOS 中获得 BLE 配对请求对话框?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 Xamarin 中使用 ContentProvider 插入项目后数据库为空?

为啥 xamarin 表单列表视图中的组标题在发布模式下不可见?

为啥 Xamarin Forms 对所有页面使用一个 Activity

为啥我更改的字符串没有出现在使用选项卡式表单 xamarin 的其他页面上

xamarin 表单 - 与选择器的两种方式绑定 - 为啥我不能从后面的代码更新选择器?

在 xamarin 表单中保存和恢复应用程序状态