So we are using NCPTransport from nrf-util (nordicsemi/thread/tncp.py) to have CoAP connectivity over Thread NCP from Raspberry Pi to other Thread devices. We have a use case where we need to reconfigure NCP network parameters in order to reach device in another network. The problem is that we get errors while re-opening NCPTransport with new (or even the same) parameters.
NCP connected to RPi over Serial `/dev/ttyS0`.
NCP based on nRF5 SDK for Thread and Zigbee v2.0.0.
Python packages:
pyserial (3.4)
pyspinel (1.0.0a3)
Our test code in Python:
import logging
logging.basicConfig(
format='%(asctime)s %(name)-6s %(message)s',
datefmt='%H:%M:%S')
import time
class Thread:
def __init__(self):
self.log = logging.getLogger('Thread')
self.log.setLevel(logging.INFO)
def run(self):
from nordicsemi.thread.tncp import NCPTransport
self.log.info("Starting...")
port = '/dev/ttyS0'
stream_descriptor = 'u:' + port
config = {NCPTransport.CFG_KEY_CHANNEL: 19,
NCPTransport.CFG_KEY_PANID: 0xbfb4,
NCPTransport.CFG_KEY_RESET: True}
transport = NCPTransport(5683, stream_descriptor)
transport.open()
time.sleep(2)
transport.close()
time.sleep(2)
Thread().run()
Thread().run()
and logs:
17:14:39 Thread Starting...
17:14:40 nordicsemi.thread.tncp Attaching to the network
17:14:45 nordicsemi.thread.tncp Done
17:14:45 nordicsemi.thread.tncp NCP Thread IPv6 addresses:
17:14:45 nordicsemi.thread.tncp fd4a:b255:f83d::ff:fe00:fc10
17:14:45 nordicsemi.thread.tncp fd4a:b255:f83d::ff:fe00:fc00
17:14:45 nordicsemi.thread.tncp fd4a:b255:f83d::ff:fe00:0
17:14:45 nordicsemi.thread.tncp fe80::1837:7abe:9451:7b67
17:14:45 nordicsemi.thread.tncp fd4a:b255:f83d:0:2706:3899:e257:fb06
17:14:50 Thread Starting...
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 754, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/local/lib/python2.7/dist-packages/spinel/codec.py", line 965, in stream_rx
self.rx_pkt = self.hdlc.collect()
File "/usr/local/lib/python2.7/dist-packages/spinel/hdlc.py", line 80, in collect
byte = self.stream.read()
File "/usr/local/lib/python2.7/dist-packages/spinel/stream.py", line 69, in read
pkt = self.serial.read(size)
File "/usr/local/lib/python2.7/dist-packages/serial/serialposix.py", line 501, in read
'device reports readiness to read but returned no data '
SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
Traceback (most recent call last):
File "ncp_forming.py", line 34, in <module>
Thread().run()
File "ncp_forming.py", line 27, in run
transport.open()
File "/tmp/nfs/factory_validation/app/src/nordicsemi/thread/tncp.py", line 224, in open
raise Exception('Failed to reset NCP. Please flash connectivity firmware.')
Exception: Failed to reset NCP. Please flash connectivity firmware.
We tried to fix it by adding `close` implementation to class StreamSerial() in spinel/stream.py:
def close(self):
print("Closing serial")
self.serial.close()
and now it works better, network is formed again, but still we get exception like below:
17:16:56 Thread Starting...
17:16:56 nordicsemi.thread.tncp Attaching to the network
17:17:01 nordicsemi.thread.tncp Done
17:17:01 nordicsemi.thread.tncp NCP Thread IPv6 addresses:
17:17:01 nordicsemi.thread.tncp fd4a:b255:f83d::ff:fe00:fc10
17:17:01 nordicsemi.thread.tncp fd4a:b255:f83d::ff:fe00:fc00
17:17:01 nordicsemi.thread.tncp fd4a:b255:f83d::ff:fe00:0
17:17:01 nordicsemi.thread.tncp fe80::1837:7abe:9451:7b67
17:17:01 nordicsemi.thread.tncp fd4a:b255:f83d:0:2706:3899:e257:fb06
Closing serial
17:17:05 Thread Starting...
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 754, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/local/lib/python2.7/dist-packages/spinel/codec.py", line 965, in stream_rx
self.rx_pkt = self.hdlc.collect()
File "/usr/local/lib/python2.7/dist-packages/spinel/hdlc.py", line 80, in collect
byte = self.stream.read()
File "/usr/local/lib/python2.7/dist-packages/spinel/stream.py", line 69, in read
pkt = self.serial.read(size)
File "/usr/local/lib/python2.7/dist-packages/serial/serialposix.py", line 493, in read
buf = os.read(self.fd, size - len(read))
TypeError: an integer is required
17:17:06 nordicsemi.thread.tncp Attaching to the network
17:17:11 nordicsemi.thread.tncp Done
17:17:11 nordicsemi.thread.tncp NCP Thread IPv6 addresses:
17:17:11 nordicsemi.thread.tncp fd4a:b255:f83d::ff:fe00:fc10
17:17:11 nordicsemi.thread.tncp fd4a:b255:f83d::ff:fe00:fc00
17:17:11 nordicsemi.thread.tncp fd4a:b255:f83d::ff:fe00:0
17:17:11 nordicsemi.thread.tncp fe80::1837:7abe:9451:7b67
17:17:11 nordicsemi.thread.tncp fd4a:b255:f83d:0:2706:3899:e257:fb06
Closing serial
Please advise if you have any idea how to fix this issue.
Thanks,
Krzysztof