Ejemplo n.º 1
0
 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']
Ejemplo n.º 2
0
        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]))
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
        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  # все вернется одновременно потому что токен один