QByteArray ServerNetworkTranslator::translateAndHandleRequest(const QByteArray& requestBytes) { QVariantMap requestMap, replyMap; QByteArray replyBytes; try { requestMap = deserializeMessage(requestBytes); } catch(...) { throw(string("an error occurred on the server during de-serialization of the request")); } replyMap = ServerNetworkRequestInterpreter::interpretAndHandleRequest(requestMap); try { replyBytes = serializeMessage(replyMap); } catch(...) { throw(string("an error occurred on the server during serialization of the reply")); } return replyBytes; }
/** * @brief Este callback es llamado asincrónicamente por el stack de ZigBee * para notificar a la aplicación que se recibieron datos, enviados * por otro nodo de la red. * @param source Short Address (NWK) del nodo que envío los datos. * @param command ID del comando asociado con los datos. * @param len Cantidad de bytes del parámetro pData. * @param pData Puntero al inicio de los datos envíados por el nodo. */ void zb_ReceiveDataIndication(uint16 source, uint16 command, uint16 len, uint8 *pData) { // imprime la dirección fuente en el display HalLcdWriteStringValue("RCB", source, 16, 1); // flashea el LED 2 para indicar que se recibió un mensaje HalLedSet(HAL_LED_2, HAL_LED_MODE_FLASH); // deserealiza mensaje recibido msgReport = deserializeMessage(pData); if (msgReport.msgType == MSG_TYPE_REPORT) { HalLcdWriteStringValue("#", msgReport.sequence, 10, 2); // verifica condiciones de alarmas alarmFlags = checkAlarms(&msgReport); // imprime alarma en LCD //HalLcdWriteStringValue("ALARM", alarmFlags, 16, 2); if (alarmFlags != 0) { // crea paquete de respuesta con igual MAC y nº de secuencia struct message_t msgAlarm; msgAlarm.sequence = msgReport.sequence; memcpy(&(msgAlarm.mac), &(msgReport.mac), sizeof(msgReport.mac)); msgAlarm.msgType = MSG_TYPE_ALARM; msgAlarm.lenData = MSG_LEN_DATA_ALARM; // flags en little-endian msgAlarm.data[0] = LO_UINT16(alarmFlags); msgAlarm.data[1] = HI_UINT16(alarmFlags); // serializa mensaje y lo envía serializeMessage(&(msgAlarm), msgBuf); zb_SendDataRequest(source, MESSAGE_CLUSTER, getSizeOfMessage(&(msgAlarm)), msgBuf, 0, AF_TX_OPTIONS_NONE, 0); } // crea evento para enviar el reporte por UART a la PC, añandiendo // los flags osal_start_timerEx(sapi_TaskID, SEND_UART_MSG, 0); } }