在使用例程中的藍(lán)牙主機(jī)想要對從機(jī)進(jìn)行讀寫操作,就是針對Read和Write服務(wù)屬性,是要先獲取到這個屬性Read和Write的UUID的handle值,那如何獲取這兩個handle值怎么獲取,獲取到之后,又怎么處理發(fā)送數(shù)據(jù)給從機(jī)和接收從機(jī)的數(shù)據(jù)?麻煩解釋一下
您好,留個郵箱,給您發(fā)獲取所有服務(wù)和特征的demo
主機(jī)收發(fā)代碼參考博客:CH573 CH582 CH579藍(lán)牙從機(jī)(Peripheral)/主機(jī)(Central)例程講解一(藍(lán)牙主從機(jī)收發(fā)數(shù)據(jù)接口說明) - WCH藍(lán)牙應(yīng)用分享 - 博客園 (cnblogs.com)
個人信息保護(hù),已隱藏,謝謝!
已發(fā)送至郵箱,請查收。
?我用您發(fā)的程序,測試過,是能獲取到例程中從機(jī)的每一個服務(wù)的,但是我通過E1 FF進(jìn)行收從機(jī)的數(shù)據(jù),也想通過E3 FF發(fā)送數(shù)據(jù)給從機(jī),這個程序中好像沒有這個操作,這個怎么實(shí)現(xiàn)?
您好,您從機(jī)端也是用我司的MCU做嗎,看獲取服務(wù)的情況,是跑的EVT中的從機(jī)例程。
如果是的話,char1已經(jīng)有read權(quán)限了,char3也有write權(quán)限,這樣配合獲取到的char_handle,可以直接在主機(jī)例程中修改發(fā)包(默認(rèn)是寫centralCharVal=0x5A一個字節(jié))。
如果不是我司MCU做從機(jī),是其他設(shè)備,那么先要確定從機(jī)端的各個特性下有讀寫權(quán)限,再配合獲取到的char_handle發(fā)包。
用的你們公司的CH583M的開發(fā)板,從機(jī)就是例程,主機(jī)程序就是您發(fā)給我的程序,我把程序中那個讀寫任務(wù)開了,但是沒有反應(yīng),還是沒有讀寫的數(shù)據(jù)的操作,就是沒有寫centralCharVal=0x5A一個字節(jié),串口打印那邊沒有打印出來
ffe3查看到handle值是0x29,已經(jīng)枚舉出來,接下來就是將該handle進(jìn)行write。
可以先看下這些if語句是否滿足執(zhí)行,如果不滿足,可以暫時先屏蔽掉。
其次是查看write函數(shù)的返回值是否發(fā)送成功(返回值為0),可以手動加個打印信息看看。
.
找到問題了,我注釋了if(centralProcedureInProgress == FALSE)這程序,才能對ffe3進(jìn)行
write操作數(shù)據(jù),但是不明白,程序是從你們給的,我也沒有改,為啥我注釋那里就能進(jìn)行寫操作,
你們可以拿從機(jī)例程試一下,只要注釋這個地方才能寫數(shù)據(jù),
麻煩再請教一個問題,如果我想對ffe1這個里面進(jìn)行read和write進(jìn)行操作,是不是只要改handle的值,
PRINT("char_properties? :%02x,%s\r\n",char_properties,(char_properties&(GATT_PROP_WRITE|GATT_PROP_WRITE_NO_RSP))?"wite handle":"");
? ? ? ? ? ? ? ? PRINT("char_value_handle:%04x\r\n",char_value_handle);? //特征的值句柄
? ? ? ? ? ? ? ? PRINT("char_uuid_length :%02d\r\n",char_uuid_length);? //特征UUID的長度
? ? ? ? ? ? ? ? PRINT("char_uuid? ? ? ? :");? //打印特征UUID的值
? ? ? ? ? ? ? ? hex_dump(char_uuid,char_uuid_length);
? ? ? ? ? ? ? if(char_properties&(GATT_PROP_WRITE|GATT_PROP_WRITE_NO_RSP))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? centralCharHdl = char_value_handle;
? ? ? ? ? ? ? ? ? ? PRINT("wtite handle:%04x\r\n",char_value_handle);
? ? ? ? ? ? ? ? ? ? tmos_start_task(centralTaskId, START_READ_OR_WRITE_EVT, 1600);
? ? ? ? ? ? ? ? }
是這里面需要更改參數(shù)么
根據(jù)5樓你打印出來的handle值,直接填寫進(jìn)行write就可以了。
默認(rèn)的主機(jī)例程有centralProcedureInProgress的賦值,提供你的代碼可能沒有賦值,只是進(jìn)行的枚舉操作,可以直接將if判斷去掉。
進(jìn)行通信需要獲取到handle值,uuid是獲取handle的方式,也可以抓包獲取?;蛘叩絟andle值后進(jìn)行收發(fā)函數(shù)調(diào)用就可以了。
參考博客:
藍(lán)牙BLE主機(jī)Central講解三(服務(wù)枚舉) - SweetTea_lllpc - 博客園 (cnblogs.com)
看了博客,里面沒有對READ的操作,還是沒有實(shí)現(xiàn)READ的功能,能否指導(dǎo)一下,如何寫,
就是對ffe1這個里面進(jìn)行read和write數(shù)據(jù),
個人信息保護(hù),已隱藏,
默認(rèn)的例程有read函數(shù)的配置,獲取到handle值后進(jìn)行read數(shù)據(jù)就可以了
我在你們發(fā)的程序中,添加了一個REDA的判斷,但是好像沒有讀取到從機(jī)的任何數(shù)據(jù)?能否提供一個能夠具有READ的函數(shù),就是能讀取到從機(jī)的數(shù)據(jù)
主機(jī)枚舉服務(wù)之后,直接根據(jù)handle值進(jìn)行read
默認(rèn)的例程就可以實(shí)現(xiàn)。連接之后會讀取char1。如果需要一直讀取就重復(fù)調(diào)用tmos任務(wù)。
注意使用GATT_DiscCharsByUUID獲取到的handle,進(jìn)行收發(fā)的時候需要將handle+1;使用GATT_ReadUsingCharUUID獲取到的handle,直接將handle填寫進(jìn)行收發(fā)就可以了。