物联网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 导航堆栈已经为我们完成了…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
算法刷题-回溯
今天给大家分享的还是一道关于dfs回溯的问题,对于这类问题大家还是要多刷和总结,总体难度还是偏大。 对于回溯问题有几个关键点: 1.首先对于这类回溯可以节点可以随机选择的问题,要做mian函数中循环调用dfs(i&#x…...

使用VMware克隆功能快速搭建集群
自己搭建的虚拟机,后续不管是学习java还是大数据,都需要集群,java需要分布式的微服务,大数据Hadoop的计算集群,如果从头开始搭建虚拟机会比较费时费力,这里分享一下如何使用克隆功能快速搭建一个集群 先把…...

篇章一 论坛系统——前置知识
目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...