新冠肺炎的流行导致在家远程办公,于是有了串口服务器需求。
作为嵌入式开发者,有大量的设备需要连接串口。之前的做法是PC扩展USB串口连设备,然后VNC到PC。为这么个需求占一台PC,实在有点浪费。
本想自己用python写一个,后来发现Python库pyserver有一个example完全满足要求:
https://pyserial.readthedocs.io/en/latest/examples.html#multi-port-tcp-ip-serial-bridge-rfc-2217
于是就解决该example的安装及运行问题。
1.树莓派装debian;
2.上述网页里写道Requirements:
- Python (>= 2.4)
- python-avahi
- python-dbus
- python-serial (>= 2.5)
需要用python2, 3没有试。
python --version
Python 2.7.9
sudo apt-get install python-avahi
注意avahi不能用pip装。这里折腾了很久。
sudo pip install pydbus
sudo pip install pyserial
查询:
pi@raspberrypi:/etc/init.d $ pip freeze |grep dbus
pydbus==0.6.0
pi@raspberrypi:/etc/init.d $
pi@raspberrypi:/etc/init.d $ pip freeze |grep serial
pyserial==2.6
3. 安装example
按描述:
- Copy the script
port_publisher.py
to/usr/local/bin
. - Copy the script
port_publisher.sh
to/etc/init.d
. - Add links to the runlevels using
update-rc.d port_publisher.sh defaults 99
- That’s it :-) the service will be started on next reboot. Alternatively run
invoke-rc.d port_publisher.sh start
as root.
注意:
1) 文件拷贝完成后,chmod 755;
2) 第三步实测无效,改为直接修改/etc/init.d/rc.local 文件;
3) 最后一步运行无效,取代之:
sudo ./port_publisher.sh start
停止:
sudo ./port_publisher.sh stop
(stop今天实测无效,直接用tcpkill)
4) 原网页doc里两个下载文件的链接不对,可能下载下来的是html文件。建议git直接下载,或在github里download raw。
4. start后会报warning,说get_settings和
apply_settings找不到。
直接python运行之,方便找问题。
sudo python /usr/local/bin/port_publisher.py
查API,发现是pyserial版本过旧导致。分别替换成
getSettingsDict
和applySettingsDict,问题解决!
5.查看端口号,可见端口已打开:
sudo netstat -anp |grep 7000
如下三条命令可以看到USB串口相关信息:
lsusb
ls /dev/tty* -l
dmesg
6.telnet连接7000端口,大功告成!
7.只能一个用户连接。可用tcpkill强制断开其他用户的连接。详见:
https://cloud.tencent.com/developer/article/1356651
8.如提示serial模块找不到,可能是python里安装了serial库,跟本例要用的pyserial库冲突。pip uninstall 卸载serial库即可。
9. 安装和执行都加sudo,方能保证库匹配。