搜索
bottom↓
回复: 0

SYD8801 service.txt文档说明【report_handlhtt】【primary段】【charac...

[复制链接]

出0入0汤圆

发表于 2018-5-10 17:43:39 | 显示全部楼层 |阅读模式
SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机、32位ARM Cortex-M0处理器、128kB Flash存储器、以及丰富的数字接口。SYD8801片上集成了Balun无需阻抗匹配网络、高效率DCDC降压转换器,适合用于可穿戴、物联网设备等。具体可咨询:http://www.syd-tek.com/

service.txt中report_handle的说明
static const uint8_t  _gatt_database_report_handle[] =
{    0x02,
    0x01, 0x00, 0x03, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x00, 0x00,
    0x0F, 0x18, 0x19, 0x2A, 0x26, 0x00, 0x27, 0x00, 0x00, 0x00, // Battery Level
};

    _gatt_database_report_handle的定义如下:
struct gap_att_report_handle {
    uint8_t    cnt;   //可以上报的handle数目
    struct    gap_att_report report[MAX_ATT_REPORT_HDL];
};

struct gap_att_report {
    uint16_t    primary;    //主要服务的uuid
    uint16_t    uuid;      //上报信息的特性的uuid
    uint16_t    hdl;        //上报信息的特性的handle
    uint16_t    config;   
    uint16_t    value;
};

      上面就是一个service.txt的例子的头部,其中第一个个元素是说明有多少个可以上报的handle,这是服务的handle,可以上报的服务指的是拥有notify或者indicate的特性的服务,在上面的例子中电池服务有notify功能,电池服务的uuid是0x180F,还有一个服务是UART服务,UUID是0x0001,所以移动有2个report_handle。


service.txt中primary说明
static const u8 _gatt_database_primary[] =
{
    0x09, 0x01, 0x00, 0x00, 0x28, 0x07, 0x00, 0x00, 0x18, //    0x0001    <Primary Service(0x2800)> <Generic Access(0x1800)>
    0x09, 0x08, 0x00, 0x00, 0x28, 0x0B, 0x00, 0x01, 0x18, //    0x0008    <Primary Service(0x2800)> <Generic Attribute(0x1801)>
    0x09, 0x0C, 0x00, 0x00, 0x28, 0x1A, 0x00, 0x0A, 0x18, //    0x000C    <Primary Service(0x2800)> <Device Information(0x180A)>
    0x17, 0x1B, 0x00, 0x00, 0x28, 0x20, 0x00, 0x1B, 0xC5, 0xD5, 0xA5, 0x02, 0x00, 0xF5, 0x92, 0xE6, 0x11, 0x9f, 0x15, 0x01, 0x00, 0xC0, 0xF8//    0x001B    <Primary Service(0x2800)> <UART UUID(0x0001)>
    0x09, 0x21, 0x00, 0x00, 0x28, 0x23, 0x00, 0x00, 0xFF, //    0x0023    <Primary Service(0x2800)> <OTA UUID(0xFF00)>
    0x09, 0x24, 0x00, 0x00, 0x28, 0xFF, 0xFF, 0x0F, 0x18, //    0x001B    <Primary Service(0x2800)> <Battery Service(0x180F)>
};

   其中_gatt_database_primary的定义如下:
static const u8 _gatt_database_primary[] = {....}     //主要服务数组
struct gatt_service_declaration{
    uint8_t len;              //主要服务长度
    uint16_t hdl;            //主要服务的handle
    uint16_t uuid;          //主要服务的UUID,注意这个UUID代表本行为主要服务,不是该服务的UUID
    uint16_t end_hdl;     //主要服务结束handle
    uint8_t service[1];    //主要服务UUID,如果是128BIT则这里填上128BIT,如果是16bit,则这里是16bit  其长度有len决定
};

   服务的handle到end_hdl之间就排列了该服务的所有特性和描述符的handle

service.txt中characteristic说明


static const u8 _gatt_database_characteristic[] =
{
    0x0A, 0x02, 0x00, 0x03, 0x28, 0x0A, 0x03, 0x00, 0x00, 0x2A,//    0x0002    <Characteristic(0x2803)> <Properties:0x0A> <Value Handle:0x0003> <UUID:Device Name(0x2A00)>
    0x0A, 0x04, 0x00, 0x03, 0x28, 0x02, 0x05, 0x00, 0x01, 0x2A,//    0x0004    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x0005> <UUID:Appearance(0x2A01)>
    0x0A, 0x06, 0x00, 0x03, 0x28, 0x02, 0x07, 0x00, 0x04, 0x2A,//    0x0006    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x0007> <UUID:Peripheral Preferred Connection Parameters(0x2A04)>
    0x0A, 0x09, 0x00, 0x03, 0x28, 0x02, 0x0A, 0x00, 0x05, 0x2A,//    0x0009    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x000A> <UUID:Service Changed(0x2A05)>
    0x0A, 0x0D, 0x00, 0x03, 0x28, 0x02, 0x0E, 0x00, 0x29, 0x2A,//    0x000D    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x000E> <UUID:Manufacturer Name String(0x2A29)>
    0x0A, 0x0F, 0x00, 0x03, 0x28, 0x02, 0x10, 0x00, 0x24, 0x2A,//    0x000F    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x0010> <UUID:Model Number String(0x2A24)>
    0x0A, 0x11, 0x00, 0x03, 0x28, 0x02, 0x12, 0x00, 0x25, 0x2A,//    0x0011    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x0012> <UUID:Serial Number String(0x2A25)>
    0x0A, 0x13, 0x00, 0x03, 0x28, 0x02, 0x14, 0x00, 0x27, 0x2A,//    0x0013    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x0014> <UUID:Hardware Revision String(0x2A27)>
    0x0A, 0x15, 0x00, 0x03, 0x28, 0x02, 0x16, 0x00, 0x26, 0x2A,//    0x0015    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x0016> <UUID:Firmware Revision String(0x2A26)>
    0x0A, 0x17, 0x00, 0x03, 0x28, 0x02, 0x18, 0x00, 0x28, 0x2A,//    0x0017    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x0018> <UUID:Software Revision String(0x2A28)>
    0x0A, 0x19, 0x00, 0x03, 0x28, 0x02, 0x1A, 0x00, 0x50, 0x2A,//    0x0019    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x001A> <UUID:PnP ID(0x2A50)>
    0x18, 0x1C, 0x00, 0x03, 0x28, 0x08, 0x1D, 0x00, 0x1B, 0xC5, 0xD5, 0xA5, 0x02, 0x00, 0xF5, 0x92, 0xE6, 0x11, 0x9f, 0x15, 0x02, 0x00, 0xC0, 0xF8,//    0x001C    <Characteristic(0x2803)> <Properties:0x08> <Value Handle:0x001D> <UUID:Write UUID(0x0002)>   
    0x18, 0x1E, 0x00, 0x03, 0x28, 0x10, 0x1F, 0x00, 0x1B, 0xC5, 0xD5, 0xA5, 0x02, 0x00, 0xF5, 0x92, 0xE6, 0x11, 0x9f, 0x15, 0x03, 0x00, 0xC0, 0xF8,//    0x001E    <Characteristic(0x2803)> <Properties:0x20> <Value Handle:0x001F> <UUID:Notification UUID(0x0003)>
    0x0A, 0x22, 0x00, 0x03, 0x28, 0x0A, 0x23, 0x00, 0x01, 0xFF, //    0x0022    <Characteristic(0x2803)> <Properties:0x0A> <Value Handle:0x0023> <UUID:OTA Read/Write UUID(0xFF01)>   
    0x0A, 0x25, 0x00, 0x03, 0x28, 0x12, 0x26, 0x00, 0x19, 0x2A,//    0x0025    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x0026> <UUID:Battery Level(0x2A19)>
    0x0A, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,    //    End
}

    其中_gatt_database_characteristic定义如下:
characteristic service:
static const u8 _gatt_database_characteristic[] = {...}
struct gatt_charact_declaration{
     uint8_t len;                         //特性长度
     uint16_t hdl;                       //特性的handle
     uint16_t uuid;                    //特性的UUID,注意这个UUID代表本行为特性,不是该特性的UUID
     uint8_t property;                //性能 该特性有的行为能力
     uint16_t val_hdl;               
     uint8_t char_uuid[1];           //特性的UUID
};

    其中 property的定义如下:
enum ATT_CHAR_PROPERTY {
      ATT_CHAR_BROADCAST = 0x01,
       ATT_CHAR_READ = 0x02,
      ATT_CHAR_WEIRE_WO_RSP = 0x04,
     ATT_CHAR_WEIRE = 0x08,
     ATT_CHAR_NOTIFY = 0x10,
    ATT_CHAR_INDICATE = 0x20,
        ATT_CHAR_AUTH_SIGNED_WRITE = 0x40,
      ATT_CHAR_EXTEND_PROPERTY = 0x80,
};
service.txt中value(特性)说明
static const u8 _gatt_database_value[] =
{
    0x0B, 0x00, 0x03, 0x00, 0x10, 0x00, 0x2A, 0x55, 0x41, 0x52, 0x54,                                    //    0x0003            <UUID:Device Name(0x2A00)> <Value:SYD BLE Mouse>
    0x09, 0x00, 0x05, 0x00, 0x10, 0x01, 0x2A, 0xC2, 0x03,                                                //    0x0005            <UUID:Appearance(0x2A01)> <Value:Mouse>
    0x0F, 0x00, 0x07, 0x00, 0x10, 0x04, 0x2A, 0x06, 0x00, 0x06, 0x00, 0x30, 0x00, 0x64, 0x00,                            //    0x0007            <UUID:Peripheral Preferred Connection Parameters(0x2A04)> <Value:Minimum Connection Interval 7.5 ms(0x0006), Maximum Connection Interval 7.5 ms(0x0006), Slave Latency 48(0x0030), Connection Supervision Timeout Multiplier 100(0x0064)>
    0x0B, 0x00, 0x0A, 0x00, 0x10, 0x05, 0x2A, 0x00,    0x00, 0x00, 0x00,                                        //    0x000A            <UUID:Service Channged(0x2A05)> <Value:0x00>
    0x09, 0x00, 0x0B, 0x00, 0x10, 0x02, 0x29, 0x00, 0x00,                                                //    0x000B            <UUID:Client Characteristic Configuration(0x2902)> <Value:Properties Notifications Disabled Indications Disabled>
    0x0D, 0x00, 0x0E, 0x00, 0x10, 0x29, 0x2A, 0x50, 0x69, 0x78, 0x41, 0x72, 0x74,                                    //    0x000E            <UUID:Manufacturer Name String(0x2A29))> <Value:PixArt>
    0x14, 0x00, 0x10, 0x00, 0x10, 0x24, 0x2A, 0x42, 0x4C, 0x45, 0x2D, 0x4D, 0x4F, 0x44, 0x45, 0x4C, 0x2D, 0x30, 0x30, 0x31,                //    0x0010            <UUID:Model Number String(0x2A24)> <Model Number: BLE-MODEL-001>
    0x0E, 0x00, 0x12, 0x00, 0x10, 0x25, 0x2A, 0x42, 0x4C, 0x45, 0x2D, 0x30, 0x30, 0x31,                                //    0x0012            <UUID:Serial Number String(0x2A25)> <Serial Number: BLE-001>
    0x0A, 0x00, 0x14, 0x00, 0x10, 0x27, 0x2A, 0x31, 0x2E, 0x30,                                            //    0x0014            <UUID:Hardware Revision String(0x2A27)> <Hardware Revision: 1.0>
    0x0A, 0x00, 0x16, 0x00, 0x10, 0x26, 0x2A, 0x31, 0x2E, 0x30,                                            //    0x0016            <UUID:Firmware Revision String(0x2627))> <Firmware Revision: 1.0>
    0x0A, 0x00, 0x18, 0x00, 0x10, 0x28, 0x2A, 0x31, 0x2E, 0x30,                                            //    0x0018            <UUID:Software Revision String(0x2628))> <Software Revision: 1.0>
    0x0E, 0x00, 0x1A, 0x00, 0x10, 0x50, 0x2A, 0x02, 0x3A, 0x09, 0x54, 0x42, 0x01, 0x00,                                //    0x001A            <UUID:PnP ID(0x2A50)> <Value:Vendor ID Source :0x02(USB), Vendor ID 0x093A, Product ID 0x4254, Product Version    0x0001>
    0x2A, 0x00, 0x1D, 0x00, 0x90, 0x1B, 0xC5, 0xD5, 0xA5, 0x02, 0x00, 0xF5, 0x92, 0xE6, 0x11, 0x9f, 0x15, 0x02, 0x00, 0xC0, 0xF8, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x2A, 0x00, 0x1F, 0x00, 0x90, 0x1B, 0xC5, 0xD5, 0xA5, 0x02, 0x00, 0xF5, 0x92, 0xE6, 0x11, 0x9f, 0x15, 0x03, 0x00, 0xC0, 0xF8, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x09, 0x00, 0x20, 0x00, 0x10, 0x02, 0x29, 0x00, 0x00,
    0x1C, 0x00, 0x23, 0x00, 0x10, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x08, 0x00, 0x26, 0x00, 0x10, 0x19, 0x2A, 0x64,                                                    //    0x0026            <UUID:Battery Level(0x2A19)> <Value:Level 100 (0x64)>
    0x09, 0x00, 0x27, 0x00, 0x10, 0x02, 0x29, 0x00, 0x00,                                                //    0x0027            <UUID:Client Characteristic Configuration(0x2902)> <Value:Properties Notifications Disabled Indications Disabled>
    0xFF, 0xFF, 0xFF, 0xFF,
}

     其中_gatt_database_value的定义如下:
static const u8 _gatt_database_value[] = {...}

struct gatt_val_declaration{
   uint16_t len;
   uint16_t hdl;
   uint8_t enc;
   union gatt_val_declaration_uuid uuid;
};


修改特性权限
特性权限请看:[url]http://blog.csdn.net/chengdong1314/article/details/69487889[/url]
这里以SYD8801官方开发板为例,设计到特性权限的service.txt如下:


未修改之前的service,txt如下:

此时的特性权限如下:

这里UUID为0x0002的特性只有写特性,这里想给该特性加上可写的权限,通过分析service.txt并结合:http://blog.csdn.net/chengdong1314/article/details/69487889的说明可知,只要把UUID为0x0002特性声明中的0x08(可写)改成0x0a(读写)即可,在service.txt中修改如下:

此时在APP上看到的权限如下,修改成功!




这里上传本小节设计到的资源:<OLED_ROSC_UUID>其中的《SYD8801EVB_Flash_OLD.txt》为修改前的,《SYD8801EVB_Flash.txt》修改后的:
http://download.csdn.net/detail/chengdong1314/9881348


16BIT UUID修改成128bit
    如果你手上只有syd8801_service.txt文件而没有syd8801_service.xml文件,那恭喜你,你想修改UUID配置将更有技术含量,为了帮你一把,特此说明!
    首先更具上面的博文我们知道syd8801_service.txt文件中服务和特性以及描述符的声明如下(举例):
     0x09, 0x01, 0x00, 0x00, 0x28, 0x07, 0x00, 0x00, 0x18, //    0x0001    <Primary Service(0x2800)> <Generic Access(0x1800)>
     0x0A, 0x02, 0x00, 0x03, 0x28, 0x0A, 0x03, 0x00, 0x00, 0x2A,//    0x0002    <Characteristic(0x2803)> <Properties:0x0A> <Value Handle:0x0003> <UUID:Device Name(0x2A00)>
     0x09, 0x00, 0x05, 0x00, 0x10, 0x01, 0x2A, 0xC2, 0x03,                                                //    0x0005            <UUID:Appearance(0x2A01)> <Value:Mouse>
     也就是说不管是服务和特性以及描述符,每行的第一个字节都是代表本行的长度,这里要修改一个服务一起其下的特性等的UUID从16位变成128位,只有进行两个步骤:
1.找到要修改的16bit服务和特性以及描述符,然后字节用128bit的对用的服务和特性以及描述符替换
2.修改本行的长度,也就是在原来的长度的基础上增加14(16个字节减去2个字节),
      如下是16bitUUID的service烧录文件:
0x01,0xE7,0xFE,0xC8,0xFE,0x1F,0x00,0x20,0x00,0x00,0x00
0x09,0x01,0x00,0x00,0x28,0x07,0x00,0x00,0x18,0x09,0x08,0x00,0x00,0x28,0x0B,0x00,0x01,0x18,0x09,0x0C,0x00,0x00,0x28,0x1A,0x00,0x0A,0x18,0x09,0x1B,0x00,0x00,0x28,0xff,0xff,0xE7,0xFE
0x0A,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00
0x0A,0x02,0x00,0x03,0x28,0x0A,0x03,0x00,0x00,0x2A,0x0A,0x04,0x00,0x03,0x28,0x02,0x05,0x00,0x01,0x2A,0x0A,0x06,0x00,0x03,0x28,0x02,0x07,0x00,0x04,0x2A,0x0A,0x09,0x00,0x03,0x28,0x02,0x0A,0x00,0x05,0x2A,0x0A,0x0D,0x00,0x03,0x28,0x02,0x0E,0x00,0x29,0x2A,0x0A,0x0F,0x00,0x03,0x28,0x02,0x10,0x00,0x24,0x2A,0x0A,0x11,0x00,0x03,0x28,0x02,0x12,0x00,0x25,0x2A,0x0A,0x13,0x00,0x03,0x28,0x02,0x14,0x00,0x27,0x2A,0x0A,0x15,0x00,0x03,0x28,0x02,0x16,0x00,0x26,0x2A,0x0A,0x17,0x00,0x03,0x28,0x02,0x18,0x00,0x28,0x2A,0x0A,0x19,0x00,0x03,0x28,0x02,0x1A,0x00,0x50,0x2A,0x0A,0x1C,0x00,0x03,0x28,0x08,0x1D,0x00,0xC7,0xFE,0x0A,0x1E,0x00,0x03,0x28,0x10,0x1F,0x00,0xC8,0xFE,0x0A,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00
0x17,0x00,0x03,0x00,0x10,0x00,0x2A,0x50,0x69,0x78,0x41,0x72,0x74,0x20,0x42,0x4C,0x45,0x20,0x4D,0x6F,0x75,0x73,0x65,0x09,0x00,0x05,0x00,0x10,0x01,0x2A,0xC2,0x03,0x0F,0x00,0x07,0x00,0x10,0x04,0x2A,0x06,0x00,0x06,0x00,0x30,0x00,0x64,0x00,0x0B,0x00,0x0A,0x00,0x10,0x05,0x2A,0x00,0x00,0x00,0x00,0x09,0x00,0x0B,0x00,0x10,0x02,0x29,0x00,0x00,0x0D,0x00,0x0E,0x00,0x10,0x29,0x2A,0x50,0x69,0x78,0x41,0x72,0x74,0x14,0x00,0x10,0x00,0x10,0x24,0x2A,0x42,0x4C,0x45,0x2D,0x4D,0x4F,0x44,0x45,0x4C,0x2D,0x30,0x30,0x31,0x0E,0x00,0x12,0x00,0x10,0x25,0x2A,0x42,0x4C,0x45,0x2D,0x30,0x30,0x31,0x0A,0x00,0x14,0x00,0x10,0x27,0x2A,0x31,0x2E,0x30,0x0A,0x00,0x16,0x00,0x10,0x26,0x2A,0x31,0x2E,0x30,0x0A,0x00,0x18,0x00,0x10,0x28,0x2A,0x31,0x2E,0x30,0x0E,0x00,0x1A,0x00,0x10,0x50,0x2A,0x02,0x3A,0x09,0x54,0x42,0x01,0x00,0x1C,0x00,0x1D,0x00,0x10,0xC7,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x1F,0x00,0x10,0xC8,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x20,0x00,0x10,0x02,0x29,0x00,0x00,0xFF,0xFF,0xFF,0xFF
      如下是修改后的烧录文件:
0x02,0x01,0x00,0x03,0x00,0x1F,0x00,0x20,0x00,0x00,0x00,0x0F,0x18,0x19,0x2A,0x26,0x00,0x27,0x00,0x00,0x00
0x09,0x01,0x00,0x00,0x28,0x07,0x00,0x00,0x18,0x09,0x08,0x00,0x00,0x28,0x0B,0x00,0x01,0x18,0x09,0x0C,0x00,0x00,0x28,0x1A,0x00,0x0A,0x18,0x17,0x1B,0x00,0x00,0x28,0x20,0x00,0x1B,0xC5,0xD5,0xA5,0x02,0x00,0xF5,0x92,0xE6,0x11,0x9f,0x15,0x01,0x00,0xC0,0xF8,0x09,0x21,0x00,0x00,0x28,0x23,0x00,0x00,0xFF,0x09,0x24,0x00,0x00,0x28,0xFF,0xFF,0x0F,0x18
0x0A,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00
0x0A,0x02,0x00,0x03,0x28,0x0A,0x03,0x00,0x00,0x2A,0x0A,0x04,0x00,0x03,0x28,0x02,0x05,0x00,0x01,0x2A,0x0A,0x06,0x00,0x03,0x28,0x02,0x07,0x00,0x04,0x2A,0x0A,0x09,0x00,0x03,0x28,0x02,0x0A,0x00,0x05,0x2A,0x0A,0x0D,0x00,0x03,0x28,0x02,0x0E,0x00,0x29,0x2A,0x0A,0x0F,0x00,0x03,0x28,0x02,0x10,0x00,0x24,0x2A,0x0A,0x11,0x00,0x03,0x28,0x02,0x12,0x00,0x25,0x2A,0x0A,0x13,0x00,0x03,0x28,0x02,0x14,0x00,0x27,0x2A,0x0A,0x15,0x00,0x03,0x28,0x02,0x16,0x00,0x26,0x2A,0x0A,0x17,0x00,0x03,0x28,0x02,0x18,0x00,0x28,0x2A,0x0A,0x19,0x00,0x03,0x28,0x02,0x1A,0x00,0x50,0x2A,0x18,0x1C,0x00,0x03,0x28,0x08,0x1D,0x00,0x1B,0xC5,0xD5,0xA5,0x02,0x00,0xF5,0x92,0xE6,0x11,0x9f,0x15,0x02,0x00,0xC0,0xF8,0x18,0x1E,0x00,0x03,0x28,0x10,0x1F,0x00,0x1B,0xC5,0xD5,0xA5,0x02,0x00,0xF5,0x92,0xE6,0x11,0x9f,0x15,0x03,0x00,0xC0,0xF8,0x0A,0x22,0x00,0x03,0x28,0x0A,0x23,0x00,0x01,0xFF,0x0A,0x25,0x00,0x03,0x28,0x12,0x26,0x00,0x19,0x2A,0x0A,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00
0x0B,0x00,0x03,0x00,0x10,0x00,0x2A,0x55,0x41,0x52,0x54,0x09,0x00,0x05,0x00,0x10,0x01,0x2A,0xC2,0x03,0x0F,0x00,0x07,0x00,0x10,0x04,0x2A,0x06,0x00,0x06,0x00,0x30,0x00,0x64,0x00,0x0B,0x00,0x0A,0x00,0x10,0x05,0x2A,0x00,0x00,0x00,0x00,0x09,0x00,0x0B,0x00,0x10,0x02,0x29,0x00,0x00,0x0D,0x00,0x0E,0x00,0x10,0x29,0x2A,0x50,0x69,0x78,0x41,0x72,0x74,0x14,0x00,0x10,0x00,0x10,0x24,0x2A,0x42,0x4C,0x45,0x2D,0x4D,0x4F,0x44,0x45,0x4C,0x2D,0x30,0x30,0x31,0x0E,0x00,0x12,0x00,0x10,0x25,0x2A,0x42,0x4C,0x45,0x2D,0x30,0x30,0x31,0x0A,0x00,0x14,0x00,0x10,0x27,0x2A,0x31,0x2E,0x30,0x0A,0x00,0x16,0x00,0x10,0x26,0x2A,0x31,0x2E,0x30,0x0A,0x00,0x18,0x00,0x10,0x28,0x2A,0x31,0x2E,0x30,0x0E,0x00,0x1A,0x00,0x10,0x50,0x2A,0x02,0x3A,0x09,0x54,0x42,0x01,0x00,0x2A,0x00,0x1D,0x00,0x90,0x1B,0xC5,0xD5,0xA5,0x02,0x00,0xF5,0x92,0xE6,0x11,0x9f,0x15,0x02,0x00,0xC0,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2A,0x00,0x1F,0x00,0x90,0x1B,0xC5,0xD5,0xA5,0x02,0x00,0xF5,0x92,0xE6,0x11,0x9f,0x15,0x03,0x00,0xC0,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x20,0x00,0x10,0x02,0x29,0x00,0x00,0x1C,0x00,0x23,0x00,0x10,0x01,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x26,0x00,0x10,0x19,0x2A,0x64,0x09,0x00,0x27,0x00,0x10,0x02,0x29,0x00,0x00,0xFF,0xFF,0xFF,0xFF

       对比一下即可,如下是修好后的文件说明:
static const uint8_t  _gatt_database_report_handle[] =
{    0x02,
    0x01, 0x00, 0x03, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x00, 0x00,
    0x0F, 0x18, 0x19, 0x2A, 0x26, 0x00, 0x27, 0x00, 0x00, 0x00, // Battery Level
};

static const u8 _gatt_database_primary[] =
{
    0x09, 0x01, 0x00, 0x00, 0x28, 0x07, 0x00, 0x00, 0x18, //    0x0001    <Primary Service(0x2800)> <Generic Access(0x1800)>
    0x09, 0x08, 0x00, 0x00, 0x28, 0x0B, 0x00, 0x01, 0x18, //    0x0008    <Primary Service(0x2800)> <Generic Attribute(0x1801)>
    0x09, 0x0C, 0x00, 0x00, 0x28, 0x1A, 0x00, 0x0A, 0x18, //    0x000C    <Primary Service(0x2800)> <Device Information(0x180A)>
    0x17, 0x1B, 0x00, 0x00, 0x28, 0x20, 0x00, 0x1B, 0xC5, 0xD5, 0xA5, 0x02, 0x00, 0xF5, 0x92, 0xE6, 0x11, 0x9f, 0x15, 0x01, 0x00, 0xC0, 0xF8//    0x001B    <Primary Service(0x2800)> <UART UUID(0x0001)>
    0x09, 0x21, 0x00, 0x00, 0x28, 0x23, 0x00, 0x00, 0xFF, //    0x0023    <Primary Service(0x2800)> <OTA UUID(0xFF00)>
    0x09, 0x24, 0x00, 0x00, 0x28, 0xFF, 0xFF, 0x0F, 0x18, //    0x001B    <Primary Service(0x2800)> <Battery Service(0x180F)>
};

static const u8 _gatt_database_characteristic[] =
{
    0x0A, 0x02, 0x00, 0x03, 0x28, 0x0A, 0x03, 0x00, 0x00, 0x2A,//    0x0002    <Characteristic(0x2803)> <Properties:0x0A> <Value Handle:0x0003> <UUID:Device Name(0x2A00)>
    0x0A, 0x04, 0x00, 0x03, 0x28, 0x02, 0x05, 0x00, 0x01, 0x2A,//    0x0004    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x0005> <UUID:Appearance(0x2A01)>
    0x0A, 0x06, 0x00, 0x03, 0x28, 0x02, 0x07, 0x00, 0x04, 0x2A,//    0x0006    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x0007> <UUID:Peripheral Preferred Connection Parameters(0x2A04)>
    0x0A, 0x09, 0x00, 0x03, 0x28, 0x02, 0x0A, 0x00, 0x05, 0x2A,//    0x0009    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x000A> <UUID:Service Changed(0x2A05)>
    0x0A, 0x0D, 0x00, 0x03, 0x28, 0x02, 0x0E, 0x00, 0x29, 0x2A,//    0x000D    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x000E> <UUID:Manufacturer Name String(0x2A29)>
    0x0A, 0x0F, 0x00, 0x03, 0x28, 0x02, 0x10, 0x00, 0x24, 0x2A,//    0x000F    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x0010> <UUID:Model Number String(0x2A24)>
    0x0A, 0x11, 0x00, 0x03, 0x28, 0x02, 0x12, 0x00, 0x25, 0x2A,//    0x0011    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x0012> <UUID:Serial Number String(0x2A25)>
    0x0A, 0x13, 0x00, 0x03, 0x28, 0x02, 0x14, 0x00, 0x27, 0x2A,//    0x0013    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x0014> <UUID:Hardware Revision String(0x2A27)>
    0x0A, 0x15, 0x00, 0x03, 0x28, 0x02, 0x16, 0x00, 0x26, 0x2A,//    0x0015    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x0016> <UUID:Firmware Revision String(0x2A26)>
    0x0A, 0x17, 0x00, 0x03, 0x28, 0x02, 0x18, 0x00, 0x28, 0x2A,//    0x0017    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x0018> <UUID:Software Revision String(0x2A28)>
    0x0A, 0x19, 0x00, 0x03, 0x28, 0x02, 0x1A, 0x00, 0x50, 0x2A,//    0x0019    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x001A> <UUID:PnP ID(0x2A50)>
    0x18, 0x1C, 0x00, 0x03, 0x28, 0x08, 0x1D, 0x00, 0x1B, 0xC5, 0xD5, 0xA5, 0x02, 0x00, 0xF5, 0x92, 0xE6, 0x11, 0x9f, 0x15, 0x02, 0x00, 0xC0, 0xF8,//    0x001C    <Characteristic(0x2803)> <Properties:0x08> <Value Handle:0x001D> <UUID:Write UUID(0x0002)>   
    0x18, 0x1E, 0x00, 0x03, 0x28, 0x10, 0x1F, 0x00, 0x1B, 0xC5, 0xD5, 0xA5, 0x02, 0x00, 0xF5, 0x92, 0xE6, 0x11, 0x9f, 0x15, 0x03, 0x00, 0xC0, 0xF8,//    0x001E    <Characteristic(0x2803)> <Properties:0x20> <Value Handle:0x001F> <UUID:Notification UUID(0x0003)>
    0x0A, 0x22, 0x00, 0x03, 0x28, 0x0A, 0x23, 0x00, 0x01, 0xFF, //    0x0022    <Characteristic(0x2803)> <Properties:0x0A> <Value Handle:0x0023> <UUID:OTA Read/Write UUID(0xFF01)>   
    0x0A, 0x25, 0x00, 0x03, 0x28, 0x12, 0x26, 0x00, 0x19, 0x2A,//    0x0025    <Characteristic(0x2803)> <Properties:0x02> <Value Handle:0x0026> <UUID:Battery Level(0x2A19)>
    0x0A, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,    //    End
}

static const u8 _gatt_database_value[] =
{
    0x0B, 0x00, 0x03, 0x00, 0x10, 0x00, 0x2A, 0x55, 0x41, 0x52, 0x54,                                    //    0x0003            <UUID:Device Name(0x2A00)> <Value:PixArt BLE Mouse>
    0x09, 0x00, 0x05, 0x00, 0x10, 0x01, 0x2A, 0xC2, 0x03,                                                //    0x0005            <UUID:Appearance(0x2A01)> <Value:Mouse>
    0x0F, 0x00, 0x07, 0x00, 0x10, 0x04, 0x2A, 0x06, 0x00, 0x06, 0x00, 0x30, 0x00, 0x64, 0x00,                            //    0x0007            <UUID:Peripheral Preferred Connection Parameters(0x2A04)> <Value:Minimum Connection Interval 7.5 ms(0x0006), Maximum Connection Interval 7.5 ms(0x0006), Slave Latency 48(0x0030), Connection Supervision Timeout Multiplier 100(0x0064)>
    0x0B, 0x00, 0x0A, 0x00, 0x10, 0x05, 0x2A, 0x00,    0x00, 0x00, 0x00,                                        //    0x000A            <UUID:Service Channged(0x2A05)> <Value:0x00>
    0x09, 0x00, 0x0B, 0x00, 0x10, 0x02, 0x29, 0x00, 0x00,                                                //    0x000B            <UUID:Client Characteristic Configuration(0x2902)> <Value:Properties Notifications Disabled Indications Disabled>
    0x0D, 0x00, 0x0E, 0x00, 0x10, 0x29, 0x2A, 0x50, 0x69, 0x78, 0x41, 0x72, 0x74,                                    //    0x000E            <UUID:Manufacturer Name String(0x2A29))> <Value:PixArt>
    0x14, 0x00, 0x10, 0x00, 0x10, 0x24, 0x2A, 0x42, 0x4C, 0x45, 0x2D, 0x4D, 0x4F, 0x44, 0x45, 0x4C, 0x2D, 0x30, 0x30, 0x31,                //    0x0010            <UUID:Model Number String(0x2A24)> <Model Number: BLE-MODEL-001>
    0x0E, 0x00, 0x12, 0x00, 0x10, 0x25, 0x2A, 0x42, 0x4C, 0x45, 0x2D, 0x30, 0x30, 0x31,                                //    0x0012            <UUID:Serial Number String(0x2A25)> <Serial Number: BLE-001>
    0x0A, 0x00, 0x14, 0x00, 0x10, 0x27, 0x2A, 0x31, 0x2E, 0x30,                                            //    0x0014            <UUID:Hardware Revision String(0x2A27)> <Hardware Revision: 1.0>
    0x0A, 0x00, 0x16, 0x00, 0x10, 0x26, 0x2A, 0x31, 0x2E, 0x30,                                            //    0x0016            <UUID:Firmware Revision String(0x2627))> <Firmware Revision: 1.0>
    0x0A, 0x00, 0x18, 0x00, 0x10, 0x28, 0x2A, 0x31, 0x2E, 0x30,                                            //    0x0018            <UUID:Software Revision String(0x2628))> <Software Revision: 1.0>
    0x0E, 0x00, 0x1A, 0x00, 0x10, 0x50, 0x2A, 0x02, 0x3A, 0x09, 0x54, 0x42, 0x01, 0x00,                                //    0x001A            <UUID:PnP ID(0x2A50)> <Value:Vendor ID Source :0x02(USB), Vendor ID 0x093A, Product ID 0x4254, Product Version    0x0001>
    0x2A, 0x00, 0x1D, 0x00, 0x90, 0x1B, 0xC5, 0xD5, 0xA5, 0x02, 0x00, 0xF5, 0x92, 0xE6, 0x11, 0x9f, 0x15, 0x02, 0x00, 0xC0, 0xF8, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x2A, 0x00, 0x1F, 0x00, 0x90, 0x1B, 0xC5, 0xD5, 0xA5, 0x02, 0x00, 0xF5, 0x92, 0xE6, 0x11, 0x9f, 0x15, 0x03, 0x00, 0xC0, 0xF8, 0x00,    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x09, 0x00, 0x20, 0x00, 0x10, 0x02, 0x29, 0x00, 0x00,
    0x1C, 0x00, 0x23, 0x00, 0x10, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x08, 0x00, 0x26, 0x00, 0x10, 0x19, 0x2A, 0x64,                                                    //    0x0026            <UUID:Battery Level(0x2A19)> <Value:Level 100 (0x64)>
    0x09, 0x00, 0x27, 0x00, 0x10, 0x02, 0x29, 0x00, 0x00,                                                //    0x0027            <UUID:Client Characteristic Configuration(0x2902)> <Value:Properties Notifications Disabled Indications Disabled>
    0xFF, 0xFF, 0xFF, 0xFF,
}
    一共改了6个地方!
   替换字符:
0xa6,0xf6,0xf6,0x07,0x4d,0xc4,0x9d,0x98,0x6d,0x45,0x29,0xbb,0xd0,0xff,0x00,0x00
0xa6,0xf6,0xf6,0x07,0x4d,0xc4,0x9d,0x98,0x6d,0x45,0x29,0xbb,0xd1,0xff,0x00,0x00
0xa6,0xf6,0xf6,0x07,0x4d,0xc4,0x9d,0x98,0x6d,0x45,0x29,0xbb,0xd2,0xff,0x00,0x00
0xa6,0xf6,0xf6,0x07,0x4d,0xc4,0x9d,0x98,0x6d,0x45,0x29,0xbb,0xd3,0xff,0x00,0x00






SYD8801 service.txt文档说明

本文件分析:《Vendor_Service_Wechat_Flash.txt》
在这个TXT文件里每一行都代表着一个独立的字段。
第一个是GAP事件链头:
static const uint8_t  _gatt_database_report_handle[] =
{        0x01,
         0x01,0x00, 0x03, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x00, 0x00,
};
他的结构体定义如下:
struct gap_att_report_handle {
         uint8_t     cnt;
         struct       gap_att_reportreport[MAX_ATT_REPORT_HDL];
};
其中gap_att_reportreport定义如下:
struct gap_att_report {
         uint16_t   primary;
         uint16_t   uuid;
         uint16_t   hdl;
         uint16_t   config;
         uint16_t   value;
};
第一个字节代表有多少个GAP事件链表,这里只有一个,即第一个字节为0x01
接下来的两个字节是primary:0x0001,这个代表目前所用到的主要服务
接下来两个字节是uuid:0x0003,这个指示首要服务中的特性
再接下来的两个字节是hdl:0x001f,具体意思待解,不过这里在发送函数里使用这个参数。
接下来的两个字节是config:0x0002,具体意思待解
最后的两个字节是value:0x00,这个是代表上面的那个特性的具体的
         下面有一个具体的例子对于这个链表的使用:

在TXT文件里的第二个部分就是主要服务的定义:

         这里定义了四个主要服务:GenericAccess、Generic Attribute、Device Information和WeChat,其中前面三个是蓝牙规范已经定义好的主要服务,这三个在任何一个BLE程序都应该有,下面说说_gatt_database_primary中每一行的定义:
         第一个字节代表的是这行(字段)中一共有多少个字节,这里是0x09,一共有9个字节,如第一行:0x09, 0x01, 0x00, 0x00, 0x28, 0x07, 0x00, 0x00, 0x18,一共九个
         接下来两个字节是这个主要服务(具体对象,可以是服务、特性和描述符)的一个引索值,这个值在本TXT文件里是一个唯一的值,另外这个值应该是一个有意义的值,但是在主要服务里目前本人还未参透其具体意义。
         接下来的两个字节是该字段的标志,这里的0x0028代表这一行(字段)是一个主要服务的声明,0x2803代表特性,0x1000代表描述符
         接下来的两个字节是暂时未知道是什么意思
         最后的两个字节是该主要服务的UUID,如Generic Access(0x1800);Generic Attribute(0x1801);DeviceInformation(0x180A);WeChat UUID(0xFEE7)
在TXT文件里的第三个部分就是特性的定义:

         [url=]_gatt_database_characteristic[/url]中每一行的前5个字节和第二部分的主要服务的前五个字节的定义是一样的,第一个字节是该字段有多少个字节,地二三个字节是引索值,四五字节是特性的标志。
第六个字节字节代表Properties,这个具体的定义还不清晰。
第七八两个字节是Value Handle,具体的含义还是不太明白
第九十字节是这个特性的UUID
在TXT文件里的第三个部分就是描述符,描述符是对特性提供额外属性的说明:

         _gatt_database_value中每一行的前5个字节和第二部分的主要服务的前五个字节的定义是一样的,第一个字节是该字段有多少个字节,地二三个字节是引索值,四五字节是特性的标志。其中的引索值有一个特点:描述符的引索值都是在对应的特性的引索值和下一个特性的引索值之间。
         第六七个字节是代表该描述符属于对哪个特性的补充,如第一行的是0x2A00,说明他是第一个特性Device Name(0x2A00)的补充,从第八个字节开始称为Value,就是该描述符的具体内容了,如第一行的具体内容就是”PixArt BLE Mouse”,这就是Device Name的补充,说明该设备叫做”PixArt BLE Mouse”
         在描述符中有一个描述符很关键,如:

         在该文档中一共定义了两个[url=]客户端特性配置描述符[/url]:
0x09, 0x00, 0x0B, 0x00, 0x10, 0x02, 0x29,0x00, 0x00,这个描述符对应的UUID是:0x2902, 这个uuid在特性列表中没有定义。
         有客户端特性配置描述符的地方表示上面一个特性有些不一样,具体有什么不一样暂时不知道



关于隶属关系:在这个TXT文档中隶属关系是靠hdl也是字段标识来表示的,比如:主要服务:GENERIC_ACCESS:0x01; GENERIC_ATTRIBUTE:0x08; DEVICE_INFORMATION:0x0c

和特性:GAP.DEVICE_NAME:0x02;
GAP.APPEARANCE:0x04;
GAP.PERIPHERAL_PREFERRED_CONNECTION_PARAMETERS:0x06; GATT.SERVICE_CHANGED:0x09;
MANUFACTURER_NAME_STRING:0x0d;
MODEL_NUMBER_STRING:0x0f;
SERIAL_NUMBER_STRING:0x11一直到PNP_ID:0x19

以及值:GAP.DEVICE_NAME:0x03;
UUID:GAP.APPEARANCE:0x05;
UUID:GAP.PERIPHERAL_PREFERRED_CONNECTION_PARAMETERS:0x07;GATT.SERVICE_CHANGED:0x0a;
GATT.CLIENT_CHARACTERISTIC_CONFIGURATION:0x0b;
MANUFACTURER_NAME_STRING:0x0e一直到PNP_ID:0x1a


他们的关系就很明显了:
对于主要服务GENERIC_ACCESS:0x01; GENERIC_ATTRIBUTE:0x08;那么就表明从0x02到0x07的所有内容都属于GENERIC_ACCESS,这其中包括特性与值,对于特性GAP.DEVICE_NAME:0x02; GAP.APPEARANCE:0x04; 那么就说明从0x03到0x03的所有值都属于GAP.DEVICE_NAME,这里只有一个。
这里看一个例子,比如说GENERIC_ACCESS:0x01; GENERIC_ATTRIBUTE:0x08;那么属于他的特性就是从0x02到0x07,在这里就是GAP.DEVICE_NAME:0x02;GAP.APPEARANCE:0x04;
GAP.PERIPHERAL_PREFERRED_CONNECTION_PARAMETERS:0x06;再看看同样落在这一个阶段的值:GAP.DEVICE_NAME:0x03;UUID:GAP.APPEARANCE:0x05;
UUID:GAP.PERIPHERAL_PREFERRED_CONNECTION_PARAMETERS:0x07;那也就是说:GAP.DEVICE_NAME属于特性GAP.DEVICE_NAME:0x02; UUID:GAP.APPEARANCE:0x05;属于特性GAP.APPEARANCE:0x04;UUID:GAP.PERIPHERAL_PREFERRED_CONNECTION_PARAMETERS:0x07;属于特性GAP.PERIPHERAL_PREFERRED_CONNECTION_PARAMETERS:0x06;而这些都属于GENERIC_ACCESS,那么他的结构如下 图:

总结了这么多就可以看看是不是是真的这样了,在软件中查看如下:

可以看到确实如此
另外对于GAP.PERIPHERAL_PREFERRED_CONNECTION_PARAMETERS必须要设置初始值,如下:

目前的工具只是支持16bit的UUID,对于128bit的UUID只能够用手工补的形式,具体做法是直接用128bit的UUID替换掉16bit的UUID,在代码中之用定义128bit中的16bit就行了


这里上传上本博客介绍到的service.txt:
http://download.csdn.net/detail/chengdong1314/9798153

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-30 00:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表