在电脑或手机上,搜寻和连接蓝牙设备时,不同的蓝牙设备显示的图标是不同的,比如搜到或连接上的设备是一个蓝牙键盘,显示的就会是键盘图标,如果搜索到的设备是一个手柄,显示的就是一个手柄图标。
显示的图标是根据搜到或连接上的设备类型信息而显示的,这个信息就是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