Page 1 of 1

[nRF52840] UART service advertising error.

Posted: Tue Mar 12, 2019 1:26 pm
by Sunghwan_Chung
Hello!

I try to connect through UART(Serial) with nRFConnect App.
Error found at the advertise function.

=====================================
>>>
>>> import spp
>>> sc = spp.SPP()
SoftDevice enabled
1. setName(name), default is nrf52_SPP .
2. start() : start service and advertise
>>> sc.start()
Traceback (most recent call last):
File "<stdin>", in <module>
File "spp.py", in start
OSError: Can not apply advertisment data. status: 0x09
>>>
=====================================

When use advertise() without params. It return no error and get any error during connect with iPhone App.
But, disconnected and connect continuously and unable transfer data. Code is below.


from board import LED
from ubluepy import Service, Characteristic, UUID, Peripheral, constants
import ble

class SPP:
deviceName = "nrf52_SPP"
conFlag = False
# start off with LED(1) off
led = LED(1)

# the Nordic UART Service.
uuid_spp_vender_specific = UUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")
uuid_spp_rx_characteristic = UUID("6E400002-B5A3-F393-E0A9-E50E24DCCA9E")
uuid_spp_tx_characteristic = UUID("6E400003-B5A3-F393-E0A9-E50E24DCCA9E")

periph = Peripheral()
service_SPP = Service(uuid_spp_vender_specific)

SPP_rx_pros = Characteristic.PROP_WRITE
SPP_rx_attrs = Characteristic.ATTR_CCCD
SPP_rx_characteristic = Characteristic(uuid_spp_rx_characteristic, props = SPP_rx_pros, attrs = SPP_rx_attrs)
service_SPP.addCharacteristic(SPP_rx_characteristic)

SPP_tx_pros = Characteristic.PROP_NOTIFY
SPP_tx_attrs = Characteristic.ATTR_CCCD
SPP_tx_characteristic = Characteristic(uuid_spp_tx_characteristic, props = SPP_tx_pros, attrs = SPP_tx_attrs)
service_SPP.addCharacteristic(SPP_tx_characteristic)

receiveddata = None

def __init__(self):
ble.enable()
self.led.off()
self.conFlag = False
print('1. setName(name), default is ', self.deviceName, '.')
print('2. start() : start service and advertise')
return

def close(self):
pass

def start(self):
self.periph.addService(self.service_SPP)
self.periph.setConnectionHandler(self.event_handler)
self.periph.advertise(device_name=self.deviceName, services=[self.service_SPP])
return

def setName(self, data):
if len(data) > 0:
self.deviceName = data
return

def sendStr(self,strdata):
self.SPP_rx_characteristic.write(strdata.encode('utf-8'))
return

def getData(self):
if self.receiveddata != None:
strReceived = self.receiveddata.decode('utf-8')
print('Rcv:', strReceived)
return strReceived
return None

def event_handler(self, id, handle, data):
if id == constants.EVT_GAP_CONNECTED:
# indicated 'connected'
print('\nEVT_GAP_CONNECTED')
self.conFlag = True
self.led.on()
self.sendStr('hello.')

elif id == constants.EVT_GAP_DISCONNECTED:
# indicate 'disconnected'
print('\nEVT_GAP_DISCONNECTED')
self.conFlag = False
self.led.off()
# restart advertisment automatically
self.periph.advertise(device_name=self.deviceName, services=[self.service_SPP])

elif id == constants.EVT_GATTS_WRITE:
# write to this Characteristic is to CCCD
print('\nEVT_GATTS_WRITE:', data.decode('utf-8'))
self.receiveddata.append(data)

elif id == constants.EVT_GATTS_READ:
print('\nEVT_GATTS_READ:', data.decode('utf-8'))

else:
print('\nNot defined id :', id, '\ndata:', data)