全志 bluez spp uuid
时间: 2024-08-14 17:04:37 浏览: 171
全志(Allwinner)是一家中国嵌入式芯片设计公司,其产品广泛应用于智能电视、平板电脑等设备上。BlueZ是一个开源的蓝牙协议栈,它主要用于Linux系统,提供蓝牙设备间的通信功能。
SPP (Serial Port Profile) 是一种蓝牙规范,也称为串口蓝牙Profile,用于在蓝牙设备之间创建虚拟串行端口。当涉及到全志产品的蓝牙应用时,如果它们支持BlueZ,那么SPP UUID通常对应于蓝牙串口服务的标准UUID,即`0x1101`。这个UUID标识了一个设备可以作为串口进行数据传输,这对于需要通过蓝牙连接串口设备的场景非常有用。
相关问题
linux下Bluez中如何监听指定UUID的spp
要监听指定UUID的SPP,需要使用Bluez提供的SDP(Service Discovery Protocol)机制。
1. 首先,需要创建一个SDP记录:
```c
uuid_t spp_uuid = ...; // 指定SPP的UUID
sdp_record_t *record = sdp_record_alloc();
sdp_uuid128_create(&record->root_uuid, &spp_uuid);
...
```
2. 接下来,需要为这个SDP记录添加SPP相关的属性:
```c
sdp_list_t *spp_profile = sdp_list_append(NULL, &spp_uuid);
sdp_list_t *rfcomm_list = sdp_list_append(NULL, &sdp_data_rfcomm);
sdp_data_t *channel = sdp_data_alloc(SDP_UINT8, &spp_channel);
sdp_list_t *proto_list = sdp_list_append(NULL, rfcomm_list);
sdp_list_append(proto_list, channel);
sdp_list_t *access_proto_list = sdp_list_append(NULL, &sdp_data_uuid16);
sdp_list_append(access_proto_list, &sdp_data_l2cap);
sdp_list_append(access_proto_list, proto_list);
sdp_list_t *profile_list = sdp_list_append(NULL, access_proto_list);
sdp_set_profile_desc(profile_list, "Serial Port");
sdp_set_service_classes(profile_list, &sdp_data_uuid_serial_port);
sdp_set_info_attr(record, "SPP", "Bluetooth Serial Port", NULL);
sdp_set_access_protos(record, access_proto_list);
sdp_set_profile_descs(record, profile_list);
```
其中,spp_channel表示SPP服务监听的RFCOMM通道号。
3. 最后,需要将SDP记录注册到Bluez的SDP服务中:
```c
sdp_session_t *session = ...; // 获取SDP会话句柄
sdp_record_register(session, record, 0);
```
这样,SPP服务就被注册到了SDP服务中,可以被其他设备发现和连接。如果要监听指定的UUID,需要在RFCOMM通道上启动监听器,并指定对应的UUID:
```c
int sock = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
struct sockaddr_rc addr = { 0 };
addr.rc_family = AF_BLUETOOTH;
addr.rc_bdaddr = ...; // 本地蓝牙地址
addr.rc_channel = spp_channel;
bind(sock, (struct sockaddr *)&addr, sizeof(addr));
listen(sock, 1);
sdp_uuid2strn(&spp_uuid, uuid_str, sizeof(uuid_str));
printf("Waiting for connection on channel %d with UUID %s\n", spp_channel, uuid_str);
```
这样,就可以监听指定UUID的SPP服务了。
bluez中注册一个UUID
要在bluez中注册一个UUID,可以使用以下步骤:
1. 首先,需要创建一个包含UUID定义的XML文件。例如,创建一个名为`myuuids.xml`的文件,并将以下内容添加到该文件中:
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE node PUBLIC "-//BlueZ//DTD D-Bus ObjectManager 1.0//EN"
"http://git.kernel.org/cgit/bluetooth/bluez.git/plain/doc/dbus-objects-spec.txt">
<node>
<interface name="org.bluez.GattService1">
<method name="GetPrimary">
<arg type="b" name="primary" direction="out"/>
</method>
<method name="GetCharacteristics">
<arg type="a{oa{sv}}" name="characteristics" direction="out"/>
</method>
<property name="UUID" type="s" access="read"/>
<property name="Primary" type="b" access="read"/>
<property name="Includes" type="as" access="read"/>
</interface>
<interface name="org.bluez.GattCharacteristic1">
<method name="ReadValue">
<arg type="a{sv}" name="options" direction="in" />
<arg type="ay" name="value" direction="out" />
</method>
<method name="WriteValue">
<arg type="ay" name="value" direction="in" />
<arg type="a{sv}" name="options" direction="in" />
</method>
<method name="Acquire">
<arg type="b" name="success" direction="out"/>
</method>
<method name="Release"/>
<signal name="ValueChanged">
<arg type="ay" name="value"/>
</signal>
<property name="UUID" type="s" access="read"/>
<property name="Service" type="o" access="read"/>
<property name="Value" type="ay" access="readwrite"/>
<property name="Notifying" type="b" access="readwrite"/>
<property name="Flags" type="as" access="read"/>
</interface>
<interface name="org.freedesktop.DBus.Properties">
<method name="Get">
<arg type="s" name="interface_name" direction="in"/>
<arg type="s" name="property_name" direction="in"/>
<arg type="v" name="value" direction="out"/>
</method>
<method name="Set">
<arg type="s" name="interface_name" direction="in"/>
<arg type="s" name="property_name" direction="in"/>
<arg type="v" name="value" direction="in"/>
</method>
<method name="GetAll">
<arg type="s" name="interface_name" direction="in"/>
<arg type="a{sv}" name="properties" direction="out"/>
</method>
<signal name="PropertiesChanged">
<arg type="s" name="interface_name"/>
<arg type="a{sv}" name="changed_properties"/>
<arg type="as" name="invalidated_properties"/>
</signal>
</interface>
</node>
```
2. 然后,使用以下命令将该文件注册到bluez中:
```
sudo gatttool -i hci0 -s /org/bluez/hci0 -a <handle> --char-write-req --value <uuid_xml>
```
其中,`<handle>`是该服务的句柄值(可以使用`hcitool leinfo <device>`命令查找),`<uuid_xml>`是上面创建的XML文件的内容,需要将其转换为16进制格式并添加到命令中。
例如,如果你的服务句柄值为0x000c,可以使用以下命令注册UUID:
```
sudo gatttool -i hci0 -s /org/bluez/hci0 -a 0x000c --char-write-req --value 75 69 64 3d 22 6d 79 75 75 69 64 22 20 70 72 69 6d 61 72 79 3d 22 74 72 75 65 22
```
请注意,为了执行此命令,你需要具有管理员权限。
阅读全文