平台与编程模式
Platform | select | yield | thread | process | asyncio | twisted |
---|---|---|---|---|---|---|
uPython | yes | yes | yes | no | no | no |
Windows | no | yes | yes | yes | yes | yes |
OpenWRT | yes | yes | yes | yes | no | ? |
Ubuntu | yes | yes | yes | yes | yes | yes |
表1:Python平台与编程模式
实现目的
所谓网关,主要通过MCU的ADC/I2C/SPI/UART/CAN进行数据采集,然后打包成TCP,序列化为JSON/msgpack,加密之后传输给远程的设备。主要任务是数据前端通讯、数据处理、序列化、编组、加密、传输。
表1的分组排列主要用各个平台和所支持的编程模式去画的,不尽科学。其实应该分为多进程、多线程和单线程。而单线程中需要分隔为I/O复用模型:包括select/poll/epoll/iocp,以及协程。Twisted本质上是基于epoll(Edge poll)的异步模式。
但是不同平台支持的方法不尽相同,所以跨平台一旦涉及到硬件不那么容易。
源码来源
我一贯主张将没有socket化的端口通过串口(包括UART/USB)接入系统,所以主要检索的就是serial/socket两种。MicroPython如果对接私有RF,如LoRa等,走的是SPI总线,只有驱动NB-IOT/eMTC模块才走串口。
主要的源码来源包括:
- Twisted (internet.serial)
- pyserial (threaded/asyncio)
- 其他
现在看来,pyserial/examples中的tcp_serial_redirect.py是最接近单通道serial/socket模型的。使用了threading模块。而且在各类Python平台上都得到了支持,虽然GIL是个大麻烦,连接数量不高、I/O速度不高的情况下问题不大。我只需要在两个端口的接收端做些业务逻辑处理即可。
然而,多通道串口相对复杂些。因为大多数multiserial/socket,是一一对应的。pyserial/port_publisher.py就是如此,该设计使用了单一进程,并使用select进行数据转发。
在多通道串口网关中,更加类似于Web:
client A/B/C --> (n) server/TCP client (1) --> MySQL
Web 服务器设计
serial A/B/C --> (n) gateway/TCP Client (1) --> WebAPI
物联网网关设计
网关的配置可以通过命令行进行初始化配置,还应该可以通过TCP连接来远程控制网关,但是Twisted似乎没有参考设计可以借鉴。在我的EpicIoThub Connector中,使用txredisapi来作为共享的TCP连接通道连接到后端,所以这部分代码其实依然是可以共享的。目前就差前端多串口传输层的连接代码了。
挫折
忽然发现基于F103的USB设备在Windows系统中工作正常,而在Linux系统中,可以识别成ttyACM0,但是却收发存在问题。相比之下,F4XX的官方USB设备固件却没有问题。
所以必须优先解决F103/F072的USB固件Bug。
网友评论