蓝牙 - 设备类型设置: Class of Device

在电脑或手机上,搜寻和连接蓝牙设备时,不同的蓝牙设备显示的图标是不同的,比如搜到或连接上的设备是一个蓝牙键盘,显示的就会是键盘图标,如果搜索到的设备是一个手柄,显示的就是一个手柄图标。

显示的图标是根据搜到或连接上的设备类型信息而显示的,这个信息就是COD(class of device)信息。这个信息是在Discovery过程中搜索周围的蓝牙设备时,搜索方从被搜到的设备那里得到的。然后依据COD来判断设备类型,决定显示什么样的图标。

在进行蓝牙产品开发时,通过设置这个信息,就可以显示跟你的产品相匹配的图标。注意这个COD信息主要使用在BR/EDR经典蓝牙上。对于BLE,一般使用的的是广播数据中有两个字节的appearance,而不是三个字节的COD信息。

具体的Class of Device信息介绍如下。

COD信息由四部分组成:

- A Major Service Classes bitfield // 主要服务类型

- A Major Device Class enumerated value // 主要设备类型

- The Minor Device Classes // 次要设备类型

- A fixed value of 0b00 in the two least significant bits // 固定的最低两位bit的值为0

主要设备类型不同,次要设备类型值的含义也不同。

COD信息的结构定义如下:

Major Service Classes

Last Modified: 2022-05-25

Bit 

Class of Device Major Service Class

13

Limited Discoverable Mode

14

LE audio

15

Reserved for future use

16

Positioning (Location identification)

17

Networking (LAN, Ad hoc, ...)

18

Rendering (Printing, Speakers, ...)

19

Capturing (Scanner, Microphone, ...)

20

Object Transfer (vInbox, vFolder, ...)

21

Audio (Speaker, Microphone, Headset service, ...)

22

Telephony (Cordless telephony, Modem, Headset service, ...)

23

Information (WEBserver, WAPserver, ...)

这个是每个位表示一种类型。

Major Device Classes

12

11

10

9

8

Major Device Class

0

0

0

0

0

Miscellaneous

0

0

0

0

1

Computer (desktop, notebook, PDA, organizer, ...)

0

0

0

1

0

Phone (cellular, cordless, pay phone, modem, ...)

0

0

0

1

1

LAN/Network Access point

0

0

1

0

0

Audio/Video (headset, speaker, stereo, video display, VCR, ...)

0

0

1

0

1

Peripheral (mouse, joystick, keyboard, ...)

0

0

1

1

0

Imaging (printer, scanner, camera, display, ...)

0

0

1

1

1

Wearable

0

1

0

0

0

Toy

0

1

0

0

1

Health

1

1

1

1

1

Uncategorized: device code not specified

Minor Device Class field – Computer Major Class

如果主要设备类型是电脑,次要设备类型信息如下:

7

6

5

4

3

2

Minor Device Class

0

0

0

0

0

0

Uncategorized, code for device not assigned

0

0

0

0

0

1

Desktop workstation

0

0

0

0

1

0

Serverclass computer

0

0

0

0

1

1

Laptop

0

0

0

1

0

0

Handheld PC/PDA (clamshell)

0

0

0

1

0

1

Palmsize PC/PDA

0

0

0

1

1

0

Wearable computer (watch size)

0

0

0

1

1

1

Tablet

Minor Device Class field – Phone Major Class

如果主要设备类型是手机,次要设备类型信息如下:

7

6

5

4

3

2

Minor Device Class

0

0

0

0

0

0

Uncategorized, code for device not assigned

0

0

0

0

0

1

Cellular

0

0

0

0

1

0

Cordless

0

0

0

0

1

1

Smartphone

0

0

0

1

0

0

Wired modem or voice gateway

0

0

0

1

0

1

Common ISDN access 

Minor Device Class field – LAN/Network Access point Major Class

7

6

5

Minor Device Class

0

0

0

Fully available

0

0

1

1% to 17% utilized

0

1

0

17% to 33% utilized

0

1

1

33% to 50% utilized

1

0

0

50% to 67% utilized

1

0

1

67% to 83% utilized

1

1

0

83% to 99% utilized

1

1

1

No service available

4

3

2

Minor Device Class

0

0

0

Uncategorized (use this value if no others apply)

Minor Device Class field – Audio/Video Major Class

7

6

5

4

3

2

Minor Device Class

0

0

0

0

0

0

Uncategorized, code not assigned

0

0

0

0

0

1

Wearable Headset Device

0

0

0

0

1

0

Handsfree Device

0

0

0

0

1

1

(Reserved)

0

0

0

1

0

0

Microphone

0

0

0

1

0

1

Loudspeaker

0

0

0

1

1

0

Headphones

0

0

0

1

1

1

Portable Audio

0

0

1

0

0

0

Car Audio

0

0

1

0

0

1

Settop box

0

0

1

0

1

0

HiFi Audio Device

0

0

1

0

1

1

VCR

0

0

1

1

0

0

Video Camera

0

0

1

1

0

1

Camcorder

0

0

1

1

1

0

Video Monitor

0

0

1

1

1

1

Video Display and Loudspeaker

0

1

0

0

0

0

Video Conferencing

0

1

0

0

0

1

(Reserved)

0

1

0

0

1

0

Gaming/Toy

Minor Device Class field – Peripheral Major Class

7

6

Minor Device Class

0

0

Uncategorized, code not assigned

0

1

Keyboard

1

0

Pointing device

1

1

Combo Keyboard/Pointing device

5

4

3

2

Minor Device Class

0

0

0

0

Uncategorized, code not assigned

0

0

0

1

Joystick

0

0

1

0

Gamepad

0

0

1

1

Remote control

0

1

0

0

Sensing device

0

1

0

1

Digitizer tablet

0

1

1

0

Card Reader (e.g. SIM Card Reader)

0

1

1

1

Digital Pen

1

0

0

0

Handheld scanner for barcodes, RFID, etc.

1

0

0

1

Handheld gestural input device (e.g., “wand” form factor)

Minor Device Class field – Imaging Major Class

7

6

5

4

Minor Device Class

X

X

X

1

Display

X

X

1

X

Camera

X

1

X

X

Scanner

1

X

X

X

Printer

3

2

Minor Device Class

0

0

Uncategorized, default

Minor Device Class field – Wearable Major Class

7

6

5

4

3

2

Minor Device Class

0

0

0

0

0

1

Wristwatch

0

0

0

0

1

0

Pager

0

0

0

0

1

1

Jacket

0

0

0

1

0

0

Helmet

0

0

0

1

0

1

Glasses

Minor Device Class field – Toy Major Class

7

6

5

4

3

2

Minor Device Class

0

0

0

0

0

1

Robot

0

0

0

0

1

0

Vehicle

0

0

0

0

1

1

Doll/Action figure

0

0

0

1

0

0

Controller

0

0

0

1

0

1

Game

Minor Device Class field – Health Major Class

7

6

5

4

3

2

Minor Device Class

0

0

0

0

0

0

Undefined

0

0

0

0

0

1

Blood Pressure Monitor

0

0

0

0

1

0

Thermometer

0

0

0

0

1

1

Weighing Scale

0

0

0

1

0

0

Glucose Meter

0

0

0

1

0

1

Pulse Oximeter

0

0

0

1

1

0

Heart/Pulse Rate Monitor

0

0

0

1

1

1

Health Data Display

0

0

1

0

0

0

Step Counter

0

0

1

0

0

1

Body Composition Analyzer

0

0

1

0

1

0

Peak Flow Monitor

0

0

1

0

1

1

Medication Monitor

0

0

1

1

0

0

Knee Prosthesis

0

0

1

1

0

1

Ankle Prosthesis

0

0

1

1

1

0

Generic Health Manager

0

0

1

1

1

1

Personal Mobility Device

举个例子,比如我手里拿的是一把带camera的扫描枪,使用蓝牙的SPP串口协议连接电脑,可以传输数据包括图像,它的COD就是:

MAJOR_SERVICE_CLASS = 0x40 // Capturing (Scanner, Microphone, ...)

MAJOR_DEVICE_CLASS = 0x06  //  Imaging (printer, scanner, camera, display, ...)

MINOR_DEVICE_CLASS = 0x18  //  Camera + Scanner

Byte2:0x08

Byte1:0x06

Byte0:0x60

如果我拿的是一个蓝牙键盘:

MAJOR_SERVICE_CLASS = 0x00 // 无

MAJOR_DEVICE_CLASS = 0x05  //  Peripheral (mouse, joystick, keyboard, ...)

MINOR_DEVICE_CLASS = 0x10  //  Keyboard

Byte2:0x00

Byte1:0x05

Byte0:0x40

关于COD信息的操作的宏:

typedef  struct _tagClass_of_Device_t

{

   Byte_t Class_of_Device0;

   Byte_t Class_of_Device1;

   Byte_t Class_of_Device2;

} Class_of_Device_t;

#define GET_CLASS_OF_DEVICE_FORMAT_TYPE(_x)                     \

   ((Byte_t)((_x).Class_of_Device0 & 0x03))

#define SET_CLASS_OF_DEVICE_FORMAT_TYPE(_x, _y)                 \

   ((_x).Class_of_Device0 = ((_x).Class_of_Device0 & 0xFC) | ((_y) & 0x03))

#define GET_MAJOR_SERVICE_CLASS(_x)                                   \

  ((Word_t)(((_x).Class_of_Device2 << 0x03) | ((_x).Class_of_Device1 >> 0x05)))

#define SET_MAJOR_SERVICE_CLASS(_x, _y)                               \

{                                                                     \

   (_x).Class_of_Device2  = (Byte_t)(((_y) & 0x7FF) >> 0x03);         \

   (_x).Class_of_Device1 &= (Byte_t)0x1F;                             \

   (_x).Class_of_Device1 |= (Byte_t)((((_y) & 0xFF) << 0x05) & 0xFF); \

}

#define GET_MAJOR_DEVICE_CLASS(_x)                                    \

   ((Byte_t)((_x).Class_of_Device1 & 0x1F))

#define SET_MAJOR_DEVICE_CLASS(_x, _y)                                \

{                                                                     \

   (_x).Class_of_Device1 &= 0xE0;                                     \

   (_x).Class_of_Device1 |= (Byte_t)((_y) & 0x1F);                    \

}

#define GET_MINOR_DEVICE_CLASS(_x)                                    \

   ((Byte_t)((_x).Class_of_Device0 >> 0x02))

#define SET_MINOR_DEVICE_CLASS(_x, _y)                                \

{                                                                     \

   (_x).Class_of_Device0 &= (Byte_t)0x03;                             \

   (_x).Class_of_Device0 |= (Byte_t)(((_y) << 0x02) & 0xFC);          \

}

#define ASSIGN_CLASS_OF_DEVICE(_dest, _x, _y, _z) \

{                                                 \

   (_dest).Class_of_Device0 = (_z);               \

   (_dest).Class_of_Device1 = (_y);               \

   (_dest).Class_of_Device2 = (_x);               \

参考:

Requesting Assigned Numbers – Bluetooth SIG Inc

2.8 Class of Device

猜你喜欢

转载自blog.csdn.net/guoqx/article/details/129396192
今日推荐