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

图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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BinaryStarXin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值