IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > BLE添加特征值

BLE添加特征值 時間:2018-08-16      來源:未知

一、 什么是特征值

特征值就是BLE協議棧向外提供的一個數據接口,藍牙之間的數據傳輸終落實在特征值上。在BLE協議棧的GATT層中封裝了若干服務(service),而在每一個服務中又有若干特征值(characters),特征值可以是任意類型的數據。藍牙之間的數據傳輸靠協議棧提供的write和read函數,而這兩個函數就是在操作特征值

二、UUID

UUID就是通用唯一識別碼。在藍牙協議棧中可能會有多個服務,每個服務會有多個特征值,而這些服務或者特征值都有一個唯一的ID,這樣就可以區分了。這個UUID是其他設備設置藍牙服務和特征值的唯一方法。

三、增加特征值

在BLE協議棧中,GATT層定義了特征值和服務。下面就以SimpleBLEPeripheral為例,增加一個特征值。在simpleGATTprofile.c中,已經有定義好的特征值,參考已有的特征值就可以順利添加自己的特征值

1) 修改頭文件simpleGATTprofile.h

頭文件中定義了特征值的UUID,以及長度和默認值

//特征值UUID

#define SIMPLEPROFILE_CHAR5_UUID            0xFFF5

//特征值長度

#define SIMPLEPROFILE_CHAR5_LEN           5

2)添加特征值相關變量

包括特征值的讀寫權限、變量名、展現給用戶的名字

//特征值初始化

// 特征值屬性,讀或者寫

static uint8 simpleProfileChar6Props = GATT_PROP_READ | GATT_PROP_WRITE;

// 值,可以向其寫入數據,也可以讀出數據。這里是一個字符數組

static uint8 simpleProfileChar6[SIMPLEPROFILE_CHAR6_LEN] = {0};

// 用戶描述,展現給用戶的名字

static uint8 simpleProfileChar6UserDesp[17] = "Characteristic 6\0";

//提取uuid,uuid定義在頭文件中

CONST uint8 simpleProfilechar5UUID[ATT_BT_UUID_SIZE] =

    LO_UINT16(SIMPLEPROFILE_CHAR5_UUID), HI_UINT16(SIMPLEPROFILE_CHAR5_UUID)

};

3)將特征值加入屬性表

特征值由服務統一管理,所有的特征值都會在一個服務的屬性表中呈現出來,每增加一個特征值,它的相關變量就要在添加到屬性表中

//特征值初始化

static gattAttribute_t simpleProfileAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED] = 

{

    // Simple Profile Service

    { 

        { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */

        GATT_PERMIT_READ,                         /* permissions */

        0,                                        /* handle */

        (uint8 *)&simpleProfileService            /* pValue */

    },

    // Characteristic 1 Declaration

    { 

        { ATT_BT_UUID_SIZE, characterUUID },

        GATT_PERMIT_READ, 

        0,

        &simpleProfileChar1Props 

    },

    

    // Characteristic Value 1

    { 

        { ATT_BT_UUID_SIZE, simpleProfilechar1UUID },

        GATT_PERMIT_AUTHEN_READ | GATT_PERMIT_AUTHEN_WRITE, 

        0, 

        &simpleProfileChar1 

    },

    

    // Characteristic 1 User Description

    { 

        { ATT_BT_UUID_SIZE, charUserDescUUID },

        GATT_PERMIT_READ, 

        0, 

        simpleProfileChar1UserDesp 

    },      

  

。。。。。

    

    // Characteristic 5 Declaration

    { 

        { ATT_BT_UUID_SIZE, characterUUID },

        GATT_PERMIT_READ, 

        0,

        &simpleProfileChar5Props 

    },

    

    // Characteristic Value 5

    { 

        { ATT_BT_UUID_SIZE, simpleProfilechar5UUID },

        GATT_PERMIT_AUTHEN_READ| GATT_PERMIT_AUTHEN_WRITE, 

        0, 

        simpleProfileChar5 

    },

    

    // Characteristic 5 User Description

    { 

        { ATT_BT_UUID_SIZE, charUserDescUUID },

        GATT_PERMIT_READ, 

        0, 

        simpleProfileChar5UserDesp 

    },    

4)修改屬性表的長度

每增加一個特征值,屬性表的長度也會增加,因此要修改屬性表的長度。在文件的一開始就聲明了屬性表的長度

#define SERVAPP_NUM_ATTR_SUPPORTED        24

5)修改SimpleProfile_SetParamete和SimpleProfile_GetParamete函數

這是操作特征值的兩個函數,set函數可以用來初始化特征值,get函數可以用來提取特征值。一般我們定義的特征值都是uint8類型的數組,因此無論set還是get,都可以使用copy函數來完成,同時要注意實際的長度

bStatus_t SimpleProfile_SetParameter( uint8 param, uint8 len, void *value )

{

    bStatus_t ret = SUCCESS;

    switch ( param )

    {     

。。。。。。。        

    case SIMPLEPROFILE_CHAR5:

        if ( len <= SIMPLEPROFILE_CHAR5_LEN ) 

        {

           //將value值復制到特征值5,同時注意長度

            VOID osal_memcpy( simpleProfileChar5, value, len );

        }

        else

        {

            ret = bleInvalidRange;

        }

        break;      

    default:

        ret = INVALIDPARAMETER;

        break;

    }

    return ( ret );

}

 

bStatus_t SimpleProfile_GetParameter( uint8 param, void *value )

{

    bStatus_t ret = SUCCESS;

    switch ( param )

    { 

。。。。。。        

case SIMPLEPROFILE_CHAR5:

   //將特征值5復制到value

        VOID osal_memcpy( value, simpleProfileChar5, osal_strlen(simpleProfileChar5));

        break;      

    default:

        ret = INVALIDPARAMETER;

        break;

    }

    

    return ( ret );

}

6)修改simpleProfile_ReadAttrCB和simpleProfile_WriteAttrCB函數

上面已經有了set和get函數,可以實現對特征值的讀寫,那么這里為何又來了一對read和write呢???set和get是用來本地讀寫特征值的,而read和write則是網絡上的讀寫。什么意思呢,當藍牙網絡的另一端想要讀取特征值的時候,協議棧就會自動回調這個read函數,然后將讀取的結果傳輸的網絡的另一端。當然,寫操作也是一樣的。

static uint8 simpleProfile_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr, 

                                      uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen )

{

    bStatus_t status = SUCCESS;

    if ( pAttr->type.len == ATT_BT_UUID_SIZE )

    {

        // 16-bit UUID

        uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]);

        switch ( uuid )

        {

 。。。。。。

            

        case SIMPLEPROFILE_CHAR5_UUID:

            *pLen = osal_strlen(pAttr->pValue);

            VOID osal_memcpy( pValue, pAttr->pValue, osal_strlen(pAttr->pValue) );

            break;            

        default:

            // Should never get here! (characteristics 3 and 4 do not have read permissions)

            *pLen = 0;

            status = ATT_ERR_ATTR_NOT_FOUND;

            break;

        }

    }    

    return ( status );

}

 

static bStatus_t simpleProfile_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr,

                                           uint8 *pValue, uint8 len, uint16 offset )

{

    bStatus_t status = SUCCESS;

    uint8 notifyApp = 0xFF;  

    if ( pAttr->type.len == ATT_BT_UUID_SIZE )

    {

        // 16-bit UUID

        uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]);

        switch ( uuid )

        {

。。。。。。

            

        case SIMPLEPROFILE_CHAR5_UUID: 

            //Validate the value 檢測輸入數據是否合法

            // Make sure it's not a blob oper

            if ( offset == 0 ) //是第一字節

            {

                if ( len >= SIMPLEPROFILE_CHAR6_LEN )

                {

                    status = ATT_ERR_INVALID_VALUE_SIZE;

                } //若輸入長度不對,status為

            }

            else

            {

                status = ATT_ERR_ATTR_NOT_LONG;//不是第一字節

            }

            

            if ( status == SUCCESS )

            {  

                //清空緩沖區

                osal_memset(pAttr->pValue, '\0', SIMPLEPROFILE_CHAR6_LEN) ;

                //復制

                VOID osal_memcpy( pAttr->pValue, pValue, len);

                notifyApp = SIMPLEPROFILE_CHAR6;

            }   

           

            break;    

                        

        default:

            // Should never get here! (characteristics 2 and 4 do not have write permissions)

            status = ATT_ERR_ATTR_NOT_FOUND;

            break;

        }

}

 

7)修改simpleBLEPeripheral.c

A、在SimpleBLEPeripheral_Init函數中可以使用set方法對特征值做初始化操作

SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR5, 5, charValue5 );

B、修改simpleProfileChangeCB

當特征值被網絡的另一端修改之后,協議棧會回調這個函數,通知當前特征值發生變化

static void simpleProfileChangeCB( uint8 paramID )

{

  uint8 newValue;

  uint8 *val;

  switch( paramID )

  {

    。。。。。。

      

    case SIMPLEPROFILE_CHAR5:

      val = osal_msg_allocate(15);

//提取特征值,注意這里使用的是get方式

      SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR5, val );

      break;

    default:

      // should not reach here!

      break;

  }

   SerialPrint(val);

}

 

四、測試

如何驗證特征值已經被成功的添加呢,基于上面的例子,我們需要一個BLE主機設備來讀取特征值。建議使用手機來完成測試,因為你很難確保你的主機代碼是正確的。從網絡上下載BLE調試軟件,可以輕松的操作特征值。

上一篇:BLE 數據接發流程

下一篇:Platform相親之旅

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 潍坊沃林机械设备有限公司-牵引式风送果园打药机,悬挂式风送果园喷雾机,自走式果树喷药机,车载式风送远程喷雾机-潍坊沃林机械设备有限公司-牵引式风送果园打药机,悬挂式风送果园喷雾机,自走式果树喷药机,车载式风送远程喷雾机 潍坊网络推广,临沂360推广,东营360推广,枣庄360推广,潍坊网站建设,潍坊网络公司,潍坊360搜索,潍坊APP开发,潍坊360推广,潍坊360代理,潍坊点睛网络科技有限公司 | 扬州华工电气有限公司|环氧树脂管|金刚石绝缘板|U型绝缘槽|电解槽绝缘材料 | 真空烘箱-高低温试验箱-防爆烘箱-防爆高低温试验箱-老化房-恒温恒湿箱-高低温试验箱-高低温冲击试验箱厂家—上海标承实验仪器有限公司 | 上海商标注册,上海注册商标,上海商标代理,国际商标注册,版权登记-上海律点知识产权代理有限公司 上海山田机械有限公司 | 伸缩机厂家-现货快递物流伸缩皮带机|装车输送机-乐清市华森自动化设备有限公司 | 无锡今飞激光技术有限公司-手持激光焊接机_激光打标机_激光清洗机_平台激光焊接机_焊接专机- | 深山工作室提供网络投票系统|微信公众号投票|微信公众号小程序|抖音小程序|百度小程序|微信公众号开发|企业网站建设 | 山东万利精密机械制造有限公司-高速金属圆锯机,数控高速圆锯机,高速圆锯机生产厂家 | 三机一体除湿干燥机,色母机,称重式拌料机,工业冻水机,中央集中供料-东莞市瑞达机械科技有限公司(瑞达国际) | 泡沫|水罐|干粉消防车价格_特种消防洒水车厂家-湖北江南 | 河北兴泓环保设备有限公司-冷却塔_废气净化塔_污水除臭设备 | 山西配电柜,高低压成套柜,太原高低压柜,山西开关柜,箱变壳体_山西雷隆电柜电气设备有限公司 | 神魔录官网 - 收藏网址的地方,也是防骗小知识分享的地方 | 钠长石-硅铁-硅钙-孕育剂-球化剂-安阳李氏实业有限公司 | 湖南净声源环保科技有限公司是一家专业从事噪声治理和建筑声学设计生态环境综合治理服务的企业,专业从事株洲电梯隔音治理,湘潭中央空调降噪处理,衡阳邵阳冷却塔噪音治理,岳阳常德大型风机噪声隔音降噪,张家界空压机噪声治理,益阳配电房变压器噪声治理,专业郴州永州工厂企业车间噪声治理,怀化娄底专业机械设备减振降治理,武汉噪音治理隔音降噪公司,孝感噪音治理,立式球磨机的噪声控制,专业隔音降噪公司,、以及各类机械动力设备减振降噪噪声治理的公司,同时为客户提供咨询与解决方案 | 湖北高新技术企业认定申报|武汉高企认定代办|武汉项目申报首选 - 湖北创优企科技服务有限公司 | 威学一百-专注国际学校择校备考-DSE-A-level-雅思-托福-OSSD-港澳台联考-AP-IGCSE-IB-AMC-多邻国-PTE-SAT-SSAT-小语种(如日语,韩语,德语,法语,西班牙语,意大利语,俄语,泰语)等考试培训,为出国留学学生提供个性化定制性学习方案,线下实体面授+线上网络课程, 提供一对一,小班课等多种班型 | 江门高空车出租|高空作业设备出租|中特设备租赁有限公司 | 湖南一体化污水处理设备_二氧化氯发生器_一体化净水处理设备_消毒设备厂家-湖南东环环保科技有限公司 | 皮带清扫器-皮带聚氨酯合金空段输送带清扫器刮刀厂家-衡水格锐特机械科技有限公司 | 智能照明模块_智能照明控制器_照明控制系统_智能调光模块_西安邦华电气工程有限公司 | 精馏塔_甲醇回收塔_糠醛塔-无锡弘鼎华化工设备有限公司 | 南京货架|仓库货架|货架公司|仓储货架工厂批发定做-南京苏正科技实业公司 | 太原重卡叔叔运输有限公司-山西太原大件运输、太原物流公司、太原货运物流、太原大件运输、太原货运信息、长治物流公司、长治大件运输、晋城物流公司、晋城大件运输、忻州大件运输、朔州大件运输、阳泉大件运输、大同大件运输、吕梁大件运输、临汾大件运输、运城大件运城 | 泥浆振动筛|卧式泥浆搅拌器|泥浆离心机|泥浆处理固控设备_沧州宏宇石油机械有限公司 | 铁谷网-垂直于铸造产业链服务平台、原材料采购网、行业资讯网 | 乌鲁木齐万疆通管道设备有限公司 销售热线;13565955557-新疆 乌鲁木齐 万疆通 管道设备 波纹补偿器 膨胀节 金属软管 伸缩器 管件 阀门 维修 | 食用油灌装机-油类食用油灌装设备-液体灌装机_青州市惠联灌装机械 | 紫外线光疗仪|白癜风光疗仪|牛皮癣治疗仪|308纳米led|SIGMA|上海希格玛高技术有限公司 | 实验室冷水机-冷却循环水系统-深圳市达沃西制冷设备厂 | 砂基透水砖滤水率,防滑性试验仪,砂基透水砖落球冲击,抗冲击试验机-献县中正试验仪器销售处 | 中深世纪广告公司 深圳标志设计,深圳logo设计公司,包装设计公司,深圳商标设计,深圳画册设计公司 中商信息网-商务数据网-中文商务数据网 | 无线对讲系统-海能达对讲机-广州中达慧通科技有限公司 | 伸缩接头,限位伸缩接头,传力接头,可拆卸接头,橡胶接头,衬四氟橡胶接头,橡胶软连接,橡胶补偿器,防水套管- 巩义市隆盛管道设备有限公司 | 中华收藏网-中藏网-藏品拍卖|字画拍卖|艺术品拍卖|古玩城|收藏资讯|古玩交易|书画定制 | 重庆监控安装_监控系统工程_高清监控摄像头-重庆监控系统安装公司 | 重大事件回顾:三亚哪里可以打炮?2025年最全实战攻略带你玩转真枪射击 | 室内模拟高尔夫,射箭馆-北京鹰搏蓝天科技有限公司 | 交通标志牌-交通标牌-铝圆牌-铝三角片-铝滑槽-公路警示指示牌-方牌-高速道路反光牌毛坯-交通设施安全警示标识牌-路名指示限速限高牌-厂家加工交通标牌铝板半成品毛坯-上海吕盟铝业有限公司 | 小耳朵电源_安防监控电源|小耳朵官网|电源适配器|摄像机电源|开关电源|小耳朵监控电源 | 首页 菲律宾海运双清|马尼拉海运双清|广州菲律宾专线|广州通达供应链有限公司 |