IoT开发实战:CoAP卷【2.3】

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所示。

IoT开发实战:CoAP卷【2.3】_第1张图片

图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

你可能感兴趣的:(嵌入式实战开发【1】,物联网,Node.js安装,CoAP服务器,aiocoap库,CoAP请求,树莓派的GPIO引脚)