蓝牙 - 设备类型设置: Class of Device
创始人
2024-05-30 14:17:21
0

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

显示的图标是根据搜到或连接上的设备类型信息而显示的,这个信息就是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

 

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...