终端基础类的属性和方法¶
DGLabClient 是终端基类,包含
本地终端 DGLabLocalClient
和 WebSocket 终端 DGLabWSClient
共有的一些属性和方法
获取自身的各项信息¶
可获取终端自身的 ID、绑定的 App 的 ID、是否已从 WebSocket 服务端注册,即获取 ID(clientId)以及是否已和 DG-Lab App 绑定。
可用属性¶
示例¶
from pydglab_ws import DGLabWSConnect
async def main():
async with DGLabWSConnect("ws://192.168.1.161:5678") as client:
await client.bind()
print(f"终端 {client.client_id} 已与 App {client.target_id} 成功绑定")
...
注册(获取终端 ID)¶
终端连接至 WebSocket 服务端后,需要先从服务端获取终端 ID(clientId),此处称为注册,
不过一般情况下 PyDGLab-WS 会在异步上下文管理中完成该步骤,即以下用法:
- 使用连接器
DGLabWSConnect创建 WebSocket 终端DGLabWSClient - 手动创建 WebSocket 终端
DGLabWSClient对象, 并在异步上下文管理(即async with中使用) - 从 WebSocket 服务端
DGLabWSServer创建本地终端DGLabLocalClient
可用方法¶
获取二维码,绑定 DG-Lab App¶
从 WebSocket 服务端获取终端 ID(clientId)后,即可生成终端二维码,
DG-Lab App 进入 Socket 被控界面后,扫码二维码即可绑定
Info
注意此处生成的二维码 仅仅是二维码内容/数据,二维码图像需要自行从返回的数据生成
Info
App 断开连接后,重新连接至服务端时 targetId 可能发生变化,因此最好是再调用一次
rebind 方法,重新等待绑定并更新 targetId
Warning
生成二维码后,需要调用绑定方法来等待 App 绑定,此时该异步事件会阻塞直到绑定完成
可用方法¶
get_qrcode ¶
示例¶
from pydglab_ws import DGLabWSConnect
def print_qrcode(_: str):
"""输出二维码到终端界面"""
...
async def main():
async with DGLabWSConnect("ws://192.168.1.161:5678") as client:
# 获取二维码
url = client.get_qrcode()
print("请用 DG-Lab App 扫描二维码以连接")
print_qrcode(url)
# 等待绑定
await client.bind()
print(f"已与 App {client.target_id} 成功绑定")
...
获取 App 数据更新和服务端通知¶
可获取如下数据:
- 通道强度数据
- App 触发的反馈按钮
- App 返回的错误码
- 服务端发送的心跳
- 服务端发送的 App 断开连接通知
Info
data_generator
会不断从队列中读取消息并解析,队列为空时则会阻塞该异步事件,
如果需要退出,可使用 break
Info
App 断开连接后,重新连接至服务端时 targetId 可能发生变化,因此最好是再调用一次
rebind 方法,重新等待绑定并更新 targetId
Danger
不能并发地读取 数据更新,因为消息一旦被读出,就会从队列中移除。
另外 data_generator
在解析消息时,如果读出的消息不符合筛选条件,将会被丢弃,直到读到符合条件的消息
可用方法¶
recv_data
async
¶
recv_data() -> Union[StrengthData, FeedbackButton, RetCode]
获取 WebSocket 服务端的数据
注意,获取到的是队列中最早的数据,可能不是最新的
Returns:
| Type | Description |
|---|---|
Union[StrengthData, FeedbackButton, RetCode]
|
可能为 强度数据 - |
Raises:
| Type | Description |
|---|---|
InvalidStrengthData
|
|
InvalidFeedbackData
|
data_generator
async
¶
data_generator(*targets: _DataType) -> AsyncGenerator[_DataType, Any]
强度数据异步生成器
注意,是从队列中最早的数据开始获取,可能不是最新的
示例:
async for data in client.data_generator(StrengthData, FeedbackButton):
print(f"Got data from App: {data}")
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
targets |
_DataType
|
目标类型,只有为目标类型的数据会被返回,为空即默认值时则不进行限制 |
()
|
Returns:
| Type | Description |
|---|---|
AsyncGenerator[_DataType, Any]
|
可能为 强度数据 - |
示例¶
from pydglab_ws import DGLabWSConnect, StrengthData, FeedbackButton, RetCode
async def main():
async with DGLabWSConnect("ws://192.168.1.161:5678") as client:
... # 完成了绑定
async for data in client.data_generator():
# 接收通道强度数据
if isinstance(data, StrengthData):
print(f"从 App 收到通道强度数据更新:{data}")
# 接收 App 反馈按钮
elif isinstance(data, FeedbackButton):
print(f"App 触发了反馈按钮:{data.name}")
# 接收 心跳 / App 断开通知
elif data == RetCode.CLIENT_DISCONNECTED:
print("App 已断开连接,你可以尝试重新扫码进行连接绑定")
设置通道强度¶
可设置郊狼 A 通道、B 通道 的强度,并有几个变化模式可选。
可用方法¶
set_strength
async
¶
set_strength(channel: Channel, operation_type: StrengthOperationType, value: int)
设置强度
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
channel |
Channel
|
通道选择 |
required |
operation_type |
StrengthOperationType
|
强度变化模式 |
required |
value |
int
|
强度数值,范围在 [0, 200] |
required |
示例¶
from pydglab_ws import DGLabWSConnect, Channel, StrengthOperationType
async def main():
async with DGLabWSConnect("ws://192.168.1.161:5678") as client:
... # 完成了绑定
await client.set_strength(
Channel.A,
StrengthOperationType.INCREASE,
10
) # A 通道 增加 10 强度
...
下发波形数据¶
可向 App 下发波形操作,参数中的 *pulses 是位置参数,可传入多个
PulseOperation
Question
PulseOperation
波形操作 数据是由一个波形 频率 操作数据 WaveformFrequencyOperation
和一个波形 强度 操作数据 WaveformStrengthOperation
组合成的元组。波形 频率 操作数据和波形 强度 操作数据 则都是由 4 个 int 整数组成的元组,代表了目标数值
可用方法¶
add_pulses
async
¶
add_pulses(channel: Channel, *pulses: PulseOperation)
下发波形数据
- 每条波形数据代表了 100ms 的数据,所以若每次发送的数据有 10 条,那么就是 1s 的数据。 由于网络有一定延时,若要保证波形输出的连续性,建议波形数据的发送间隔略微小于波形数据的时间长度 (< 1s)
- 数组最大长度为 100,也就是最多放置 10s 的数据,另外 App 中的波形队列最大长度为 500,即为 50s 的数据, 若后接收到的数据无法全部放入波形队列,多余的部分会丢弃。所以谨慎考虑您的数据长度和数据发送间隔
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
channel |
Channel
|
通道选择 |
required |
pulses |
PulseOperation
|
波形操作数据,最大长度为 100 |
()
|
Raises:
| Type | Description |
|---|---|
InvalidPulseOperation
|
|
PulseDataTooLong
|
波形操作数据过长,最大长度应为 |
示例¶
from pydglab_ws import DGLabWSConnect, Channel
async def main():
async with DGLabWSConnect("ws://192.168.1.161:5678") as client:
... # 完成了绑定
await client.add_pulses(
Channel.A,
((10, 10, 20, 30), (0, 5, 10, 50)), # 波形频率4条 {10,10,20,30},波形强度4条 {0,5,10,50}
((10, 10, 20, 30), (0, 5, 10, 50)), # 同上
((10, 10, 20, 30), (0, 5, 10, 50)) # 同上
) # 向 A 通道波形队列增加了持续 300 毫秒的操作
...
清空波形队列¶
App 中的波形执行是基于波形队列,遵循先进先出的原则,并且队列可以缓存 500 条波形数据 (50s 的数据)。
当波形队列中还有尚未执行完的波形数据时,第三方终端希望立刻执行新的波形数据,则需要先将对应通道的波形队列执行清空操作后,再发送波形数据, 即可实现立刻执行新的波形数据的需求。
来自DG-LAB 官方文档 解释
可用方法¶
clear_pulses
async
¶
clear_pulses(channel: Channel)
清空波形队列
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
channel |
Channel
|
通道选择 |
required |
Raises:
| Type | Description |
|---|---|
InvalidPulseOperation
|
示例¶
from pydglab_ws import DGLabWSConnect, Channel
async def main():
async with DGLabWSConnect("ws://192.168.1.161:5678") as client:
... # 完成了绑定
await client.clear_pulses(Channel.A) # 清空 A 通道波形队列
...