Linux与USB
物联网的核心操作系统还是Linux,而我主张将所有接口都通过USB转接,而避免使用SoC的原生GPIO/PWM/I2C/SPI总线。因为Linux操作系统本身虽然运行速度比较快,却并非实时操作系统。需要外部慢速设备、或复杂协议设备更加适用MCU级别产品。SoC/MCU之间通过USB之上的某种RPC进行沟通。
Linux的所有设备都是虚拟文件,而USB CDC中的ACM和ECM分别对应串口和套接字编程。无论采用何种编程语言,只要连接技术转换到这两种编程方式,就可以有大量的参考设计可以重用。简单、高效、标准、统一。
Python与串口
Linux中C/C++中的串口编程通过termios,Java有Javacom,Python中的pyserial是一个跨平台的解决方案。但是不同版本的Linux支持的Python版本不同,会带来一些兼容问题。比如OpenWRT带的Python是2.7.3,支持的pyserial版本却只有2.4!理论上说,pyserial 2.7/3.4应该是兼容的,但是我还没有在OpenWRT测试过。所以,谨慎起见,我先移植了pyserial 2.7中的example。
线程与异步
pyserial example中有两个例子:
- tcp_serial_redirect.py,采用多线程模型,构建了单一serial/socket通道;
- multiport_publisher.py,采用select模型,构建了多串口/socket通道。
LoRaWAN单通道网关
LoRaWAN单通道网关的主要任务是设备与空口参数管理,以及LoRaWAN报文转发。这种编程模型适用第一个例子。但是pyserial 2.7和3.4的tcp_serial_redirect例子中采用了两个不同的类来实现。3.4中采用了async,编程风格类似于Twisted的方法,且增加了TCP socket server/client两种连接方式。此外还使用了大量的serial url。
我使用了2.7的例子开始开发,支持TCP socket/client,同时修改了opt。目前设计完毕,并通过Twisted echo server对接。
LoRaWAN多通道网关
某个角度看,pyserial的第二个例子适合多通道,但是Windows下不支持对于非文件的select,而太多线程设计起来也很烦,可能会采用多进程配合消息队列的方式重新设计。
其他
- 增加LoRaWAN规范和协议;
- 后台服务化;
- USB udev检测;
- 标准安全协议接入,包括TLS;
- 错误推送;
- 容错;
- Admin Web和Web API集成,通过zeromq或其他方式。
网友评论