EFR32BG22 BLE在SPP模式下无法与PC(Windows)连接.

大家好, 我正在try 在SPP模式下运行Thunderboard和PC之间的蓝牙连接.整个项目都是基于Sillicon Labs提供的示例,但是我找不到它不工作的原因.

这个项目是什么样子的

  • 在板端,我正在运行一个名为bluetooth_spp_server的示例,它最初是为了在两个Thunderboard板之间通信而设计的
  • 在PC端,我正在运行一个名为bluetooth_spp_with_windows的示例,它完全是为我所需要的紫色所做的.

他的行为

即使这些项目完全是为我所需要的,不知何故,我也不能让它运行.当我运行项目文件中的precompiled .exe application时,当我自己编译the source code,然后运行我的.exe应用程序时,一切都完全按照but的方式运行,PC无法连接.好吧,需要澄清的是,不知何故,我让它连接了5次,但我没有改变任何东西,从那以后就什么都不起作用了.PC看到主板,主板广告为服务器,但仍然没有发生任何事情,也没有发现任何事件.

经过一些调试后

经过几次调试,我发现董事会是广告刚刚好,我可以看到它在蓝牙设备等(我没有配对,因为这使得即使是预编译.exe应用程序的工作奇怪).然而,当涉及到连接,董事会无法找到任何事件(我不能看到它是否不同于PC端由于缺乏可见性的win api).广告基本上是董事会在初始化和广告启动后唯一要做的事情.

为了在这里至少提供一些代码,需要进行初始化和打开连接:

The sl_bt_step() function which is called from the main loop on the board side

#define SL_STATUS_OK 0

SL_WEAK bool sl_bt_can_process_event(uint32_t len) {
   (void)(len);
   return true;
}

void sl_bt_step(void) {
   sl_bt_msg_t evt;
   sl_bt_run(); // API function - can't see what's going on inside
   uint32_t event_len = sl_bt_event_pending_len(); // API function - can't see what's going on inside
   if( ( event_len == 0 ) || ( !sl_bt_can_process_event( event_len ) ) )
      {
      return; // After init I'm always ending right here.
      }
   sl_status_t status = sl_bt_pop_event( &evt );
   if( status != SL_STATUS_OK )
      {
      return;
      }
   sl_bt_process_event( &evt );
}

void sl_bt_process_event(sl_bt_msg_t *evt) {   
   sl_bt_in_place_ota_dfu_on_event(evt);
   sl_gatt_service_device_information_on_event(evt);
   sl_bt_on_event(evt); 
}

Initialization and event occured handler on the board side

void sl_bt_on_event(sl_bt_msg_t *evt) {
   uint16_t max_mtu_out;
   sl_status_t sc;
   switch (SL_BT_MSG_ID(evt->header)) {
/// First thing after turning on the MCU
      case sl_bt_evt_system_boot_id:
         app_log("SPP Role: SPP Server\r\n");
         reset_variables();
         sc = sl_bt_gatt_server_set_max_mtu(247, &max_mtu_out);
         app_assert_status(sc);
         sc = sl_bt_advertiser_create_set(&advertising_set_handle);
         app_assert_status(sc);
         sc = sl_bt_legacy_advertiser_generate_data(advertising_set_handle,
                                                 sl_bt_advertiser_general_discoverable);
         app_assert_status(sc);
         sc = sl_bt_advertiser_set_timing(
            advertising_set_handle,
            160,   // min. adv. interval (milliseconds * 1.6)
            160,   // max. adv. interval (milliseconds * 1.6)
            0,     // adv. duration
            0);    // max. num. adv. events
         app_assert_status(sc);
         sc = sl_bt_legacy_advertiser_start(advertising_set_handle,
                                         sl_bt_legacy_advertiser_connectable);
         app_assert_status(sc);
         break;

/// After an event "in the air" occure - I can't get into this since the board can't see any event
      case sl_bt_evt_connection_opened_id:
         conn_handle = evt->data.evt_connection_opened.connection;
         app_log("Connection opened\r\n");
         main_state = STATE_CONNECTED;
         sl_bt_connection_set_parameters(conn_handle, 24, 40, 0, 200, 0, 0xFFFF);
         break;
   }
}
  • evt->header由蓝牙外围设备设置,并且在返回迭代序列是17 14 6 7的初始化之后,它仅返回0.我不能调试或看到这个变量发生的任何事情,只能看到蓝牙外设设置的值.

结论

我真的不能理解的是,预编译的.exe应用程序每次都能正常工作,即使当主板与Windows配对时也是如此,这只会导致try 连接.这仍然比我编译的.exe应用程序版本的任何try 都要远(除了随机的5个).

据我所知,Win API中有两个函数是用来连接蓝牙设备的.我已经试过了它们的每一种变体,都改成了the provided code for PC side.

我已经试过Silabs论坛了,但答案没有帮助,他们还没有回复第二个论坛,所以我想我应该在其他论坛试试运气.

有人知道是什么导致了这种奇怪的行为吗?有没有可能预编译的.exe应用程序是用一些旧的库/框架编译的,现在新的库/框架不再支持它了?(预编译的版本是两年前上传到github的).

我希望有人知道发生了什么,因为经过几个小时的搜索和try ,似乎有人的帮助是我最后的机会.提前感谢您为我所做的一切努力.

推荐答案

Problem seems to be solved

因此,它仍然不能得到我的头上怎么能提供的.exe应用程序的工作,因为我找不到任何原因所描述的问题.

解决方案

然而,在又工作了几个小时之后,我决定try 另一个名为bluetooth_secured_spp_over_ble的例子.应用程序并没有太大的不同.主要区别在于:

  • 演示如何设置绑定设置.
  • 该程序不仅仅是在宣传数据.它通告数据,然后处理绑定,然后您可以发送/接收数据.
  • 可以设置提取唯一的设备ID,然后将其以正确的格式写入GATT服务器.This might be the key difference

老实说,我没有太多的时间来找出关键的区别是什么.我最擅长的就是获取和设置唯一的设备ID.

无论如何,在这个例子中,一切似乎都很正常.

I believe my collegue also swapped into using 100 provided by Microsoft but the original example is working too.

Csharp相关问答推荐

在包含空项的列表上使用具有断言T的摘要表

如何使用C#中的图形API更新用户配置文件图像

实体框架核心上是否支持使用NPGSQL的字符串聚合?

. net依赖注入如何避免服务类中的新

try 在Blazor项目中生成html

更新产品但丢失产品ASP.NET Core的形象

.NET HttpClient、JsonSerializer或误用的Stream中的内存泄漏?

如何在页面重新加载后保持菜单切换状态

从.Net 6 DLL注册和检索COM对象(Typelib导出:类型库未注册.(异常来自HRESULT:0x80131165))

方法从数据表中只 Select 一个条件?

在此系统上已禁用获取正在运行的脚本.&在ASP.NET Core Web API中

Cosmos SDK和Newtonsoft对静态只读记录的可能Mutations

在.NET 7.0 API控制器项目中通过继承和显式调用基类使用依赖项注入

两个DateTimeOffset之间的差异返回意外的负值

如何使用IHostedService添加数据种子方法

WPF:如何从DatagridHeader的内容模板绑定到词典项

C#;AvaloniaUI;MVVM;当另一个窗口上的按钮被单击时,如何更新视图图像源?

如何在.NET8中使用Blazor Web App(WebAssembly)托管服务器端控制器?

测试单个对象是否与Func<;T,bool>;匹配

无法通过服务控制台启动.NET Core 6.0服务(错误1053)