Отправка сообщений через LoRaWAN с использованием STM32 - PullRequest
0 голосов
/ 24 сентября 2018

Как отправить сообщения через LoRaWAN?

static void PrepareTxFrame( uint8_t port )
{
switch( port ) {
    case 10: {
        int pos = 0;

        pc.printf("Prepare message\n");
#if 0
        uint32_t tempValue = ( uint32_t )( LightValue * 1000000.0 );
        AppData[0] = LightMode;
        AppData[1] = ( ( tempValue & 0xFF000000 ) >> 24 ) & 0xFF;
        AppData[2] = ( ( tempValue & 0x00FF0000 ) >> 16 ) & 0xFF;
        AppData[3] = ( ( tempValue & 0x0000FF00 ) >> 8 ) & 0xFF;
        AppData[4] = ( tempValue & 0x000000FF );
#else
        AppData[pos] = count;

        pc.printf("\n\r");
        pc.printf("The value of the counter is : %d", count);
        count++;
        pc.printf("\n\r");

        time_t seconds = time(NULL);
        printf("The time is %s", ctime(&seconds));
        AppData[++pos] = seconds;


        pc.printf("%d \n %d", AppData[0], AppData[1]);
        pc.printf("\n\r");
#endif
        pc.printf("Message Ready\n");
    }
    break;
    case 15: {
        int pos = 0;
        AppData[pos++] = AppLedStateOn;
#if 0

        if( IsTxConfirmed == true )
        {
            AppData[pos++] = LoRaMacDownlinkStatus.DownlinkCounter >> 8;
            AppData[pos++] = LoRaMacDownlinkStatus.DownlinkCounter;
            AppData[pos++] = LoRaMacDownlinkStatus.Rssi >> 8;
            AppData[pos++] = LoRaMacDownlinkStatus.Rssi;
            AppData[pos++] = LoRaMacDownlinkStatus.Snr;
        }
#endif
        AppDataSize = pos;
    }
    break;
    case 224:
        if( ComplianceTest.LinkCheck == true ) {
            ComplianceTest.LinkCheck = false;
            AppDataSize = 3;
            AppData[0] = 5;
            AppData[1] = ComplianceTest.DemodMargin;
            AppData[2] = ComplianceTest.NbGateways;
            ComplianceTest.State = 1;
        } else {
            switch( ComplianceTest.State ) {
                case 4:
                    ComplianceTest.State = 1;
                    break;
                case 1:
                    AppDataSize = 2;
                    AppData[0] = ComplianceTest.DownLinkCounter >> 8;
                    AppData[1] = ComplianceTest.DownLinkCounter;
                    break;
            }
        }
        break;
    default:
        break;
  }
 }

/*!
 * \brief
 *
  * Prepares the pay-load of the frame
  *
 * \retval  [0: frame could be send, 1: error]
 */
static bool SendFrame( void )
{
 McpsReq_t mcpsReq;
 LoRaMacTxInfo_t txInfo;

if( LoRaMacQueryTxPossible( AppDataSize, &txInfo ) != LORAMAC_STATUS_OK ) 
      {
    // Send empty frame in order to flush MAC commands
    mcpsReq.Type = MCPS_UNCONFIRMED;
    mcpsReq.Req.Unconfirmed.fBuffer = NULL;
    mcpsReq.Req.Unconfirmed.fBufferSize = 0;
    mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;

    LoRaMacUplinkStatus.Acked = false;
    LoRaMacUplinkStatus.Port = 0;
    LoRaMacUplinkStatus.Buffer = NULL;
    LoRaMacUplinkStatus.BufferSize = 0;
    SerialDisplayUpdateFrameType( false );
} else {
    LoRaMacUplinkStatus.Acked = false;
    LoRaMacUplinkStatus.Port = AppPort;
    LoRaMacUplinkStatus.Buffer = AppData;
    LoRaMacUplinkStatus.BufferSize = AppDataSize;
    SerialDisplayUpdateFrameType( IsTxConfirmed );

    if( IsTxConfirmed == false ) {
        mcpsReq.Type = MCPS_UNCONFIRMED;
        mcpsReq.Req.Unconfirmed.fPort = AppPort;
        mcpsReq.Req.Unconfirmed.fBuffer = AppData;
        mcpsReq.Req.Unconfirmed.fBufferSize = AppDataSize;
        mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
    } else {
        mcpsReq.Type = MCPS_CONFIRMED;
        mcpsReq.Req.Confirmed.fPort = AppPort;
        mcpsReq.Req.Confirmed.fBuffer = AppData;
        mcpsReq.Req.Confirmed.fBufferSize = AppDataSize;
        mcpsReq.Req.Confirmed.NbTrials = 8;
        mcpsReq.Req.Confirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
    }
}

if( LoRaMacMcpsRequest( &mcpsReq ) == LORAMAC_STATUS_OK ) {
    return false;
}
return true;
}

Будут ли отправлены данные счетчика и время?Также данные в AppData должны быть переданы?Я хочу, чтобы счет и метка времени отправлялись каждый раз, когда устройство LoRa передает.

1 Ответ

0 голосов
/ 24 сентября 2018

Полезная нагрузка для отправки (AppData) передается на уровень LoRaMAC через запрос MCPS (подуровень общей части MAC), например, для неподтвержденного кадра:

mcpsReq.Req.Unconfirmed.fBuffer = AppData;

То есть физически (то есть по RF), AppData отправляется, но перед этим шифруется и инкапсулируется.

PrepareFrame() функция создает кадр для отправки по схеме PHYPayload (см. «Форматы сообщений MAC»).часть документа LoRaWAN ™ Specification 1.0.2), следующие поля:

  • MHDR (1 байт). Заголовок Mac
  • DevAddr (4 байта). Адресконечное устройство
  • FCtrl (1 байт) Управление кадром
  • FCnt (2 байта) Счетчик кадров
  • FOpts (0 - 15 байтов) Параметры кадра
  • FPort (0 - 1 байт) Поле порта
  • FRMPayload (0 - N байт) Шифрование полезной нагрузки кадра MAC, ваш AppData зашифрованный
  • MIC (4 байта) Код целостности сообщения


FRMPayload зашифрован в соответствии с FPort.Алгоритм шифрования основан на AES 128.
Если FPort = [1..255], ключ AppSKey будет использоваться для шифрования вашей полезной нагрузки.
Иначе (FPort = 0), этозашифровано с помощью ключа NwkSKey.
Подробнее см. в функции LoRaMacPayloadEncrypt().

PHYPayload будет инкапсулировано Radio PHY Layer и отправленочерез РФ.

...