RPIO.py 相对于 RPi.GPIO 在各个方面都有所扩展,并且默认使用 BCM GPIO 编号方式。
GPIO 和 TCP 中断
RPIO 可以对两种中断进行监听:GPIO 和 TCP。某特定 GPIO 的输入状态改变时将产生 GPIO 中断。某 TCP socket 客户端发送信息时将产生 TCP 中断。
RPIO.wait_for_interrupts(threaded=False, epoll_timeout=1)
- 这是阻隔功能的主循环,当启用后,将会对中断进行监听,并且启用您自定义的回调操作。在您脚本的某个地方,您需要使用它来接收中断回调。这种阻隔方式非常适合于“让您的脚本一直循环运行”。
- 使用 threaded=True 参数,使它在您的脚本运行于主线程时,使其在后台操作(RPIO 在您的脚本退出时,会自动关闭该线程):
1
RPIO.wait_for_interrupts(threaded
=
True
)
GPIO 中断
中断被用于接收当 GPIO 状态发生改变时来自于内核的通知。其优点是消耗 CPU 资源非常少,通知时间非常短,并且可在特定临界值转换(rising、falling、both)时被触发的能力。您还可以设置软件上拉或下拉电阻。
RPIO.add_interrupt_callback(gpio_id, callback, edge=’both’, pull_up_down=RPIO.PUD_OFF, threaded_callback=False, debounce_timeout_ms=None)
- 添加一个回调用于接收当 GPIO 状态从 0 到 1(反之亦然)时的通知。
- 可能用到的临界值为 rising、falling、both(默认)。
- 可能用到的 pull_up_down 值为:RPIO.PUD_UP、RPIO.PUD_DOWN、RPIO.PUD_OFF(默认)。
- 如果 threaded_callback 为 True,回调将开始与线程内。否则直到其结束后,回调才会从中断等待状态下阻断 RPIO(在这期间,不会有其它回调操作)。
- 如果设置了 debounce_timeout_ms,那么从上次中断结束后,需要等到您指定的毫秒数后才会再次执行中断回调操作。可以根据您的需求进行设置(通常为 10ms 到 100ms 之间)。
- 回调功能有两个参数,分别为:GPIO 编号和值。(值为整数,0(Low)或 1(High))。回调操作通常写法为:
12
def
gpio_callback(gpio_id, value):
RPIO.del_interrupt_callback(gpio_id)
- 移除特定 GPIO 上的回调操作。
TCP Socket 中断
仅使用这一种方法就可以方便的为入站 TCP 连接打开端口:
1
|
RPIO.add_tcp_callback(port, callback, threaded_callback
=
False
)
|
- 添加 socket 服务器回调,它会在某个已连接的 socket 客户端发送数据时开始执行。这被用于 RPIO 在特定端口创建 TCP 服务器 socket。当 RPIO.wait_for_interrupts() 运行时,将接受入站连接。回调必须指定两个参数:socket 和 message(例如:def callback(socket, msg))。
- 回调可以使用 socket 参数将值发回到客户端(例如:socket.send(“hi there\n”))。如果要关闭某客户端的连接,可使用 RPIO.close_tcp_client(..)。客户端可以使用相同的方式关闭连接,或者发送到服务器一个空信息也会同样断开连接。
- 您可以使用 socket.getpeername() 来获得客户端的 IP 地址。详情可参见 Socket 对象文档。
您可以输入命令 $ telnet 对 TCP socket 中断进行测试(例如:$ telnet localhost 8080)。空字符串将通知服务器断开与客户端的连接(比如,您在 telnet 中按下回车键,您得连接将被断开)。
RPIO.close_tcp_client(self, fileno)
- 关闭客户端 socket 连接并从 epoll 中移除。您可以使用回调中的 RPIO.close_tcp_client(socket.fileno()) 来实现。
示例
以下示例将示范如何监听某些 GPIO 和 TCP 中断:
1
2
3
4
5
|