用于水下调制解调器的python库
wlmodem的Python项目详细描述
用于水下调制解调器的python库
用于与水下调制解调器通信的python库。
该库公开了调制解调器的功能:设置配置、获取诊断信息、发送 接收数据包。
资源
要求
- python 2.7或python 3.6
- pyserial
- CRCMOD
支持的调制解调器
- 水连接调制解调器-M64
设置
$ python3 -m pip install --user wlmodem
or
(venv)$ python3 -m pip install wlmodem
快速启动
连接到调制解调器并配置模式和频道:
$python3>>>fromwlmodemimportWlModem>>>modem=WlModem("/dev/ttyUSB0")>>>modem.connect()True>>>modem.cmd_configure("a",4)True>>>modem.cmd_queue_packet(b"HelloSea")True
用法
WlModem
类提供了一个简单的接口,可以使用水链接调制解调器配置、发送和接收数据。
一对调制解调器必须配置在同一信道上,并具有不同的角色,以便在它们之间建立通信。
使用串行设备名称初始化WlModem
对象:
fromwlmodemimportWlModemmodem=WlModem("/dev/ttyUSB0")
调用connect()
与设备建立通信
ifnotmodem.connect():print("Failed connecting to modem")sys.exit(1)
连接后,我们在一对调制解调器上设置相同的频道和不同的角色:
# On modem 1:success=modem.cmd_configure("a",4)# On modem 2:success=modem.cmd_configure("b",4)
如果调制解调器的尖端彼此靠近(<;5cm),则调制解调器现在将连接起来。 可以在LED上或通过获取诊断数据来查看链路状态。
ifmodem.cmd_get_diagnostic().get("link_up"):print("Link is up")
一旦我们连接好,我们就可以使用cmd_queue_packet
函数来排队传输数据。
success=modem.cmd_queue_packet(b"HelloSea")
要获取一个调制解调器从另一个调制解调器接收到的数据,请使用get_data_packet
函数。
默认情况下,此函数将等待timeout
秒,直到收到数据包,然后返回。
如果timeout
为0,它将立即返回一个数据包(如果可用)或None
,如果没有收到任何数据包。
pkt=modem.get_data_packet(timeout=0)ifpkt:print("Got data:",pkt)
udp样式传输
WlUDPSocket
类是一个更高级别的抽象,它允许传输任意大小的类udp数据报。
这种传输方式适用于短消息,并且每个短消息的开销很低,为3字节
数据报(1个起始字节、1个校验和和和1个结束字节)。
数据报将被丢弃的任何调制解调器数据包损坏(同时仍要花费全部时间进行传输)。
这意味着它只适用于短数据报。
modem-m64的有效负载大小为8字节,因此,如果任何数据包丢失,并且传输的数据包数由以下公式给出,则成功的几率为:
成功率=(100-丢包率)/100^(发送的包数)*100
例如,数据包丢失的概率为5%,数据报为77字节(3个开销字节提供10个数据包):
成功率=(1.0-0.05)**10*100=59.8%
fromwlmodemimportWlModem,WlUDPSocketmodem=WlModem("/dev/ttyUSB0")modem.connect()wl_sock=WlUDPSocket(modem)wl_sock.send(b"There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss")received=wl_sock.receive()
模拟器
可以使用WlModemSimulator
类来模拟与没有物理调制解调器的调制解调器的通信。
一旦实例化,对象的行为将类似于水链接调制解调器-m64。
使用模拟器对象排队的数据包在超时后返回。
>>>fromwlmodemimportWlModemSimulator>>>modem=WlModemSimulator()>>>modem.connect()True>>>modem.cmd_queue_packet(b"HelloSim")True>>>modem.get_data_packet()b'HelloSim'
示例
在example/文件夹中提供了多个演示如何使用api的示例。
开发
这个存储库中的代码是用pytest
进行单元测试的。tox
用于在多个python版本上自动测试。
使用以下命令运行单元测试:
pip install tox
tox