美文网首页LoRa相关LPWAN设计
物联网网关编程模式选择

物联网网关编程模式选择

作者: 小鱼儿他老汉 | 来源:发表于2017-12-28 13:43 被阅读54次

平台与编程模式

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。

相关文章

网友评论

    本文标题:物联网网关编程模式选择

    本文链接:https://www.haomeiwen.com/subject/amamgxtx.html