Hoi Allemaal,
Wij hebben het voor elkaar om met de Quectel BG96 Neul messages te sturen naar het Nokia impact platform.
Er is wat vraag naar om hierover mijn ervaring te delen dus bij deze
De library die wij gebruikt hebben:
https://github.com/otheruse/NeulMessenger
Wij hebben deze library gepoort naar Mbed en gebruiken geen Arduino oid.
De enige twee klassen die wij gebruiken zijn:
- CoapPacket.h .cpp
- NeulMessenger.h .cpp
De MDM9206Module klasse hebben wij verwerkt in onze eigen klasse.
Er was 1 probleem dat wij ondervonden hebben in de MDM9206Module.
De methode receiveUDP houdt geen rekening met achtereenvolgende downlink berichten. De methode receiveUDP is zo geprogrammeerd dat deze wacht op een +QIURC: “recv” bericht. Dit bericht wordt echter alleen verstuurd als de BG96 buffer op dat moment leeg is!
Het oceanconnect/impact platform stuurt een ACK bericht terug en direct daar achteraan een bericht bevattende een token oid. Wij hebben ondervonden dat hij de ACK netjes verwerkt en daarna vervolgens wacht op nogmaals een +QIURC: “recv” wat nooit naar voren komt omdat de buffer op het moment dat het bericht binnen kwam al data bevatte (de ACK).
Zie hiervoor ook de Quectel documentatie (pagina 19):
https://www.quectel.com/UploadImage/Downlad/Quectel_BG96_TCP(IP)_AT_Commands_Manual_V1.0.pdf
“Please note that if the buffer is not empty, and the module receives data again, it will not report a new
URC until all the received data has been retrieved via AT+QIRD from buffer.”
Hierbij onze implementatie van receiveUDP (deze zou je moeten verbouwen voor Arduino):
size_t BG96::receiveUDP(const int socket, uint8_t* buffer, const size_t len, const uint32_t timeout) {
uint32_t start = us_ticker_read();
bool found = false;
// Ignore ip address and port for now
size_t size = 0;
char crLf;
//No +QIURC will be sended when the buffer already contained data.
//So check if we have already some data ready to be read
LOG("Reading UDP buffer\n");
sendCommand("AT+QIRD=%d", socket);
receive(DEFAULT_TIMEOUT, "+QIRD: %d%c", &size, &crLf);
if (size == 0) {
LOG("Buffer is empty. Waiting for incoming UDP messages\n");
while (us_ticker_read() - start < (timeout * 1000)) {
// +QIURC: "recv",<socket>
int sock;
char crLf;
LOG("Checking for incoming UDP message\n");
if (receive(DEFAULT_TIMEOUT, "+QIURC: \"recv\",%d%c%c", &sock, &crLf, &crLf)) {
LOG("Got a incoming UDP message\n");
if (sock == socket) {
LOG("UDP message is from the same socket\n");
found = true;
break;
}
}
}
if (found) {
LOG("Reading UDP buffer\n");
sendCommand("AT+QIRD=%d", socket);
receive(DEFAULT_TIMEOUT, "+QIRD: %d%c", &size, &crLf);
}
}
if (size != 0) {
LOG("Got message size: %d\n", size);
size_t bytesToRead = (size <= len ? size : len);
LOG("Bytes to read: %d\n", bytesToRead);
//drop ip information and other stuff till we find the new line character
while (crLf != '\n') {
read(DEFAULT_TIMEOUT, &crLf, 1);
}
read(DEFAULT_TIMEOUT, (char*)buffer, bytesToRead);
for (size_t i = 0; i < bytesToRead; i++) {
LOG("%02x ", buffer[i]);
}
LOG("\n");
return bytesToRead;
}
return 0;
}
Success