CoAP 服务端示例

建立 CoAP 服务端,为远程客户端提供可访问的 CoAP 资源。


简介

CoAP 会话是请求/响应模式。服务端是以资源 Resource 的形式提供服务。 每一项资源可以被添加到服务端,并处理特定类型的访问请求。


创建 CoAP 资源

CoAP 资源必须实现 IResource 接口。最简单的方法是继承 Resource 类。

class HelloWorldResource : Resource
{
	// 设置当前资源的路径为 "helloworld"
	public HelloWorldResource() : base("helloworld")
	{
		// 设置资源的标题
		Attributes.Title = "GET a friendly greeting!";
	}
	
	// 重写 DoGet 方法来处理 GET 请求
	protected override void DoGet(CoapExchange exchange)
	{
		// 收到一次请求,回复 "Hello World!"
		exchange.Respond("Hello World!");
	}
}

这个 HelloWorldResource 资源可以处理 GET 请求,并回复一个 “Hello World!”。

实现其他方法可以使资源能够处理其他类型的请求:

class HelloWorldResource : Resource
{
	public HelloWorldResource() : base("helloworld")
	{
	}
	
	// 重写 DoGet 方法来处理 GET 请求
	protected override void DoGet(CoapExchange exchange)
	{
	}
	
	// 重写 DoPost 方法来处理 POST 请求
	protected override void DoPost(CoapExchange exchange)
	{
	}
	
	// 重写 DoPut 方法来处理 PUT 请求
	protected override void DoPut(CoapExchange exchange)
	{
	}
	
	// 重写 DoDelete 方法来处理 DELETE 请求
	protected override void DoDelete(CoapExchange exchange)
	{
	}
}

如果没有重写请求类型对应的方法,默认的响应将是:4.05 (Method Not Allowed)


创建 CoAP 服务端

准备服务端

// 创建一个新的服务端实例
var server = new CoapServer();

创建服务端实例时可以指定端口:

// 创建一个新的服务端实例,监听指定端口
var server = new CoapServer(5683, 5684);

如果不想使用默认的配置,可以创建新的配置,并传入构造函数。

// 自定义配置
ICoapConfig config = new CoapConfig();
// ...

// 创建一个新的服务端实例,使用自定义配置
var server = new CoapServer(config);

添加资源

// 添加资源
server.Add(new HelloWorldResource());

移除资源

server.Remove(...);

启动服务端

server.Start();

停止服务端

server.Stop();

资源订阅

创建可订阅资源时,只需要将 Observable 属性设置为 true 即可。 当需要广播通知时,调用 Changed();,然后每一个订阅客户端将会模拟调用一次 DoGet

class TimeResource : Resource
{
	Timer _timer;
	DateTime _now;

	// 设置当前资源的路径为 "time"
	public TimeResource() : base("time")
	{
		// 设置资源的标题
		Attributes.Title = "GET the current time";
		
		// 设置为可订阅资源
		Observable = true;
		
		_timer = new Timer(Timed, null, 0, period);
	}
	
	private void Timed(Object o)
	{
		_now = DateTime.Now;
		
		// 通知订阅者
		Changed();
	}
	
	protected override void DoGet(CoapExchange exchange)
	{
		exchange.Respond(_now.ToString());
	}
}

了解更多请查看 CoAP Example Server