Python网络通信(6)— COAP通信
一、COAP概述
COAP的介绍参考:【IoT】基于NB-IoT的CoAP协议浅析
COAP的开发参考:NB-IoT应用开发笔记
COAP通过UDP调试参考:CoAP协议学习笔记 1.3 用UDP工具来调试CoAP
二、COAP包的安装
1、在Pycharm中安装
直接搜索CoAPthon3
,然后点击安装即可
2、在Ubuntu 下使用PIP3安装
直接使用命令安装即可:
pip3 install CoAPthon3
3、通过源码安装
使用git拉取源码,python3源码地址:https://github.com/Tanganelli/CoAPthon3
git clone https://github.com/Tanganelli/CoAPthon3
然后进入源码包,安装即可:
cd CoAPthon3
python3 setup.py sdist
sudo pip3 install dist/CoAPthon3-1.0.1.tar.gz -r requirements.txt
安装完成其实可以直接使用其中的例程,例如,运行coap服务器:
python3 coapserver.py
因为python3版本的没有使用说明,可以参考Python2版本的:https://github.com/Tanganelli/CoAPthon
三、建立COAP服务器
首先我们需要创建两个类,然后通过创建的类来实例化一个CoAP服务端对象,创建完成后开始监听就好了。
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author: William
from coapthon.server.coap import CoAP
from coapthon.resources.resource import Resource
Host = "0.0.0.0" # 本机IP地址
Port = 5683 # 端口号
class BasicResource(Resource):
def __init__(self, name="BasicResource", coap_server=None):
super(BasicResource, self).__init__(name, coap_server, visible=True,
observable=True, allow_children=True)
self.payload = "Basic Resource"
def render_GET(self, request):
return self
def render_PUT(self, request):
self.payload = request.payload
return self
def render_POST(self, request):
res = BasicResource()
res.location_query = request.uri_query
res.payload = request.payload
return res
def render_DELETE(self, request):
return True
class CoAPServer(CoAP):
def __init__(self, host, port):
CoAP.__init__(self,(host, port))
self.add_resource('basic', BasicResource())
def main():
print("CoAPServer IP addr : %s port : %d "%(Host,Port))
server = CoAPServer(Host,Port)
try:
server.listen(10)
except KeyboardInterrupt:
print("Server Shutdown")
server.close()
print("Exiting...")
if __name__ == '__main__':
main()
三、COAP客户端
客户端代码如下所示
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author: William
import time
from coapthon.client.helperclient import HelperClient
host = "192.168.0.100"
port = 5683
path = "basic"
def main():
client = HelperClient(server=(host, port))
while True :
response = client.put(path,"Hello world!")
print(response.pretty_print())
time.sleep(5) # 每隔5秒发送一次数据
client.stop()
if __name__ == '__main__':
main()
运行脚本,可以在服务端下看到,已经接收到消息:
四、连接到EMQ
首先,将EMQ的COAP插件打开,打开EMQ的控制台,找到插件中的emqx_coap
,将其打开:
注意,这里有些EMQ的版本不能成功运行coap插件,原因我不清楚,不过经过我的测试,v3.0.1
版本可以成功运行。
然后我们将代码修改为如下所示,其中path
变量中topic
表示主题,c=client1
表示客户端id为client1
,u=tom
表示用户名为tom
,p=secret
表示密码为secret
,这样设置EMQ就会将其转换为对应的MQTT协议的数据。
import time
from coapthon.client.helperclient import HelperClient
host = "39.96.35.207" # "192.168.0.100"
port = 5683
path = "/mqtt/topic1?c=client1&u=tom&p=secret"
def main():
client = HelperClient(server=(host, port))
while True :
response = client.put(path,"Hello world!")
print(response.pretty_print())
time.sleep(5) # 每隔5秒发送一次数据
client.stop()
if __name__ == '__main__':
main()
运行代码,在EMQ的控制台,可以看到,已经连接成功了:
我们打开MQTTfx,订阅topic1
主题,可以接收到消息:
另外,我们也可以通过EMQ里的Websocket
工具来查看,打开Websocket
,点击连接
然后订阅topic1
,就可以看到,已经接收到消息了。