docs: add project description and server setup instructions to README

This commit is contained in:
2026-03-21 18:25:35 +00:00
parent c81815a83d
commit 6115a065c7
36 changed files with 4003 additions and 0 deletions

View File

@@ -0,0 +1,112 @@
# Macros - Extended for Demeter with CoAP Observe (RFC 7641)
_COAP_HEADER_SIZE = 4
_COAP_OPTION_HEADER_SIZE = 1
_COAP_PAYLOAD_MARKER = 0xFF
_MAX_OPTION_NUM = 10
_BUF_MAX_SIZE = 1024
_COAP_DEFAULT_PORT = 5683
def enum(**enums):
return type('Enum', (), enums)
class CoapResponseCode:
@staticmethod
def encode(class_, detail):
return ((class_ << 5) | (detail))
@staticmethod
def decode(value):
class_ = (0xE0 & value) >> 5
detail = 0x1F & value
return (class_, detail)
COAP_VERSION = enum(
COAP_VERSION_UNSUPPORTED=0,
COAP_VERSION_1=1
)
COAP_TYPE = enum(
COAP_CON=0,
COAP_NONCON=1,
COAP_ACK=2,
COAP_RESET=3
)
COAP_METHOD = enum(
COAP_EMPTY_MESSAGE=0,
COAP_GET=1,
COAP_POST=2,
COAP_PUT=3,
COAP_DELETE=4
)
COAP_RESPONSE_CODE = enum(
COAP_CREATED=CoapResponseCode.encode(2, 1),
COAP_DELETED=CoapResponseCode.encode(2, 2),
COAP_VALID=CoapResponseCode.encode(2, 3),
COAP_CHANGED=CoapResponseCode.encode(2, 4),
COAP_CONTENT=CoapResponseCode.encode(2, 5),
COAP_BAD_REQUEST=CoapResponseCode.encode(4, 0),
COAP_UNAUTHORIZED=CoapResponseCode.encode(4, 1),
COAP_BAD_OPTION=CoapResponseCode.encode(4, 2),
COAP_FORBIDDEN=CoapResponseCode.encode(4, 3),
COAP_NOT_FOUND=CoapResponseCode.encode(4, 4),
COAP_METHOD_NOT_ALLOWD=CoapResponseCode.encode(4, 5),
COAP_NOT_ACCEPTABLE=CoapResponseCode.encode(4, 6),
COAP_PRECONDITION_FAILED=CoapResponseCode.encode(4, 12),
COAP_REQUEST_ENTITY_TOO_LARGE=CoapResponseCode.encode(4, 13),
COAP_UNSUPPORTED_CONTENT_FORMAT=CoapResponseCode.encode(4, 15),
COAP_INTERNAL_SERVER_ERROR=CoapResponseCode.encode(5, 0),
COAP_NOT_IMPLEMENTED=CoapResponseCode.encode(5, 1),
COAP_BAD_GATEWAY=CoapResponseCode.encode(5, 2),
COAP_SERVICE_UNAVALIABLE=CoapResponseCode.encode(5, 3),
COAP_GATEWAY_TIMEOUT=CoapResponseCode.encode(5, 4),
COAP_PROXYING_NOT_SUPPORTED=CoapResponseCode.encode(5, 5)
)
COAP_OPTION_NUMBER = enum(
COAP_IF_MATCH=1,
COAP_URI_HOST=3,
COAP_E_TAG=4,
COAP_IF_NONE_MATCH=5,
COAP_OBSERVE=6, # RFC 7641 - Observe
COAP_URI_PORT=7,
COAP_LOCATION_PATH=8,
COAP_URI_PATH=11,
COAP_CONTENT_FORMAT=12,
COAP_MAX_AGE=14,
COAP_URI_QUERY=15,
COAP_ACCEPT=17,
COAP_LOCATION_QUERY=20,
COAP_PROXY_URI=35,
COAP_PROXY_SCHEME=39
)
COAP_CONTENT_FORMAT = enum(
COAP_NONE=-1,
COAP_TEXT_PLAIN=0,
COAP_APPLICATION_LINK_FORMAT=40,
COAP_APPLICATION_XML=41,
COAP_APPLICATION_OCTET_STREAM=42,
COAP_APPLICATION_EXI=47,
COAP_APPLICATION_JSON=50,
COAP_APPLICATION_CBOR=60
)
# Observe option values (RFC 7641)
COAP_OBSERVE_REGISTER = 0
COAP_OBSERVE_DEREGISTER = 1
coapTypeToStringMap = {
COAP_TYPE.COAP_CON: 'CON',
COAP_TYPE.COAP_NONCON: 'NONCON',
COAP_TYPE.COAP_ACK: 'ACK',
COAP_TYPE.COAP_RESET: 'RESET'
}
def coapTypeToString(type):
return coapTypeToStringMap.get(type, "INVALID")