物联网AI MicroPython学习之语法 bluetooth蓝牙
学物联网,来万物简单IoT物联网!!
bluetooth 介绍
该模块为板上的蓝牙控制器提供了相关接口。目前支持低功耗蓝牙 (BLE)的Central(中央), Peripheral(外设), Broadcaster(广播者), 和Observer (观察者)角色,以及 GATT 的服务器(Server)和客户端(Client)。
- 注意事项: 当前该模块只支持低功耗蓝牙(BLE),经典蓝牙部分暂时不支持。
接口说明
BLE - 创建BLE对象
bluetooth.BLE
类功能: 该类为低功耗蓝牙(BLE),是bluetooth模块中主要的类。
- 函数功能: 创建BLE对象。
- 函数原型:ble = bluetooth.BLE()
- 参数说明: 无
- 返回值: BLE对象成功,返回单例的BLE对象;BLE对象创建失败,返回None
- 示例代码:
import bluetooth
ble = bluetooth.BLE()
active - 启动/关闭BLE
- 函数功能: 启动或关闭BLE,并返回当前状态。
- 注意事项: 在使用此类上的任何其他方法之前,必须打开BLE。
- 函数原型:BLE.active(status)
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
status | 布尔型 | 是 | True:打开BLE False: 关闭BLE |
- 返回值: 无
- 示例:
import bluetooth
ble = bluetooth.BLE()
ble.active(True)
config - 获取或配置BLE相关参数
-
函数功能: 获取或设置 BLE 接口的配置值。要获得一个值,参数名称应为一个字符串,并且一次只查询一个参数。要设置值,请使用关键字语法,并且一次可以设置一个或多个参数。
-
注意事项: 需确保BLE打开。如果不使用此函数配置将使用空值或默认值。
-
函数原型:BLE.config(‘param’ ) BLE.config(*, param=value, …)
-
参数说明: 当前支持的值是:
‘mac’:当前使用的地址,取决于当前的地址模式。这将返回一个元组。(addr_type, addr)
‘addr_mode’: 设置地址模式。值可以是:
0x00 - PUBLIC - 使用控制器的公共地址。 0x01 - RANDOM - 使用生成的静态地址。 0x02 - RPA - 使用可解析的私有地址。 0x03 - NRPA - 使用不可解析的私有地址。 默认情况下使用 PUBLIC 地址,否则将使用 RANDOM 地址。
‘gap_name’: 获取/设置服务0x1800使用的GAP设备名称,特征0x2a00。这可以随时设置并多次更改。
‘rxbuf’:获取/设置用于存储传入事件的内部缓冲区的大小(以字节为单位)。该缓冲区对整个 BLE 驱动程序是全局的。此项配置值改大可以更好地处理突发传入数据(例如扫描结果)和接收更大特征值的能力。
‘mtu’:获取/设置将在 ATT MTU 交换期间使用的 MTU。生成的 MTU 将是该 MTU 和远程设备的 MTU 中的最小值。ATT MTU 交换不会自动发生(除非远程设备通过gattc_exchange_mtu启动它)。
‘bond’:设置配对时是否启用绑定。启用后,配对请求将设置“绑定”标志,并且密钥将由两个设备存储。
‘mitm’: 设置配对是否需要 MITM 保护。
‘io’:设置此设备的 I/O 功能。
可用选项有:
_IO_CAPABILITY_DISPLAY_ONLY = const(0) _IO_CAPABILITY_DISPLAY_YESNO = const(1) _IO_CAPABILITY_KEYBOARD_ONLY = const(2) _IO_CAPABILITY_NO_INPUT_OUTPUT = const(3) _IO_CAPABILITY_KEYBOARD_DISPLAY = const(4)
‘le_secure’:设置是否需要“LE Secure”配对。默认为 false(即允许“传统配对”)。 -
返回值: 无
-
示例:
import bluetooth
ble = bluetooth.BLE()
ble.active(True)
ble.config(rxbuf=1024)
irq - 事件处理
- 函数功能: 注册一个BLE协议栈的事件回调。回调函数带两个参数: event - 事件码 和 data - 事件值的元组类型。
- 注意事项: 在元组中的addr, adv_data,char_data,notify_data,和uuid 是只读的,指向bluetooth的内部ringbuffer,并且仅在IRQ处理函数的调用期间有效。如果程序需要保存这些值,以在 IRQ 处理程序返回后访问(例如,通过将其保存在类实例或全局变量中),那么它需要通过使用bytes() 或bluetooth.UUID()等方式获取数据的副本,像这样:
connected_addr = bytes(addr) # equivalently: adv_data, char_data, or notify_data matched_uuid = bluetooth.UUID(uuid)
例如,扫描结果的 IRQ 处理程序可能会检查adv_data 以决定它是否是正确的设备,然后才复制地址数据以在程序的其他地方使用。并且需要从 IRQ 处理程序中打印数据 print(bytes(addr))。
- 函数原型:BLE.irq(handler)
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
handler | 函数型 | 是 | 函数带两个输入参数event和data |
- 返回值: 无
- 示例:
def bt_irq(event, data): if event == _IRQ_CENTRAL_CONNECT: # A central has connected to this peripheral. conn_handle, addr_type, addr = data elif event == _IRQ_CENTRAL_DISCONNECT: # A central has disconnected from this peripheral. conn_handle, addr_type, addr = data elif event == _IRQ_SCAN_RESULT: # A single scan result. addr_type, addr, adv_type, rssi, adv_data = data elif event == _IRQ_SCAN_DONE: # Scan duration finished or manually stopped. pass elif event == _IRQ_PERIPHERAL_CONNECT: # A successful gap_connect(). conn_handle, addr_type, addr = data elif event == _IRQ_PERIPHERAL_DISCONNECT: # Connected peripheral has disconnected. conn_handle, addr_type, addr = data
BLE.irq(bt_irq)
事件代码是:
from micropython import const
_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_GATTS_WRITE = const(3)
_IRQ_GATTS_READ_REQUEST = const(4)
_IRQ_SCAN_RESULT = const(5)
_IRQ_SCAN_DONE = const(6)
_IRQ_PERIPHERAL_CONNECT = const(7)
_IRQ_PERIPHERAL_DISCONNECT = const(8)
_IRQ_GATTC_SERVICE_RESULT = const(9)
_IRQ_GATTC_SERVICE_DONE = const(10)
_IRQ_GATTC_CHARACTERISTIC_RESULT = const(11)
_IRQ_GATTC_CHARACTERISTIC_DONE = const(12)
_IRQ_GATTC_DESCRIPTOR_RESULT = const(13)
_IRQ_GATTC_DESCRIPTOR_DONE = const(14)
_IRQ_GATTC_READ_RESULT = const(15)
_IRQ_GATTC_READ_DONE = const(16)
_IRQ_GATTC_WRITE_DONE = const(17)
_IRQ_GATTC_NOTIFY = const(18)
_IRQ_GATTC_INDICATE = const(19)
_IRQ_GATTS_INDICATE_DONE = const(20)
_IRQ_MTU_EXCHANGED = const(21)
_IRQ_L2CAP_ACCEPT = const(22)
_IRQ_L2CAP_CONNECT = const(23)
_IRQ_L2CAP_DISCONNECT = const(24)
_IRQ_L2CAP_RECV = const(25)
_IRQ_L2CAP_SEND_READY = const(26)
_IRQ_CONNECTION_UPDATE = const(27)
_IRQ_ENCRYPTION_UPDATE = const(28)
_IRQ_GET_SECRET = const(29)
_IRQ_SET_SECRET = const(30)
gap_advertise - 开启或关闭BLE广播
- 函数功能: 设置一个特定的广播间隔(单位是微秒)开启BLE广播,此间隔最低为625us。 关闭BLE广播时,将广播间隔参数(interval_us)设为None。
- 注意事项: 广播者角色时使用
- 函数原型:*BLE.gap_advertise(interval_us, adv_data=None, , resp_data=None, connectable=True)
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
interval_us | 整型 | 是 | 广播间隔,为None时关闭广播 |
adv_data | string | 否 | adv_data可指向实现缓冲协议的任何类型(例如bytes,bytearray,str),为None时则使用上一次调用时候的值 |
resp_data | string | 否 | resp_data可指向实现缓冲协议的任何类型(例如bytes,bytearray,str),为None时则使用上一次调用时候的值 |
connectable | 布尔型 | 否 | 表示是否可连接 |
- 返回值: 无
- 示例:
import bluetooth
ble = bluetooth.BLE()
ble.active(True)
# payload 需要具体定义
ble.gap_advertise(500000, adv_data=payload)
gap_scan - BLE扫描
- 函数功能: 以一个特定的间隔(interval_us)和 窗口(window_us)执行BLE扫描操作; 扫描器将每interval_us微秒运行window_us 微秒,总共持续duration_ms毫秒。默认间隔和窗口分别为 1.28 秒和 11.25 毫秒(后台扫描)
- 注意事项: 对于每个扫描结果,将触发_IRQ_SCAN_RESULT事件,并带有事件数据(addr_type, addr, adv_type, rssi, adv_data)。 当扫描停止时(由于持续时间完成或明确停止),将触发_IRQ_SCAN_DONE事件。 观察者角色时使用。
addr_type 值表示公共或随机地址:
0x00 - 公共 0x01 - RANDOM(静态、RPA 或 NRPA,类型在地址本身中编码)
adv_type 值对应于蓝牙规范:
0x00 - ADV_IND - 可连接和可扫描的无向广告 0x01 - ADV_DIRECT_IND - 可连接的定向广告 0x02 - ADV_SCAN_IND - 可扫描的无向广告 0x03 - ADV_NONCONN_IND - 不可连接的无向广告 0x04 - SCAN_RSP - 扫描响应
- 函数原型:BLE.gap_scan( duration_ms , interval_us=1280000 , window_us=11250 , active=False )
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
duration_ms | 整型 | 是 | 扫描持续时间,单位为毫秒,当设为0时,无限期扫描;当设为None时停止扫描 |
interval_us | 整型 | 否 | 扫描间隔时间,单位为微秒 |
window_us | 整型 | 否 | 扫描窗口时间,单位为微秒 |
active | 布尔型 | 否 | 设为True时,表示要在结果中接受扫描响应(scan_rsp),默认为False |
- 返回值: 无
- 示例:
import bluetooth
ble = bluetooth.BLE()
ble.active(True)ble.gap_scan(2000, 30000, 20000)
gap_connect - 连接BLE外围设备
- 函数功能: 连接BLE外围设备
- 注意事项: 中央设备(Central)以观察者角色通过gap_scan方法获得外围设备信息,或者已知外围设备地址, 之后可通过设备信息触发BLE连接请求。 成功后,将触发_IRQ_PERIPHERAL_CONNECT事件,该事件data中带有连接句柄。
- 函数原型:BLE.gap_connect( addr_type , addr , scan_duration_ms=2000 , min_conn_interval_us=None , max_conn_interval_us=None )
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
addr_type | 枚举型 | 是 | 0x00 - 公共地址;0x01 - 随机地址 |
addr | string | 是 | 要连接的设备地址 |
scan_duration_ms | 整型 | 否 | 设备将等待最多scan_duration_ms以从设备接收广播负载 |
min_conn_interval_us | 整型 | 否 | 连接间隔的最小值,单位为微秒 |
max_conn_interval_us | 整型 | 否 | 连接间隔的最大值,单位为微秒 |
- 返回值: 无
- 示例:
import bluetooth
ble = bluetooth.BLE()
ble.active(True)
# addr = xx:xx:xx:xx:xx:xx
ble.connect(0x00, addr)
gap_disconnect - 断开BLE外围设备
-
函数功能:
断开指定连接句柄的BLE连接。可以是从中央设备发起,也可是由外围设备发起。 -
注意事项:
成功后,将触发_IRQ_PERIPHERAL_DISCONNECT 或者 _IRQ_CENTRAL_DISCONNECT事件 -
函数原型:
BLE.gap_disconnect(conn_handle)
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
conn_handle | 整型 | 是 | 连接句柄 |
-
返回值:
False: 该连接句柄未连接;
True: 表示调用成功; -
示例:
import bluetooth
ble = bluetooth.BLE()
...
ble.gap_disconnect(handle)
gatts_register_services - 注册GATT服务
一个 GATT 服务器有一组注册服务。每个服务可能包含一个或多个特性,每个特性都有一个值。特征还可以包含描述符,描述符本身也具有值。 这些值存储在本地,并由服务注册期间生成的“值句柄”访问。它们也可以从远程客户端设备读取或写入。此外,服务器可以通过连接句柄主动向连接的客户端“通知”特征。 在大多数情况下,外围设备充当GATT 服务器。
- 函数功能: 使用指定的服务配置服务器
- 注意事项: 在注册服务之前必须停BLE广播。每个服务都是一个两个元素的元组,其中一个是UUID, 另一个是特征值的列表。 每个特征值都是一个两个或三个元素的元组,包含一个UUID, 一个标示值,另一个可选的描述符列表; 每个描述符都一个两个元素的元组,包含一个UUID, 一个标示值。 这些标示值是由下面定义的标示按位或的组合,他们设置了特征或者描述符的行为及安全和隐私要求。
from micropython import const
_FLAG_BROADCAST = const(0x0001)
_FLAG_READ = const(0x0002)
_FLAG_WRITE_NO_RESPONSE = const(0x0004)
_FLAG_WRITE = const(0x0008)
_FLAG_NOTIFY = const(0x0010)
_FLAG_INDICATE = const(0x0020)
_FLAG_AUTHENTICATED_SIGNED_WRITE = const(0x0040)_FLAG_AUX_WRITE = const(0x0100)
_FLAG_READ_ENCRYPTED = const(0x0200)
_FLAG_READ_AUTHENTICATED = const(0x0400)
_FLAG_READ_AUTHORIZED = const(0x0800)
_FLAG_WRITE_ENCRYPTED = const(0x1000)
_FLAG_WRITE_AUTHENTICATED = const(0x2000)
_FLAG_WRITE_AUTHORIZED = const(0x4000)
- 函数原型:BLE.gatts_register_services( services_definition )
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
services_definition | 列表 | 是 | 服务列表 |
- 返回值: 一个元组列表, 每个元组代表一个服务,元组中的每个元素对应一个值句柄,特征和描述符句柄按照定义的顺序平展为同一个元组。 以下示例注册了两个服务(HR 和 UART),这三个值句柄(hr, tx, rx)可用于gatts_read, gatts_write, gatts_notify和gatts_indicate。
- 示例:
HR_UUID = bluetooth.UUID(0x180D)
HR_CHAR = (bluetooth.UUID(0x2A37), bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY,)
HR_SERVICE = (HR_UUID, (HR_CHAR,),)
UART_UUID = bluetooth.UUID('6E400001-B5A3-F393-E0A9-E50E24DCCA9E')
UART_TX = (bluetooth.UUID('6E400003-B5A3-F393-E0A9-E50E24DCCA9E'), bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY,)
UART_RX = (bluetooth.UUID('6E400002-B5A3-F393-E0A9-E50E24DCCA9E'), bluetooth.FLAG_WRITE,)
UART_SERVICE = (UART_UUID, (UART_TX, UART_RX,),)
SERVICES = (HR_SERVICE, UART_SERVICE,)
( (hr,), (tx, rx,), ) = bt.gatts_register_services(SERVICES)
gatts_read - 读取本地值
- 函数功能: 读取本地GATT服务中的特征值
- 注意事项: 这个值可能是通过本地gatts_write写入的,也可能是通过远程客户端写入的。
- 函数原型:BLE.gatts_read(value_handle)
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
value_handle | 整型 | 是 | 值句柄 |
- 返回值: 无
- 示例: 无
gatts_write - 写入本地值
- 函数功能: 写入本地GATT服务中的特征值
- 注意事项: 写入后,客户端可以读取该值。
- 函数原型:BLE.gatts_write( value_handle , data , send_update=False )
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
value_handle | 整型 | 是 | 值句柄 |
data | string | 是 | 写入数据 |
send_update | 布尔型 | 否 | 为True时,任何订阅此值的此客户端都将收到该特征值写入的通知 |
- 返回值: 无
- 示例: 无
gatts_notify - 发送通知请求
- 函数功能: 向连接的客户端发送通知请求
- 注意事项: 无论客户端是否订阅了此特征值,都会发送通知。
- 函数原型:BLE.gatts_notify( conn_handle , value_handle , data=None )
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
conn_handle | 整型 | 是 | 连接句柄 |
value_handle | 整型 | 是 | 值句柄 |
data | string | 否 | 如果data不为None,则将该值发送给客户端,本地值不会被修改。如果data为None,则将发送当前本地值给客户端 |
- 返回值: 无
- 示例: 无
gatts_indicate - 发送指示请求
- 函数功能: 向连接的客户端发送指示请求
- 注意事项: 无论客户端是否订阅了此特征值,都会发送通知。 在确认(或失败,如超时)时,将触发_IRQ_GATTS_INDICATE_DONE 事件
- 函数原型:BLE.gatts_indicate( conn_handle , value_handle )
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
conn_handle | 整型 | 是 | 连接句柄 |
value_handle | 整型 | 是 | 值句柄 |
- 返回值: 无
- 示例: 无
gatts_set_buffer - 设置缓冲区
- 函数功能: 设置值的内部缓冲区大小(与Byte为单位),默认值是20.
- 注意事项: 无
- 函数原型:BLE.gatts_set_buffer ( value_handle , len , append = False)
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
value_handle | 整型 | 是 | 值句柄 |
len | 整型 | 是 | 缓冲区大小 |
append | 布尔值 | 否 | 为True时,将使所有远程写入追加到当前值,而不是覆盖当前值,执行gatts_read读取值后该值清零 |
- 返回值: 无
- 示例: 无
gattc_discover_services - 查询服务
GATT 客户端(Client)可发现和读取/写入远程GATT服务上的特征。 一般情况下,Central 角色充当GATT 客户端。
- 函数功能: 查询已连接GATT服务器的服务
- 注意事项: 每发现一个服务,都将触发 _IRQ_GATTC_SERVICE_RESULT 事件,服务操作完毕后,将触发_IRQ_GATTC_SERVICE_DONE 事件。
- 函数原型:BLE.gattc_discover_services( conn_handle , uuid=None )
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
conn_handle | 整型 | 是 | 连接句柄 |
uuid | string | 否 | 指定服务的uuid, 当uuid不为None时,仅查询该服务 |
- 返回值: 无
- 示例: 无
gattc_discover_characteristics - 查询特征
- 函数功能: 查询连接的服务器以获取指定范围内的特征
- 注意事项: 每发现一个特征,都将触发 _IRQ_GATTC_CHARACTERISTIC_RESULT 事件,发现特征操作完毕后,将触发 _IRQ_GATTC_CHARACTERISTIC_DONE 事件。
- 函数原型:BLE.gattc_discover_characteristics( conn_handle , start_handle , end_handle , uuid=None )
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
conn_handle | 整型 | 是 | 连接句柄 |
start_handle | 整型 | 是 | 起始的特征句柄 |
end_handle | 整型 | 是 | 结束的特征句柄 |
uuid | string | 否 | 指定特征的uuid, 当uuid不为None时,仅查询该特征 |
- 返回值: 无
- 示例: 无
gattc_discover_descriptors - 查询描述符
- 函数功能: 向连接的服务器查询指定范围内的描述符
- 注意事项: 每发现一个描述符,都将触发 _IRQ_GATTC_DESCRIPTOR_RESULT 事件,发现描述符操作结束后,将触发 _IRQ_GATTC_DESCRIPTOR_DONE 事件。
- 函数原型:BLE.gattc_discover_descriptors( conn_handle , start_handle , end_handle )
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
conn_handle | 整型 | 是 | 连接句柄 |
start_handle | 整型 | 是 | 起始的特征句柄 |
end_handle | 整型 | 是 | 结束的特征句柄 |
- 返回值: 无
- 示例: 无
gattc_read - GATT远程读操作
- 函数功能: 向连接的服务器发出远程读取
- 注意事项: 当值可用时,将触发 _IRQ_GATTC_READ_RESULT 事件,里面带有读取的结果。此外,读取完毕将触发_IRQ_GATTC_READ_DONE 事件。
- 函数原型:BLE.gattc_read( conn_handle , value_handle )
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
conn_handle | 整型 | 是 | 连接句柄 |
value_handle | 整型 | 是 | 要读取的特征的句柄 |
- 返回值: 无
- 示例: 无
gattc_write - GATT远程写操作
- 函数功能: 向连接的服务器发出远程写
- 注意事项: 如果收到来自远程服务器的响应,将触发 _IRQ_GATTC_WRITE_DONE 事件。
- 函数原型:BLE.gattc_write( conn_handle , value_handle , data , mode=0 )
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
conn_handle | 整型 | 是 | 连接句柄 |
value_handle | 整型 | 是 | 要写的特征的句柄 |
mode | 整型 | 是 | mode=0(默认值),是无响应写入,对方不返回确认,也不会触发任何事件; mode=1是 write-with-response,远程服务器发送它收到数据的响应/确认 |
- 返回值: 无
- 示例: 无
gattc_exchange_mtu - 交换MTU
- 函数功能: 触发MTU交换流程,使用之前config的MTU值。
- 注意事项: 当MTU交换完成后,将触发 _IRQ_MTU_EXCHANGED 事件。 MTU交换通常由Central 角色设备发起。有些底层协议栈不支持MTU交换功能。
- 函数原型:BLE.gattc_exchange_mtu( conn_handle )
- 参数说明:
参数 | 类型 | 必选参数? | 说明 |
---|---|---|---|
conn_handle | 整型 | 是 | 连接句柄 |
- 返回值: 无
- 示例: 无
bluetooth.UUID
- 类功能: 创建具有指定值的UUID实例。
- 注意事项: UUID可以是一个16位整数,例如 0x2908; 也可以是128位的UUID字符,例如’6E400001-B5A3-F393-E0A9-E50E24DCCA9E‘
- 示例:
HR_UUID = bluetooth.UUID(0x180D)
HR_CHAR = (bluetooth.UUID(0x2A37), bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY,)
HR_SERVICE = (HR_UUID, (HR_CHAR,),)
UART_UUID = bluetooth.UUID('6E400001-B5A3-F393-E0A9-E50E24DCCA9E')
UART_TX = (bluetooth.UUID('6E400003-B5A3-F393-E0A9-E50E24DCCA9E'), bluetooth.FLAG_READ | bluetooth.FLAG_NOTIFY,)
UART_RX = (bluetooth.UUID('6E400002-B5A3-F393-E0A9-E50E24DCCA9E'), bluetooth.FLAG_WRITE,)
UART_SERVICE = (UART_UUID, (UART_TX, UART_RX,),)
SERVICES = (HR_SERVICE, UART_SERVICE,)
( (hr,), (tx, rx,), ) = bt.gatts_register_services(SERVICES)
相关文章:

物联网AI MicroPython学习之语法 bluetooth蓝牙
学物联网,来万物简单IoT物联网!! bluetooth 介绍 该模块为板上的蓝牙控制器提供了相关接口。目前支持低功耗蓝牙 (BLE)的Central(中央), Peripheral(外设), Broadcaster(广播者&…...

React中的key有什么作用?
一、是什么 首先,先给出react组件中进行列表渲染的一个示例: const data = [ { id: 0, name: abc }, { id: 1, name: def }, { id: 2, name: ghi }, { id: 3, name: jkl } ]; const ListItem = (props) => { return <li>{props.name}</li>; }; con…...

初认识vue,v-for,v-if,v-bind,v-model,v-html等指令
vue 一.vue3介绍 1.为什么data是函数而不是对象? 因为vue是组件开发,组件会多次复用,data如果是对象,多次复用是共享,必须函数返回一个新的对象 1. 官网初识 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS …...

Java 算法篇-深入了解单链表的反转(实现:用 5 种方式来具体实现)
🔥博客主页: 小扳_-CSDN博客 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 单链表的反转说明 2.0 单链表的创建 3.0 实现单链表反转的五种方法 3.1 实现单链表反转 - 循环复制(迭代法) 3.2 实现单链表反转 - 头插法 3…...
Android 10.0 系统内存优化之修改dalvik虚拟机的内存参数
1.前言 在10.0的系统开发定制中,app应用也是运行在dalvik虚拟机上的,所以对于一些内存低的系统中,在某些大应用会出现耗内存 卡顿情况,这是系统分配的内存不够大,在进行耗内存的操作,就会出现频繁gc等等原因造成不流畅的现象,接下来就分析下 虚拟机分配内存的相关原理 …...

Docker+K8s基础(重要知识点总结)
目录 一、Docker的核心1,Docker引擎2,Docker基础命令3,单个容器运行多个服务进程4,多个容器运行多个服务进程5,备份在容器中运行的数据库6,在宿主机和容器之间共享数据7,在容器之间共享数据8&am…...

IDEA 关闭SpringBoot启动Logo/图标
一、环境 1、SpringBoot 2.6.4 Maven POM格式 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version><relativePath/></parent> 2、IDE…...
提供话费充值接口 话费快充慢充/API独立接口,商城/小程序/公众号合作
话费充值接口文档 接口版本:1.0 ―、引言 文档概述 本文档提供话费充值接口规范说明,提供一整套的完整的接入示例(http 接口)供商户参 考,可以帮助商户开发人员快速完成接口开发与联调,实现与话费充值系统的交易互联。 公司官网…...

[N-133]基于springboot,vue小说网站
开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 系统分前后台,项目采用前后端分离 前端技术:vueelementUI 服务端技术:springbootmybatis-plus 本项…...

计算机网络:概述
0 学时安排及讨论题目 0.1讨论题目: CSMA/CD协议交换机基本原理ARP协议及其安全子网划分IP分片路由选择算法网络地址转换NATTCP连接建立和释放再论网络体系结构 0.2 本节主要内容 计算机网络在信息时代中的作用 互联网概述 互联网的组成 计算机网络在我国的发展 …...

服务号怎么升级订阅号
服务号和订阅号有什么区别?服务号转为订阅号有哪些作用?首先我们要看一下服务号和订阅号的主要区别。1、服务号推送的消息没有折叠,消息出现在聊天列表中,会像收到消息一样有提醒。而订阅号推送的消息是折叠的,“订阅号…...

11.读取文件长度-fseek和ftell函数的使用
文章目录 简介1. 写入测试文件2. 读取文件长度 简介 主要讲使用fopen读取文件,配合使用fseek和ftell来读取文件长度。1. 写入测试文件 执行下方程序,使用fwrite函数写入40字节的数据,使其形成文件存入本地目录。#define _CRT_SECURE_NO_WARNI…...

视觉大模型DINOv2:自我监督学习的新领域
1 DINOv2 1.1 DINOv2特点 前段时间,Meta AI 高调发布了 Segment Anything(SAM),SAM 以交互式方式快速生成 Mask,并可以对从未训练过的图片进行精准分割,可以根据文字提示或使用者点击进而圈出图像中的特定…...

Java事务详解
一、事务的理解: 1、事务的特性: 1) 原子性(atomicity):事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行。 2) 一致性…...

el-table实现展开当前行时收起上一行的功能
<el-tableref"tableRef":data"tableData":expand-row-keys"expandRowKeys":row-key"handleRowKey" // 必须指定 row-keyexpand-change"handleExpandChange" // 当用户对某一行展开或者关闭的时候会触发该事件> <…...

Go的优雅退出
Go优雅退出/停机以前主要通过signal来实现,当然现在也是通过signal来实现,只是从go 1.16开始,新增了更加友好的API: func NotifyContext(parent context.Context, signals ...os.Signal) (ctx context.Context, stop context.CancelFunc) 该…...
【KVM-6】KVM/QEMU软件栈
前言 大家好,我是秋意零。 👿 简介 🏠 个人主页: 秋意零🔥 账号:全平台同名, 秋意零 账号创作者、 云社区 创建者🧑 个人介绍:在校期间参与众多云计算相关比赛&#x…...
硬件知识2
原理图的检查: 网络悬浮 单端网络 电源悬浮(电源和地) 重复的位号 网络短路(电源和地) AD里面双击messages里面的错误项会直接进入到原理图和PCB…...

【Java 进阶篇】JQuery DOM操作:通用属性操作的绝妙魔法
在前端的舞台上,JQuery犹如一位魔法师,为我们展现了操纵HTML元素的奇妙技巧。而在这个技巧的精妙组成中,通用属性操作是一门绝妙的魔法。在本篇博客中,我们将深入研究JQuery DOM操作中的通用属性操作,揭示这段魔法的神…...

在任何机器人上实施 ROS 导航堆栈的指南
文章目录 路径规划参考 路径规划 路径规划是导航的最终目标。这允许用户向机器人给出目标姿势,并让它在给定的环境中自主地从当前位置导航到目标位置。这是我们迄今为止所做的一切(地图绘制和本地化)的汇集点。ROS 导航堆栈已经为我们完成了…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...