BLE資料對傳
各位 你們好!!
想請問如果我們有小量資料透過CC2541兩個是否可以直接對傳?如果以TI的範例 V1.4版是否能建議利用哪個範例去執行比較恰當呢?謝謝各位的指較!!
ko,
你需要的是SPPLE (Serial Port Profile LE)。
TI 的 Wiki 上有示例代码: http://processors.wiki.ti.com/index.php/LPRF_BLE_SerialApp
这个虽然是基于1.2.1版本的老协议栈,但是TI 也在wiki 上提供了 porting guide, 帮助你移植到最新版本的协议栈,过程并不复杂:http://processors.wiki.ti.com/index.php/LPRF_BLE_Porting_Projects
您好!!我們將改好的Code分別燒入到CC2540及CC2541的flash中,想請問這是否還需要外部PC或MCU去下命令來聯結?是否有自動聯結的功能?這個程式是兩邊各透過Uart0就可以互通了嗎?感謝您的協助,謝謝!!
ko,
烧到flash之后,默认启动后,就应该在广播了。这个时候可以通过过BTool 用CC2540 dongle 发现并连接,然后通过BTool 搜索到相应的CCCD, 打开notification.
然后,你们可以用PC通过UART用terminal 之类的发送串口数据给芯片,这个时候芯片就会自动把数据以notification 方式发送给CC2540 dongle,通过BTool显示出来。
Yan Sir.您好!!我們將USB置入pc會出現無法辨示裝置,用ccxxxx_usb_cdc驅動也抓不到!!,我們需要的架構MCU(Uart)<->CC254x <--(BLE)---> CC254x<-> MCU(Uart)
ko,
了解。
你们需要首先烧入CC2540_USBdongle_HostTestRelease_All.hex ,这个可以在你安装的协议栈目录下 ..\BLE-CC254x-1.4.0\Accessories\HexFiles 找到。这个是很好的测试方法。
MCU(Uart)<->CC254x <--(BLE)---> CC254x<-> MCU(Uart) ,这种架构的话,TI 提供的只是其中的一头,基于peripheral,另外,基于central 的代码,你可能得需要模仿这个移植好的peripheral 再移植一下。
另外,之前提到过的SPPLE (Serial Port Profile LE)代码,可以让两个CC254x 进行数据传输(包括central 和 peripheral),但是这个例程没有外接MCU 的功能,如果你们觉得这个可以,也可以基于这个例程进行UART 驱动移植。
Hello Yan Sir.您好!!我們有試過peripheral或BLE Bridge可以與手機APP通訊是透過UUID:0xFFF0傳送單Byte資料,您說central端是如果原廠的Code是否目前要外加cpu或MCU才能控制?還是peripheral可直接與central端對連?
ko,
看来你们已经成功运行BLE Bridge了:)
BLE Bridge 模式下的peripheral 可以直接和central对连。
但是根据你们的要求,需要把原来的central修改成和BLE Bridge 一样的一种结构。所以我建议你们可以基于BLE Bridge的结构,修改central 代码,加入serial interface的代码,这样两边就能以你们的要求进行通信了。
Yan Sir.您好!!修改BLE Bridge可以不需要Device List及手動connect的動作嗎?我們這邊先試著改看看,再請問central端最多能連接幾組Device?之前上網看到7組這正確嗎?是因硬體還軟體限制?如果客戶需要一次20組以上可否辦到?謝謝您!!
ko,
你说的Device List 是指什么?
不需要手动connect, 这个你可以在代码里面实现,比如说一旦scan到需要的设备,就自动发起连接。
BLE 协议本身并没有限定device 连接个数(不像传统蓝牙有7个限定),但是鉴于CC2541 本身的资源非常有限,因此作为central最多只能连接3个device,而且还得看具体的应用。
Yan Sir. 您好!!是指向手機搜尋到BLE Device的列表;由於我們並未操作TI原廠的板子,所以只能從code看出需要LCD及Key的界面,請問TI是否有此的相關操作說明及線路呢?謝謝!!
ko,
了解。
是的,TI 提供的central 需要SmartRF05 的板子,带LCD 和 Key。 另外,TI提供的另一个可以做Central的板子是Keyfob。
前面提到过的SPPLE (Serial Port Profile LE)是基于Keyfob 的代码。
TI 有提供这些开发板的线路图,
SmartRF05: http://www.ti.com/tool/cc2543-cc2544dk, 线路图: http://www.ti.com/lit/ug/swru210a/swru210a.pdf 在这个pdf 的最后。
keyfob: http://www.ti.com/tool/cc2541keyfob-rd, 线路图:http://www.ti.com/lit/df/tidr191/tidr191.pdf
Yan Sir.您好!我們在simpleBLEScanRes不是0時有找到裝置後再執行
case GAP_DEVICE_DISCOVERY_EVENT:
{
:
if ( simpleBLEScanRes > 0 )
{
uint8 addrType;
uint8 *peerAddr;
simpleBLEScanIdx = simpleBLEScanRes;
// connect to current device in scan result
peerAddr = simpleBLEDevList[simpleBLEScanIdx].addr;
addrType = simpleBLEDevList[simpleBLEScanIdx].addrType;
simpleBLEState = BLE_STATE_CONNECTING;
GAPCentralRole_EstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE,
DEFAULT_LINK_WHITE_LIST,
addrType, peerAddr );
確定有去執行,但是一直等不到Connected的狀態產生,是否還需要再執行哪個Command嗎?
ko,
有没有用packet sniffer 看空中抓包?有没有看到connect request 在空中已经发送出去?
Yan Sir.我並不是很了解這些訊息.

ko,
你贴的图片并不全。
你可以把抓到的文件保存起来,附件到这里,然后我帮你看一下。
Yan Sir.您好!!麻煩您了!!
ko,
从抓包来看,空中并没有connect 命令发送出去。
你应该确认一下代码里面的查找结束后 case GAP_DEVICE_DISCOVERY_EVENT: 之后的动作, 或者 case GAP_DEVICE_INFO_EVENT: 之后信息收集的动作。
Yan Sir,您好!!我們在
case GAP_DEVICE_DISCOVERY_EVENT:
{
:
if ( simpleBLEScanRes > 0 )
{
uint8 addrType;
uint8 *peerAddr;
simpleBLEScanIdx = simpleBLEScanRes;
// connect to current device in scan result
peerAddr = simpleBLEDevList[simpleBLEScanIdx].addr;
addrType = simpleBLEDevList[simpleBLEScanIdx].addrType;
simpleBLEState = BLE_STATE_CONNECTING;
GAPCentralRole_EstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE,
DEFAULT_LINK_WHITE_LIST,
addrType, peerAddr );
然而在 case GAP_DEVICE_INFO_EVENT:似乎沒有執行到此Event
Yan Sir.您好!!我們現在到達parting success了,但是如果想讀SIMPLEPROFILE_CHAR1的資料,請問是透過
req.handle = simpleBLECharHdl;
status = GATT_ReadCharValue( simpleBLEConnHandle, &req, simpleBLETaskId );
來執行嗎?那結果的資料會存在哪邊?要如何去讀取呢?
ko,
你可以搜索一下代码 :
if ( ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP &&
pMsg->hdr.status == bleProcedureComplete ) ||
( pMsg->method == ATT_ERROR_RSP ) )
{
if ( simpleBLESvcStartHdl != 0 )
{
// Discover characteristic
simpleBLEDiscState = BLE_DISC_STATE_CHAR;
req.startHandle = simpleBLESvcStartHdl;
req.endHandle = simpleBLESvcEndHdl;
req.type.len = ATT_BT_UUID_SIZE;
req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR1_UUID);
req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR1_UUID);
GATT_ReadUsingCharUUID( simpleBLEConnHandle, &req, simpleBLETaskId );
}
这个就是读CHAR1 的代码。
返回的值在下面代码中,直接显示在LCD屏上了:
else if ( simpleBLEDiscState == BLE_DISC_STATE_CHAR )
{
// Characteristic found, store handle
if ( pMsg->method == ATT_READ_BY_TYPE_RSP &&
pMsg->msg.readByTypeRsp.numPairs > 0 )
{
simpleBLECharHdl = BUILD_UINT16( pMsg->msg.readByTypeRsp.dataList[0],
pMsg->msg.readByTypeRsp.dataList[1] );
LCD_WRITE_STRING( "Simple Svc Found", HAL_LCD_LINE_1 );
simpleBLEProcedureInProgress = FALSE;
}
simpleBLEDiscState = BLE_DISC_STATE_IDLE;
}
Yan Sir. 您好!!我們目前讀回來的值都不正確,還在查明.請問Ti那邊是否有提供SmartRF05那端的Code可以參考?謝謝您!!
Yan Sir,您好!!我們剛開始從下面紅色的Value讀到正確的值,請問要下哪個Command才能再一次讀取或者會有自動更新產生的event的點嗎?
if ( ( pMsg->method == ATT_READ_RSP ) ||
( ( pMsg->method == ATT_ERROR_RSP ) &&
( pMsg->msg.errorRsp.reqOpcode == ATT_READ_REQ ) ) )
{
if ( pMsg->method == ATT_ERROR_RSP )
{
uint8 status = pMsg->msg.errorRsp.errCode;
LCD_WRITE_STRING_VALUE( "Read Error", status, 10, HAL_LCD_LINE_1 );
}
else
{
// After a successful read, display the read value
uint8 valueRead = pMsg->msg.readRsp.value[0];
LCD_WRITE_STRING_VALUE( "Read rsp:", valueRead, 10, HAL_LCD_LINE_1 );
}
simpleBLEProcedureInProgress = FALSE;
}
else if ( ( pMsg->method == ATT_WRITE_RSP ) ||
( ( pMsg->method == ATT_ERROR_RSP ) &&
( pMsg->msg.errorRsp.reqOpcode == ATT_WRITE_REQ ) ) )
{
if ( pMsg->method == ATT_ERROR_RSP == ATT_ERROR_RSP )
{
uint8 status = pMsg->msg.errorRsp.errCode;
LCD_WRITE_STRING_VALUE( "Write Error", status, 10, HAL_LCD_LINE_1 );
}
else
{
// After a succesful write, display the value that was written and increment value
LCD_WRITE_STRING_VALUE( "Write sent:", simpleBLECharVal++, 10, HAL_LCD_LINE_1 );
}
simpleBLEProcedureInProgress = FALSE;
}
ko,
如果需要繼續連續讀取的話,最好的方法就是加個狀態,在這個讀取完成後,再發送去讀命令:)
Yan Sir.您好!!請問需利用哪個命令去讀,我試過幾個都沒改變.
ko,
是一下這個 GATT_ReadUsingCharUUID(), 在gatt.h 中有很多個read的接口可以調用嘗試:)
Yan Sir.
您好!!我們目前遇到在剛更新Code的第一次Pairing success時下
// Do a read
attReadReq_t req;
req.handle = simpleBLECharHdl;
status = GATT_ReadCharValue( simpleBLEConnHandle, &req, simpleBLETaskId );
}
if ( status == SUCCESS )
{
simpleBLEProcedureInProgress = TRUE;
simpleBLEDoWrite = !simpleBLEDoWrite;
}
可以讀到值,但是電源重開後連結模式變成Bonding success後執行上面的命令就都不會有任何動作,請問您知道原因嗎?要如何修改?
Hi, fs,
想請問你用BLE Bridge與手機APP通訊, 可以再詳詳一下嗎? 我目前也是在摸索BLE Bridge.
還有"是透過UUID:0xFFF0傳送單Byte資料", 也可以詳述如何操作嗎?
感謝.
KJ
Hi,Yan
你好,请问BTool怎么搜索CCCD并打开notification?

