async def get_name(_result): _request = Request() _request.type = NON _request.code = Code.GET _request.uri_path = '/oic/d' _request.content_type = 10000 _request.source = _msg.destination _request.family = _msg.family _request.scheme = _msg.scheme _request.destination = _msg.source resp = await self.coap.send_message(_request) _payload = resp.decode_payload() # result[di]['oic-d'] = json.dumps(_payload) # debug _result['n'] = _payload['n'] _result['di'] = _payload['di']
async def get_eps(_result): _request = Request() _request.type = NON _request.code = Code.GET _request.uri_path = '/oic/res' _request.query = {'rt': ['oic.r.doxm']} _request.content_type = 10000 _request.source = _msg.destination _request.family = _msg.family _request.scheme = _msg.scheme _request.destination = _msg.source _resp = await self.coap.send_message(_request) _payload = _resp.decode_payload() if len(_payload) > 1: self.device.log.error( f'not supported answer /oic/res. {_result.get("di")}') _payload = _payload[0] # result[di]['res'] = json.dumps(_payload) # for debug _eps = [] if 'links' in _payload: _link = _payload['links'] if 'eps' in _link: # todo надо узнать по старому формату eps может быть вообще? _eps = _link['eps'] return else: _eps.append({ 'ep': f'{_msg.family}://{_msg.source[0]}:{_msg.source[1]}' }) try: if 'p' in _link and _link['p'].get( 'sec') and _link['p'].get('port'): _eps.append({ 'ep': f'coaps://{_msg.source[0]}:{_link["p"]["port"]}' }) except Exception: pass return else: _eps = _payload['eps'] _result['family'] = _msg.family for elem in _eps: _url = urlparse(elem['ep']) if _url.scheme in ['coap', 'coaps']: _address = _url.netloc.split(":") _result[_url.scheme] = (_address[0], int(_address[1]))
def _prepare_request(self, operation, to, data=None, *, secure=False, multicast=False, query=None, **kwargs): # secure = kwargs.get('secure', False) # multicast = kwargs.get('multicast', False) scheme = 'coaps' if secure else 'coap' family = to['family'] request = Request() request.type = NON request.scheme = scheme request.multicast = multicast request.family = family request.source = (to['net_interface'], None) if multicast: request.destination = (self.coap_discovery[family][0], self.coap_discovery_port) else: request.destination = to[scheme] request.code = self.map_crudn_to_coap_code(operation) request.uri_path = to.get('href', '') option = Option() option.number = defines.OptionRegistry.CONTENT_TYPE.number option.value = 10000 request.add_option(option) # request.accept = 10000 # query = kwargs.get('query') if query: request.query = query if data: request.encode_payload(data) return request
async def discover(): timeout = kwargs.get('timeout') _protocol = [] if self.ipv4: _protocol.append(self.eps_coap_ipv4) if self.ipv6: _protocol.append(self.eps_coap_ipv6) _res = None _token = self.coap.message_layer.fetch_token() _mid = self.coap.message_layer.fetch_mid() for elem in _protocol: for ip in elem: for port in elem[ip]: ep = elem[ip][port] request = Request() request.token = _token request.query = { 'owned': ['TRUE'] if kwargs.get('owned') else ['FALSE'] } request.mid = _mid request.type = NON request.code = Code.GET request.uri_path = '/oic/sec/doxm' # request.content_type = 10000 request.accept = 10000 request.source = ep.address request.multicast = True request.family = ep.family request.scheme = ep.scheme option = Option() option.number = defines.OptionRegistry.OCF_ACCEPT_CONTENT_FORMAT_VERSION.number option.value = 2048 request.add_option(option) request.destination = ( self.coap_discovery[ep.family][0], self.coap_discovery_port) _res = asyncio.create_task( self.coap.send_message(request, timeout=timeout)) # _res.append(self.coap.send_message(request)) return await _res # все вернется одновременно потому что токен один