请问CC2540把扫描完的list印出后,可否把list内addr的RSSI值也一并印出?
我在case GAP_DEVICE_DISCOVERY_EVENT中
使用for loop把simpleBLEDevList的addr全印出
for (int i=0;i<simpleBLEScanRes;i++)
{
SerialPrintString((uint8*) bdAddr2Str( simpleBLEDevList[i].addr ));
}
这里是可以正常动作的
后来想要把list内每个addr的RSSI也一并印出
所以加了一行SerialPrintValue("rssi:-", (uint8)(-(pEvent->deviceInfo.rssi)),10);
for (int i=0;i<simpleBLEScanRes;i++)
{
SerialPrintString((uint8*) bdAddr2Str( simpleBLEDevList[i].addr ));
SerialPrintValue("rssi:-", (uint8)(-(pEvent->deviceInfo.rssi)),10);
}
但印出来都是-142,请问要怎么做才能正确印出llist内每个addr的RSSI呢?
备注,我使用的是SimpleBLECentral
(1)你搞错了。
(2)discovery的过程会产生两个事件,一个是GAP_DEVICE_INFO_EVENT,一个是GAP_DEVICE_DISCOVERY_EVENT
GAP_DEVICE_INFO_EVENT 是每发现一个设备就会产生一次这个事件
GAP_DEVICE_DISCOVERY_EVENT 是发现过程完成了。
所以,你在GAP_DEVICE_DISCOVERY_EVENT 处理每个节点的rssi是不对了
GAP_DEVICE_INFO_EVENT 对应的是pEvent->deviceInfo。
GAP_DEVICE_DISCOVERY_EVENT对应的是pEvent->discCmpl
你在GAP_DEVICE_DISCOVERY_EVENT处理pEvent->deviceInfo 是有问题的。你应该在GAP_DEVICE_INFO_EVENT 里做
建议的做法是,建立一个数组,在每次GAP_DEVICE_INFO_EVENT 事件里,记录设备addr和RSSI. 然后在GAP_DEVICE_DISCOVERY_EVENT事件,即发现完成中,打印你自己的那个数组里的addr和rssi.
TY分析的非常到位。
GAP_DEVICE_DISCOVERY_EVENT在discover完了之后才会进入该事件的case里面。
而每次发现到新的设备都会在GAP_DEVICE_INFO_EVENT。
有几个结构体你不得不知:
typedef union
{
gapEventHdr_t gap; //!< GAP_MSG_EVENT and status.
gapDeviceInitDoneEvent_t initDone; //!< GAP initialization done.
gapDeviceInfoEvent_t deviceInfo; //!< Discovery device information event structure.
gapDevDiscEvent_t discCmpl; //!< Discovery complete event structure.
} gapObserverRoleEvent_t;
/**
* GAP_DEVICE_INFO_EVENT message format. This message is sent to the
* app during a Device Discovery Request, when a new advertisement or scan
* response is received.
*/
typedef struct
{
osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status
uint8 opcode; //!< GAP_DEVICE_INFO_EVENT
uint8 eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES
uint8 addrType; //!< address type: @ref ADDRTYPE_DEFINES
uint8 addr[B_ADDR_LEN]; //!< Address of the advertisement or SCAN_RSP
int8 rssi; //!< Advertisement or SCAN_RSP RSSI
uint8 dataLen; //!< Length (in bytes) of the data field (evtData)
uint8 *pEvtData; //!< Data field of advertisement or SCAN_RSP
} gapDeviceInfoEvent_t;
在GAP_DEVICE_DISCOVERY_EVENT事件中读取pEvent->deviceInfo.rssi即为该从设备的RSSI,对应的从设备MAC地址也在里面。
多谢TY的回应,
的确,我在GAP_DEVICE_INFO_EVENT 处理就可以成功打印了
谢谢
很详细的讲述,赞