Tied is the implementation of CoAP client intended to be used on mobile. The library is built around Network
and Combine
frameworks to quck start in Apple ecosystem and seamlesly work with Network
objects. E.g. you might want to use NWBrowser
doing service discovery for you and providing NWEndpoint
s to send CoAP messages.
CoAP is constrained application protocol.
This repo is still 'Work in progress', not the full spec is covered, however it is good enough to be used for most trivial cases. Started as a pastime project is platted to be pushed forward sporadically when I have the time on weekends.
Tied.newConnection(with: Tied.Settings(host: "127.0.0.1"))
.sendMessage(payload: "Cat piss or sauvignon blanc?".data(using: .utf8)!)
.castingResponsePayloads { payload in
String(data: payload, encoding: .utf8)
}
Tied.newConnection(with: Tied.Settings(
endpoint: NWEndpoint.hostPort(host: "127.0.0.1", port: 5683), pingEvery: 3, parameters: {
let psk = Data()
let tlsOptions = NWProtocolTLS.Options()
let key = psk.withUnsafeBytes { DispatchData(bytes: $0) }
let hint = "Key \(Date())".data(using: .utf8)!.withUnsafeBytes { DispatchData(bytes: $0) }
sec_protocol_options_add_pre_shared_key(tlsOptions.securityProtocolOptions, key as __DispatchData, hint as __DispatchData)
sec_protocol_options_append_tls_ciphersuite(tlsOptions.securityProtocolOptions, tls_ciphersuite_t(rawValue: UInt16(TLS_PSK_WITH_AES_128_GCM_SHA256))!)
return NWParameters(dtls: tlsOptions, udp: NWProtocolUDP.Options())
}())
).sendMessage(CoAPMessage(version: .v1,
code: CoAPMessage.Code.Method.get,
type: .confirmable,
messageId: randomUnsigned(),
token: randomUnsigned(),
options: [CoAPMessage.MessageOption.block1(num: 0, more: true, szx: 6)],
payload: Data()))
.republishResponsePayloads()
.map { payload in
String(data: payload, encoding: .utf8)
}