如何在GoLang中的CoAP中为服务器编写服务端点PUT请求方法?

时间:2019-01-18 08:45:19

标签: go udp udpclient coap

我试图在GoLang中为CoAP服务编写客户端和服务器。我使用了https://github.com/dustin/go-coap for this.

我成功地能够调用POST端点,但是无法调用PUT。 以下是我的问题

  1. 当我呼叫POST端点时,我的Go客户端说超时。但是服务器收到请求。如何增加客户端超时时间?

我尝试过的代码: 客户代码:

req := coap.Message{
    Type:      coap.Confirmable,
    Code:      coap.POST,
    MessageID: 12345,
    Payload: []byte(`Hello CoAP Server `),
}
path := "/App"
if len(os.Args) > 1 {
    path = os.Args[1]
}
req.SetOption(coap.ETag, "weetag")
req.SetPathString(path)

c, err := coap.Dial("udp", "localhost:5683")
rv, err := c.Send(req)  
  1. 如何在Go中指定PUT服务端点?看来我们没有为CoAP / UDP指定请求方法类型。但是,如果说的话,我有一个PUT端点app / {appId}。它不接受{appID}。仅当我将其更改为app / appID时它才有效。但我希望将此appID作为参数而不是路径。

客户代码:

    req := coap.Message{
    Type:      coap.Confirmable,
    Code:      coap.PUT,
    MessageID: 12345,
    Payload: []byte(`Hello CoAP Server `),
    }
    path := "/App/fb"   //here fb is app id and this can be anything
    if len(os.Args) > 1 {
    path = os.Args[1]
    }
    req.SetOption(coap.ETag, "weetag")
req.SetPathString(path)    
c, err := coap.Dial("udp", "localhost:5683")
rv, err := c.Send(req)  

用于POST和PUT请求的服务器代码:

mux := coap.NewServeMux()
// TODO-later: use UDP/coap
mux.Handle("/App", coap.FuncHandler(Register))
mux.Handle("/App/{AppID}", coap.FuncHandler(UpdateApp))

err := coap.ListenAndServe("udp", ":5683", mux)

这是用于通过PUT请求更新应用程序的服务器代码。在这里,我不知道如何在CoAP中将端点指定为PUT。有人可以建议我如何创建该端点mux.Handle("/App/{AppID}", coap.FuncHandler(UpdateApp))作为PUT吗?

或者甚至让我知道对于CoAP Go Services是否有更好的Go库?

1 个答案:

答案 0 :(得分:2)

根据此示例:

https://github.com/dustin/go-coap/blob/master/example/server/coap_server.go

看起来像go-coap处理程序仅受URI约束。 我认为您必须自己处理不同类型的请求。

  

必须生成带有无法识别或不受支持的方法代码的请求      一个4.05(不允许方法)附带的响应。

发件人:CoAP RFC 7252 Section 5.8 Method definitions

不幸的是,我没有学习围棋,也从未使用围棋,因此无法显示摘录。尽管我认为这很容易:您只需要使用相同的MID和令牌以NON-4.05进行回复即可。