使用 SLE 节点实体¶
SleNode 是项目的顶层实体, 封装了物理层 (TxConfig, TX/RX Pipeline)、MAC 层 (LinkManager, QosManager, Scheduler) 和安全 (FrameCryptoContext) 的全部功能, 对外提供统一的数据收发接口。
基础操作¶
创建节点¶
from nearlink_sdr.node import NodeConfig, NodeRole, SleNode
# 使用默认配置
node = SleNode()
# 自定义配置
config = NodeConfig(
address=b"\x01\x02\x03\x04\x05\x06",
role=NodeRole.G_NODE,
frame_type=2,
mcs_index=7,
bandwidth_mhz=1,
pilot_interval=8,
enable_encryption=False,
)
node = SleNode(config=config)
建立连接¶
广播方与扫描方各创建一个节点:
from nearlink_sdr.node import NodeConfig, SleNode
# 广播方
broadcaster = SleNode(config=NodeConfig(address=b"\xAA" * 6))
broadcaster.start_advertising()
# 收到接入请求后接受连接
broadcaster.accept_connection(peer_address=b"\xBB" * 6)
# 扫描方
scanner = SleNode(config=NodeConfig(address=b"\xBB" * 6))
scanner.start_scanning()
scanner.connect(peer_address=b"\xAA" * 6)
发送与接收数据¶
from nearlink_sdr.mac.qos import Priority
from nearlink_sdr.node import SleNode
# 发送方: 提交数据到队列, 然后调用 transmit 生成 IQ 信号
node = SleNode()
node.send(b"hello world", Priority.NORMAL)
tx_result = node.transmit()
if tx_result.iq is not None:
# tx_result.iq 是 complex128 numpy 数组, 可写入 USRP 或通过信道模型传输
_iq_signal = tx_result.iq
断连与重置¶
from nearlink_sdr.node import SleNode
node = SleNode()
# 断开连接
node.disconnect()
# 重置到初始状态 (可重新建连)
node.reset()
进阶功能¶
配对与加密¶
启用加密后的数据通信:
from nearlink_sdr.node import NodeConfig, SleNode
config = NodeConfig(
address=b"\x01" * 6,
enable_encryption=True,
)
node = SleNode(config=config)
node.start_advertising()
node.accept_connection(b"\x02" * 6)
# 发起配对
outgoing_msgs = node.start_pairing(b"\x02" * 6)
# 将 outgoing_msgs 发送到对端, 对端 process_pairing_message() 处理后回复
# 完成配对后, 后续 transmit()/receive() 自动加解密
事件回调¶
from nearlink_sdr.node import NodeCallback
class MyCallback(NodeCallback):
def on_state_changed(self, old, new):
print(f"状态: {old.name} → {new.name}")
def on_connected(self, peer_address, role):
print(f"已连接 {peer_address.hex()} 角色 {role.name}")
def on_disconnected(self, reason):
print(f"断开: {reason.name}")
跳频¶
跳频通过 advance_slot 推进时隙, current_channel 获取当前信道:
from nearlink_sdr.node import NodeConfig, SleNode
config = NodeConfig(
address=b"\x01" * 6,
band="2400",
hop_param2=0xABCD,
)
node = SleNode(config=config)
node.advance_slot(1)
channel = node.current_channel
print(f"跳频信道: {channel}")
功率控制¶
from nearlink_sdr.node import NodeConfig, SleNode
config = NodeConfig(
address=b"\x01" * 6,
tx_power_dbm=0.0,
)
node = SleNode(config=config)
new_power = node.adjust_power(3.0) # 增加 3 dB
print(f"当前功率: {new_power} dBm")
接入流程¶
from nearlink_sdr.node import NodeConfig, NodeRole, SleNode
config = NodeConfig(
address=b"\xAA" * 6,
role=NodeRole.G_NODE,
)
node = SleNode(config=config)
# 启动广播
bcast = node.start_advertising()
测量信号¶
from nearlink_sdr.node import SleNode
node = SleNode()
signal = node.generate_measurement_signal(n_measur=64, security_type=1)
MCS 自适应¶
from nearlink_sdr.node import SleNode
node = SleNode()
# 查询建议 MCS
suggested = node.recommended_mcs
# 手动更新 MCS
node.update_mcs(suggested)
# 查看统计
print(node.stats)
查看节点状态¶
stats 属性返回包含所有关键指标的字典:
from nearlink_sdr.node import SleNode
node = SleNode()
s = node.stats
# s["state"] 当前状态 (IDLE / CONNECTED / ...)
# s["tx_count"] 发送计数
# s["rx_count"] 接收计数
# s["fer"] 帧错误率
# s["mcs"] 当前 MCS 索引
# s["queue_size"] 发送队列长度
# s["flow_paused"] 流控是否暂停
# s["paired"] 是否已配对
# s["encrypted"] 是否已加密
运行示例¶
make examples