国产成人av人人爽人人澡-亚洲国产日韩欧美一区-好吊日视频这里只有精品-日本高清精品视频在线

你好!歡迎來到深圳市穎特新科技有限公司!
語言
當前位置:首頁 >> MM32/靈動微電子 >> MM32W無線MCU系列產品應用筆記 —— 自定義服務和特征值

MM32W無線MCU系列產品應用筆記 —— 自定義服務和特征值

關鍵字:靈動微電子 MM32W無線MCU 自定義服務和特征值 作者: 來源: 發(fā)布時間:2022-06-09  瀏覽:11
MM32W0x2xxB 藍牙功能協議棧目前以Lib 形式提供,用戶通過調用相關接口的方式實現對應功能。例程中,用戶如需調整BLE 數據交互的特征值、服務及數據的收發(fā),可按照如下的幾個步驟進行調整,大部分的配置都在..\SRC_LIB\app.c文件中。


藍牙之間通信是以參數來進行數據傳輸,即服務端定好一個參數,客戶端可以對這個參數進行讀,寫,通知等操作,這個東西我們稱之為特征值(characteristic),但一個參數不夠我們用,比如我們這個特征值是電量的值,另一個特征值是設備讀取的溫度值。那這時候會有多個特征值,并且我們還會對它們分類,分出來的類我們稱之為服務(service)。一個設備可以有多個服務,每一個服務可以包含多個特征值,本章節(jié)將介紹如何在例程中調整服務及自定義特征值。


在收發(fā)數據的時候,對于協議的處理基本都在lib中完成了,我們只需要在對應的接口函數中進一步處理就好。


聲明與定義


首先是服務及特特征值的定義,用戶可以自己分配,參考結構定義如下所示:


typedef struct ble_character16{


u16 type16; //type2


u16 handle_rec; //handle


u8 characterInfo[5];//property1 - handle2 - uuid2


u8 uuid128_idx; //0xff means uuid16,other is idx of uuid128


}BLE_CHAR;


typedef struct ble_UUID128{


u8 uuid128[16];//uuid128 string: little endian


}BLE_UUID128;


分別修改const BLE_CHAR AttCharList[]和const BLE_UUID128 AttUuid128List[]中的數據,自行分配句柄(遞增,不得重復)


1、type16 為database 每個記錄的類型,具體取值根據藍牙規(guī)范定義;


常用的三個宏定義:


#define TYPE_CHAR 0x2803  //特征值的聲明


#define TYPE_CFG 0x2902  //客戶端特征值配置描述符


#define TYPE_INFO 0x2901  //特征值用戶描述符


2、handle_rec 為對應記錄的句柄,用戶可以自定義;


3、characterInfo 保存了對應特征值的屬性(property1)、句柄(handle2)及uuid(uuid2),其中handle2 及uuid2 為16 bit 小端格式;


常用的屬性的宏定義如下:


#define ATT_CHAR_PROP_RD   0x02   //可讀


#define ATT_CHAR_PROP_W_NORSP   0x04   //可寫,無需應答


#define ATT_CHAR_PROP_W  0x08    //可寫


#define ATT_CHAR_PROP_NTF  0x10    //notify


#define ATT_CHAR_PROP_IND   0x20    //indicate


4、uuid128_idx 表示uuid2 的格式,如該值為UUID16_FORMAT(0xFF) 則表示uuid2 為16bit 格式,反之則表示uuid2 為128bit 的uuid 信息對應的索引值,該索引值對應于AttUuid128List 的內容索引。uuid128 為小端格式保存。UUID就是通用唯一識別碼。在藍牙協議棧中可能會有多個服務,每個服務會有多個特征值,而這些服務或者特征值都有一個唯一的ID,這樣就可以區(qū)分了。這個UUID是其他設備設置藍牙服務和特征值的唯一方法。


應答Primary Service 的查詢
下一步要修改的是att_server_rdByGrType函數。
在函數中缺省情況下如果客戶對Device Info 不做特別修改,可直接調用缺省函數att_server_rdByGrTypeRspDeviceInfo(pdu_type)即可。


而下面的att_server_rdByGrTypeRspPrimaryService()需要按照上面的定義填充對應的數據,其中start_hd 與end_hd 為對應Service handle 取值范圍,uuid 為字符串,對應的長度由uuidlen給出。


寫操作


            當外界發(fā)來相關數據時,ser_write_rsp()函數將被調用。


            void ser_write_rsp(       u8 pdu_type/*reserved*/, 


            u8 attOpcode/*reserved*/, 


            u16 att_hd,  //對應特征值句柄


            u8* attValue, //數據內容指針


            u8 valueLen_w) //數據長度






       通過判斷特征值句柄att_hd,就可以進一步處理收到的數據。


 若特征值屬性為ATT_CHAR_PROP_W,需要調用ser_write_rsp_pkt()函數對這次寫操作進行應答,不應答會導致連接斷開。


若特征值無效或未定義,則使用att_notFd()函數進行應答,參數直接引用回調函數對應參數即可。


其中att_hd 為從手機BLE 傳(寫)過來數據對應的特征值的句柄,數據內容保存在變量attValue 中,數據長度為valueLen_w。


讀操作


類似寫操作,收到讀取特征值請求時,ser_write_rsp()函數將被調用。


void server_rd_rsp(u8 attOpcode, u16 attHandle, u8 pdu_type)


通過判斷attHandle來執(zhí)行對應操作,使用att_server_rd()函數進行應答。


void att_server_rd(unsigned char pdu_type,


unsigned char attOpcode


unsigned short att_hd,   //對應特征值句柄


unsigned char* attValue,  //應答數據指針


unsigned char datalen );  //數據長度


其中pdu_type和attOpcode直接引用回調函數中對應參數,每次調用發(fā)送的數據長度不得超過20字節(jié)。


同寫操作,若特征值無效或未定義,則使用att_notFd()函數進行應答。


Notify 數據發(fā)送操作


在模塊出廠時燒錄的例程中,可以通過UART的AT指令,調用Notify數據透傳,對應的接口函數是


u8 sconn_notifydata(u8* data, u8 len);


原則上數據長度可以超過20 字節(jié),協議會自動拆包發(fā)送,每個分包最大20字節(jié),推薦一次發(fā)送的數據盡量不超過3 個分包,該函數返回實際發(fā)送的數據長度。這一函數沒有指定對應的句柄,如果用戶定義了多個Notify特征值,需要在發(fā)送前使用set_notifyhandle()函數指定對應的句柄,或者直接修改變量u16 cur_notifyhandle。


下面我們以在例程中添加一個可讀可寫的特征值為例,最后通過手機app與BLE之間進行通信:


1、在const BLE_CHAR AttCharList[]數組最后添加


{TYPE_CHAR,0x1A,ATT_CHAR_PROP_RD|ATT_CHAR_PROP_W, 0x1B,0,0,0,4},


//User defined


即在原數組最后句柄0x19后添加新的特征值,對應特征值設置可讀可寫,句柄0x001B為用戶自定義特征值,128位UUID,索引值為4;


2、在const BLE_UUID128 AttUuid128List[]數組最后添加對應的UUID


{0x9e,0xca,0x0dc,0x24,0x0e,0xe5,0xa9,0xe0,0x93,0xf3,0xa3,0xb5,5,0,0x40,0x6e}, //idx4,little endian, Test


3、修改att_server_rdByGrType()函數:


att_server_rdByGrTypeRspPrimaryService(pdu_type,0x10,0x1B,(u8*)(AttUuid128List[0].uuid128),16);


修改最后的句柄值。


4、修改ser_write_rsp()函數


在switch(att_hd)分支中加入


case 0x1B:


moduleOutData("Write_Server_1B\r\n",17);   


ser_write_rsp_pkt(pdu_type);


break;


5、修改server_rd_rsp()函數


在switch(attHandle)分支中加入


case 0x1B: 


moduleOutData("Read_Server_1B\r\n",17);   


att_server_rd( pdu_type, attOpcode, attHandle, "RD_SERVE_1B", 11);


break;


如下圖,程序下載運行后,我們用手機連接模塊,可以看到在服務列表最后多出了一項Unknown Characteristic ,可讀可寫,點擊讀按鈕,可以收到字符串” RD_SERVE_1B”,UART串口輸出”Read_Server_1B”,點擊寫按鈕發(fā)送任意值會UART串口輸出”Write_Server_1B”。


圖片


圖1 手機端截圖


圖片


圖2 UART輸出

如需要了解更多靈動微MCU產品,請聯系靈動微核心代理商-穎特新科技

編輯:ls  最后修改時間:2022-06-09

聯系方式

0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08

Copyright © 2014-2023 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號-4

亚洲二区欧美一区二区| 久草精品视频精品视频精品| 日本成人三级在线播放| 日本人妻丰满熟妇久久| 国产人妻熟女高跟丝袜| 欧美日韩在线第一页日韩| 少妇人妻中出中文字幕| 国产老女人性生活视频| 欧洲偷拍视频中文字幕| 婷婷九月在线中文字幕| 欧美不雅视频午夜福利| 国产成人精品99在线观看| 日韩一区二区三区免费av| 国产精品免费自拍视频| 国产成人在线一区二区三区| 成年女人下边潮喷毛片免费| 欧美一级片日韩一级片| 久久这里只有精品中文字幕| 久久精品国产熟女精品| 国产肥妇一区二区熟女精品| 九九热在线视频观看最新| 精品视频一区二区三区不卡| 日韩国产亚洲一区二区三区| 国产亚洲精品久久久优势| 中文字幕欧美视频二区| 免费福利午夜在线观看| 日本道播放一区二区三区| 欧洲亚洲精品自拍偷拍| 中文字幕久久精品亚洲乱码| 日本人妻中出在线观看| 色婷婷亚洲精品综合网| 久久精品色妇熟妇丰满人妻91| 欧美自拍偷自拍亚洲精品| 国产乱淫av一区二区三区| 日本欧美一区二区三区在线播| 亚洲精品中文字幕无限乱码| 国产欧美高清精品一区| 国产精品一区二区视频大全| 青青操视频在线播放免费| 不卡一区二区高清视频| 久久永久免费一区二区|