This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2564C:SPP 服务器和两个或更多客户端

Guru**** 2826935 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1327328/cc2564c-spp-server-and-two-or-more-clients

您好、在定制板上的应用程序中有一个 SPP 服务器、我们希望允许两个 SPP 客户端同时连接。

从示例(Bluetopia 栈5.1.1)开始、我们已针对单个连接成功实现了 SPP 服务器。

目前,我们通过调用 OpenServer()两次(使用两个不同的服务器端口号)来打开两个服务器端口。 然后、第一个客户端正确连接并打开到 SPP 层的连接。 此后、第二个客户端似乎建立了连接、但没有更多 SPP 端口可用。

我正在粘贴一些堆栈日志:

---------------- 第一个客户端请求连接-------------------------------------------------------
atLinkKeyRequest:0x1237800CF82B
GAP_GAP() Authentication_Response 成功。
atPINCodeRequest:0x1237800CF82B
使用以下命令进行响应:PINCodeResponse
PIN 代码响应:000000000
atLinkKeyCreation:0x1237800CF82B
链接键:0x94DE7901CA9F44C75E9C130D7D7205B8
未存储链接密钥
SPP 开路指示、ID:0x0001、板:0x1237800CF82B。
SPP 端口状态指示:0x0001、状态:0x000B、中断状态:0x0000、长度:0x0000。
---------------- 第一个连接被接受并正常工作-------
---------------- 第二个客户端请求连接-------------------------------------------------------
atIOCapabilityResponse:0xC0B6F9F9B7DE
远程功能:显示是/否、MITM
atIOCapabilityRequest:0xC0B6F9F9B7DE
GAP_GAP() Authentication_Response 成功。
自动接受:514050
GAP_GAP() Authentication_Response 成功。
安全简单配对完成
atLinkKeyCreation:0xC0B6F9F9B7DE
链接密钥:0xFC49601DBE3A19BD4A1734D157CD9321
未存储链接密钥
-------- 第二个连接没有得到 SPP 打开指示-------

为多个客户端实施支持的正确方法是什么?

两次使用 OpenServer()是否正确? 或者服务器为一个、而在 SPP 回调中、我们必须使用 bdaddr 或其他字段区分来自两个客户端的数据?

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Andrea:

    如果您使用我们的演示代码、由于某种原因、它在使用命令 OpenServer 时无法打开一个端口。

    但是、它用于打开另一个服务器端口的功能  

    SPP_SPP Open_Server_Port

    以下是器件支持的最大端口数

    0x1E SO 31端口

    此致!

    罗格利奥

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Rogelio、

     我没有提到我修改了 OpenServer()。 很抱歉。

    我已经通过这种方式修改了演示代码:

    打开堆栈后、我调用

    OpenServer(1)

    OpenServer(2)

    在这两个调用中、我都会检查返回的 val 是0。

    我认为它们正确完成、因为 SPPContextInfo 结构看起来已经过很好的初始化:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Andrea:  

    我继续并删除了演示检查、从而能够将2个客户端连接到不同的服务器端口。

    这是 UART 终端日志。

    服务器

    OpenStack().
    Bluetooth Stack ID: 1
    Device Chipset: Unknown (greater 4.1)
    BTPS Version  : 5.1.1.0
    PLAT Version  : 1.0
    App Name      : SPPDemo
    App Version   : 0.3
    Project Type  : 6
    FW Version    : 12.24
    Local BD_ADDR: 0x88C255D1D64D
    
    ******************************************************************
    * Command Options: Server, Client, Help                          *
    ******************************************************************
    
    Choose Mode>server
    
    ******************************************************************
    * Command Options: Inquiry, DisplayInquiryList, Pair,            *
    *                  EndPairing, PINCodeResponse, PassKeyResponse, *
    *                  UserConfirmationResponse,                     *
    *                  SetDiscoverabilityMode, SetConnectabilityMode,*
    *                  SetPairabilityMode,                           *
    *                  ChangeSimplePairingParameters,                *
    *                  GetLocalAddress, GetLocalName, SetLocalName,  *
    *                  GetClassOfDevice, SetClassOfDevice,           *
    *                  GetRemoteName, SniffMode, ExitSniffMode,      *
    *                  ServiceDiscovery,                             *
    *                  Open, Close, Read, Write,                     *
    *                  GetConfigParams, SetConfigParams,             *
    *                  GetQueueParams, SetQueueParams,               *
    *                  Loopback, DisplayRawModeData,                 *
    *                  AutomaticReadMode, SetBaudRate, Send          *
    *                  Help, Quit                                    *
    ******************************************************************
    
    Server>open 1
    Server Opened: 1.
    
    Server>open 2
    Server Opened: 2.
    
    Server>
    SPP Open Indication, ID: 0x0001, Board: 0xC8DF8425682B.
    HCI Connection Handle: 0x0001.
    
    Server>
    SPP Port Status Indication: 0x0001, Status: 0x0003, Break Status: 0x0000, Length: 0x0000.
    
    Server>
    SPP Open Indication, ID: 0x0002, Board: 0xC8DF8425643A.
    HCI Connection Handle: 0x0002.
    
    Server>
    SPP Port Status Indication: 0x0002, Status: 0x0003, Break Status: 0x0000, Length: 0x0000.
    
    Server>
    SPP Data Indication, ID: 0x0002, Length: 0x0016.
    
    Server>
    SPP Data Indication, ID: 0x0001, Length: 0x0016.
    
    Server>read 2
    Read: 22.
    Message: This is a test string.
    

    客户端1

    ******************************************************************
    * Command Options: Inquiry, DisplayInquiryList, Pair,            *
    *                  EndPairing, PINCodeResponse, PassKeyResponse, *
    *                  UserConfirmationResponse,                     *
    *                  SetDiscoverabilityMode, SetConnectabilityMode,*
    *                  SetPairabilityMode,                           *
    *                  ChangeSimplePairingParameters,                *
    *                  GetLocalAddress, GetLocalName, SetLocalName,  *
    *                  GetClassOfDevice, SetClassOfDevice,           *
    *                  GetRemoteName, SniffMode, ExitSniffMode,      *
    *                  ServiceDiscovery,                             *
    *                  Open, Close, Read, Write,                     *
    *                  GetConfigParams, SetConfigParams,             *
    *                  GetQueueParams, SetQueueParams,               *
    *                  Loopback, DisplayRawModeData,                 *
    *                  AutomaticReadMode, SetBaudRate, Send          *
    *                  Help, Quit                                    *
    ******************************************************************
    
    Client>ub
    Invalid Command: UB.
    
    Client>inquiry
    
    Client>
    Inquiry Entry: 0x88C255D1D64D.
    
    Client>
    Inquiry Entry: 0xF84D8997F1F8.
    
    Client>
    Inquiry Entry: 0xB07D47D3E197.
    
    Client>
    Inquiry Entry: 0x00EBD5D45C67.
    
    Client>
    Inquiry Entry: 0x84B517083CEF.
    
    Client>
    Inquiry Entry: 0xA86DAA1E22AF.
    
    Client>
    Inquiry Entry: 0xC8DF8425643A.
    
    Client>
    Inquiry Entry: 0x709CD10450AF.
    
    Client>
    Inquiry Entry: 0x84B51708D1AD.
    
    Client>
    Inquiry Entry: 0x84B51708BD35.
    
    Client>
    Inquiry Entry: 0x84B517080D81.
    
    Client>
    Inquiry Entry: 0xB07D47D36D23.
    
    Client>
    Inquiry Entry: 0x00B0E1EE3243.
    
    Client>
    Inquiry Entry: 0x84B51708870B.
    
    Client>
    Inquiry Entry: 0x84B51708D00B.
    
    Client>
    Inquiry Entry: 0x84B51708C481.
    
    Client>
    Inquiry Entry: 0x2C73A02CEA57.
    
    Client>
    Inquiry Entry: 0xB07D47D34931.
    
    Client>
    Inquiry Entry: 0x84B51708D215.
    
    Client>
    Result: 1, 0x88C255D1D64D.
    Result: 2, 0xF84D8997F1F8.
    Result: 3, 0xB07D47D3E197.
    Result: 4, 0x00EBD5D45C67.
    Result: 5, 0x84B517083CEF.
    Result: 6, 0xA86DAA1E22AF.
    Result: 7, 0xC8DF8425643A.
    Result: 8, 0x709CD10450AF.
    Result: 9, 0x84B51708D1AD.
    Result: 10, 0x84B51708BD35.
    Result: 11, 0x84B517080D81.
    Result: 12, 0xB07D47D36D23.
    Result: 13, 0x00B0E1EE3243.
    Result: 14, 0x84B51708870B.
    Result: 15, 0x84B51708D00B.
    Result: 16, 0x84B51708C481.
    Result: 17, 0x2C73A02CEA57.
    Result: 18, 0xB07D47D34931.
    Result: 19, 0x84B51708D215.
    
    Client>open 1 1
    
    SPP_Open_Remote_Port success.
    
    Client>
    SPP Open Confirmation, ID: 0x0001, Status 0x0000.
    
    Client>
    SPP Port Status Indication: 0x0001, Status: 0x0003, Break Status: 0x0000, Length: 0x0000.
    
    Client>write
    Wrote: 22.
    

    客户端2

    ******************************************************************
    * Command Options: Inquiry, DisplayInquiryList, Pair,            *
    *                  EndPairing, PINCodeResponse, PassKeyResponse, *
    *                  UserConfirmationResponse,                     *
    *                  SetDiscoverabilityMode, SetConnectabilityMode,*
    *                  SetPairabilityMode,                           *
    *                  ChangeSimplePairingParameters,                *
    *                  GetLocalAddress, GetLocalName, SetLocalName,  *
    *                  GetClassOfDevice, SetClassOfDevice,           *
    *                  GetRemoteName, SniffMode, ExitSniffMode,      *
    *                  ServiceDiscovery,                             *
    *                  Open, Close, Read, Write,                     *
    *                  GetConfigParams, SetConfigParams,             *
    *                  GetQueueParams, SetQueueParams,               *
    *                  Loopback, DisplayRawModeData,                 *
    *                  AutomaticReadMode, SetBaudRate, Send          *
    *                  Help, Quit                                    *
    ******************************************************************
    
    Client>inquiry
    
    Client>
    Inquiry Entry: 0x84B51708D1AD.
    
    Client>
    Inquiry Entry: 0xA86DAA1E22AF.
    
    Client>
    Inquiry Entry: 0x84B51708870B.
    
    Client>
    Inquiry Entry: 0xB07D47D36D23.
    
    Client>
    Inquiry Entry: 0x84B51708BD35.
    
    Client>
    Inquiry Entry: 0x84B517080D81.
    
    Client>
    Inquiry Entry: 0x00B0E1EE3243.
    
    Client>
    Inquiry Entry: 0x709CD10450AF.
    
    Client>
    Inquiry Entry: 0x84B51708D00B.
    
    Client>
    Inquiry Entry: 0xC8DF8425682B.
    
    Client>
    Inquiry Entry: 0x84B51708D215.
    
    Client>
    Inquiry Entry: 0x00EBD5D45C67.
    
    Client>
    Inquiry Entry: 0x88C255D1D64D.
    
    Client>
    Inquiry Entry: 0x84B517083CEF.
    
    Client>
    Inquiry Entry: 0xB07D47D34931.
    
    Client>
    Result: 1, 0x84B51708D1AD.
    Result: 2, 0xA86DAA1E22AF.
    Result: 3, 0x84B51708870B.
    Result: 4, 0xB07D47D36D23.
    Result: 5, 0x84B51708BD35.
    Result: 6, 0x84B517080D81.
    Result: 7, 0x00B0E1EE3243.
    Result: 8, 0x709CD10450AF.
    Result: 9, 0x84B51708D00B.
    Result: 10, 0xC8DF8425682B.
    Result: 11, 0x84B51708D215.
    Result: 12, 0x00EBD5D45C67.
    Result: 13, 0x88C255D1D64D.
    Result: 14, 0x84B517083CEF.
    Result: 15, 0xB07D47D34931.
    
    Client>open
    
    Usage: Open [Inquiry Index] [RFCOMM Server Port].
    .
    Function Error.
    
    Client>open 13 2
    
    SPP_Open_Remote_Port success.
    
    Client>
    SPP Open Confirmation, ID: 0x0001, Status 0x0000.
    
    Client>
    SPP Port Status Indication: 0x0001, Status: 0x0003, Break Status: 0x0000, Length: 0x0000.
    
    Client>ri
    Invalid Command: RI.
    
    Client>write
    Wrote: 22.
    
    

    您对代码所做的其他哪些更改可以解释这种行为变化?

    此致!

    罗格利奥

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、感谢下一个新示例。

    也许我完全偏离了正轨、但我认为问题可能是我无法完全控制客户。

    在上一个示例中,您不仅选择了设备,还选择了 RFCOMM 端口,因此您可以手动 将每个客户端连接至空闲的服务器端口。 但在我的情况下、客户端是 PC 或旧机器 、我只能设置服务器的 BD 地址、因此我认为我必须在服务器中实施一种方法、"建议"每个客户端使用不同的端口。  也许可以通过操作 SDP 记录来进行处理?  

    也许 在打开与第一个客户端的连接后取消注册第一个服务器端口的 SDP 记录?  因此第二个客户端将 仅查找第二个端口的 SDP 记录。 我只是在这里推测、在 SPP 配置文件规范中、我找不到一种"官方"方法来 处理这个问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Andrea:

    我觉得问题是、在这些旧机器中是否有其他命令可以帮助我们解决。 例如、服务发现?

    此致!

    罗格利奥

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,罗格里奥,我是安德烈的同事。
    在对服务发现进行一些调查后,如果我使用相同的 ServerPort 两次调用自定义 OpenServer()来设置我们的应用程序,即

    OpenServer(1);

    OpenServer(1);

    然后、当两个客户端连接时、我会得到两个 SPP 开放端口指示。 我还需要整理一些细节,但解决问题似乎是正确的方向。

    你有没有这方面的提示?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    当您收到打开端口指示时、是否还会收到不同的连接 ID?

    此致!

    罗格利奥

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、ID 不同


    atLinkKeyRequest:0x1237800CF82B
    GAP_GAP() Authentication_Response 成功。
    atPINCodeRequest:0x1237800CF82B
    使用以下命令进行响应:PINCodeResponse
    PIN 代码响应:E60B8599CD15
    atLinkKeyCreation:0x1237800CF82B
    链接密钥:0x89B02626F491EB55542B7DD6ADE63C21
    未存储链接密钥
    SPP 开路指示、ID:0x0001、板:0x1237800CF82B。
    SPP 端口状态指示:0x0001、状态:0x000B、中断状态:0x0000、长度:0x0000。
    atIOCapabilityResponse:0xC0B6F9F9B7DE
    远程功能:显示是/否、MITM
    atIOCapabilityRequest:0xC0B6F9F9B7DE
    GAP_GAP() Authentication_Response 成功。
    自动接受:928679
    GAP_GAP() Authentication_Response 成功。
    安全简单配对完成
    atLinkKeyCreation:0xC0B6F9F9B7DE
    链接密钥:0x6A299BF66B876AE079702D22382DF53A
    未存储链接密钥
    SPP 开路指示、ID:0x0002、电路板:0xC0B6F9F9B7DE。
    SPP 端口状态指示:0x0002、状态:0x000B、中断状态:0x0000、长度:0x0000。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    很抱歉延迟、现在两个客户端都能连接、您是否能够发送数据?

    此致!

    罗格利奥

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我因疾病不得不暂停工作几天、我将在几天内重新开始处理该主题

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rogelio 您好、现在对两个客户端的通信都正常、我想您可以关闭此线程

    谢谢

    米尔 A

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Mir a:

    Im 很高兴通信正在工作!  

    祝您好运、

    罗格利奥