7.3.4 aiocoap树莓派GPIO示例
Python作为一款通用的计算机编程语言具有很好的硬件操作能力。作为树莓派中的默认编程语言,使用Python可操作树莓派的GPIO、SPI、UART和I2C等外设,通过这些外设不但可以控制执行机构,也可以获取传感器检测结果。本小节以GPIO为例,说明如何把CoAP与GPIO控制结合在一起。
在aiocoap树莓派GPIO示例中,树莓派3代依然作为CoAP服务器而另一台Linux主机作为CoAP客户端。树莓派中使用RPi.GPIO扩展库控制LED,该LED与树莓派扩展插座的第1脚相连,高电平可打开LED,低电平可熄灭LED。CoAP客户端通过JSON类型负载控制LED点亮或熄灭,JSON负载包含一组JSON对象,对象的键名为“value”,键值为整数类型的0或1,0表示LED熄灭而1表示LED点亮。aiocoap树莓派GPIO示例如图7-4所示。
图7-4 aiocoap树莓派GPIO示例
1.准备工作
一般情况下,树莓派3代中已经默认安装了RPi.GPIO,如果需要把RPi.GPIO升级到最新版本,可在树莓派控制台中输入以下指令:
2.服务器实现
代码清单7-4 rpi_gpio_server.py
#!/usr/bin/env python3
import logging
import asyncio
import aiocoap.resource as resource
import aiocoap
import RPi.GPIO as GPIO
import jsonled_pin = 11
class GPIOResource(resource.Resource):
def __init__(self):
super(GPIOResource, self).__init__()
led_status = {'value': 0}
self.content = json.dumps(led_status).encode("ascii")
async def render_get(self, request):
return aiocoap.Message(code=aiocoap.Code.CONTENT, payload=self.content)
async def render_put(self, request):
print('PUT payload: %s' % request.payload)
led_status = json.loads(request.payload.decode())
if led_status['value'] == 1 :
print('open led')
GPIO.output(led_pin, GPIO.HIGH)
else :
print('close led')
GPIO.output(led_pin, GPIO.LOW)
self.content = json.dumps(led_status).encode("ascii")
return aiocoap.Message(code=aiocoap.Code.CHANGED, payload=self.content)
logging.basicConfig(level=logging.INFO)
logging.getLogger("coap-server").setLevel(logging.DEBUG)
def main():
# setup gpio
GPIO.setmode(GPIO.BOARD)
GPIO.setup(led_pin, GPIO.OUT)
# Resource tree creation
root = resource.Site()
root.add_resource(('.well-known', 'core'),
resource.WKCResource(root.get_resources_as_linkheader))
root.add_resource(('gpio',), GPIOResource())
asyncio.Task(aiocoap.Context.create_server_context(root))
asyncio.get_event_loop().run_forever()
if __name__ == "__main__":
main()
(1)设置GPIO为输出状态
通过GPIO.setmode(GPIO.BOARD)设置树莓派GPIO编号方式,并通过GPIO.setup把第11引脚设置为输出状态。
import RPi.GPIO as GPIO
led_pin = 11
def main():
# setup gpio GPIO.setmode(GPIO.BOARD) GPIO.setup(led_pin, GPIO.OUT)
# 省略部分代码
(2)处理PUT请求
CoAP请求负载为JSON格式,例如{“value”:1}。PUT请求处理函数中request.payload为bytes类型,可通过decode函数把bytes类型转换为字符串类型,再通过json.loads函数转化为Python字典类型,Python字典类型和JSON类型存在直接对应关系。led