sample.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. #include <rtthread.h>
  2. #include <stdio.h>
  3. #include "utilities.h"
  4. #include "LoRaMac.h"
  5. #include "NvmCtxMgmt.h"
  6. #include "string.h"
  7. #include "sample.h"
  8. #include "LoRaMacFunc.h"
  9. #include "LoRaMacConfig.h"
  10. #include <stdlib.h>
  11. #if( OVER_THE_AIR_ACTIVATION == 0 )
  12. extern uint8_t FNwkSIntKey[];
  13. extern uint8_t SNwkSIntKey[];
  14. extern uint8_t NwkSEncKey[];
  15. extern uint8_t AppSKey[];
  16. #else
  17. extern uint8_t AppKey[];
  18. extern uint8_t NwkKey[];
  19. extern uint8_t devEui[];
  20. extern uint8_t joinEui[];
  21. #endif
  22. extern uint32_t DevAddr;
  23. extern uint8_t AppPort;
  24. extern uint8_t AppDataSize;
  25. extern uint8_t AppDataBuffer[LORAWAN_APP_DATA_MAX_SIZE];
  26. extern uint8_t IsTxConfirmed;
  27. extern uint32_t TxDutyCycleTime;
  28. extern bool NextTx;
  29. extern TimerEvent_t TxNextPacketTimer;
  30. bool InitFlag=0;
  31. bool CycleFlag=0;
  32. bool TxNextPacketTimerFlag=0;
  33. uint32_t CycleTime=APP_TX_DUTYCYCLE;
  34. enum eDeviceState
  35. {
  36. DEVICE_STATE_RESTORE,
  37. DEVICE_STATE_START,
  38. DEVICE_STATE_JOIN,
  39. DEVICE_STATE_SEND,
  40. DEVICE_STATE_CYCLE,
  41. DEVICE_STATE_RXC,
  42. DEVICE_STATE_SLEEP
  43. }DeviceState;
  44. void LoRaWANEntry( void *parameter)
  45. {
  46. LoRaMacPrimitives_t macPrimitives;
  47. LoRaMacCallback_t macCallbacks;
  48. MibRequestConfirm_t mibReq;
  49. LoRaMacStatus_t status;
  50. macPrimitives.MacMcpsConfirm = McpsConfirm;
  51. macPrimitives.MacMcpsIndication = McpsIndication;
  52. macPrimitives.MacMlmeConfirm = MlmeConfirm;
  53. macPrimitives.MacMlmeIndication = MlmeIndication;
  54. macCallbacks.MacProcessNotify = OnMacProcessNotify;
  55. macCallbacks.NvmContextChange = NvmCtxMgmtEvent;
  56. LoRaMacInitialization( &macPrimitives, &macCallbacks, ACTIVE_REGION );
  57. while( 1 )
  58. {
  59. if( Radio.IrqProcess != NULL )
  60. {
  61. Radio.IrqProcess( );
  62. }
  63. LoRaMacProcess( );
  64. switch( DeviceState )
  65. {
  66. case DEVICE_STATE_RESTORE:
  67. {
  68. mibReq.Type = MIB_NETWORK_ACTIVATION;
  69. mibReq.Param.NetworkActivation = ACTIVATION_TYPE_OTAA;
  70. LoRaMacMibSetRequestConfirm( &mibReq );
  71. mibReq.Type = MIB_PUBLIC_NETWORK;
  72. mibReq.Param.EnablePublicNetwork = LORAWAN_PUBLIC_NETWORK;
  73. LoRaMacMibSetRequestConfirm( &mibReq );
  74. mibReq.Type = MIB_ADR;
  75. mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
  76. LoRaMacMibSetRequestConfirm( &mibReq );
  77. mibReq.Type = MIB_SYSTEM_MAX_RX_ERROR;
  78. mibReq.Param.SystemMaxRxError = 20;
  79. LoRaMacMibSetRequestConfirm( &mibReq );
  80. mibReq.Type = MIB_NET_ID;
  81. mibReq.Param.NetID = LORAWAN_NETWORK_ID;
  82. LoRaMacMibSetRequestConfirm( &mibReq );
  83. #if( OVER_THE_AIR_ACTIVATION == 0 )
  84. mibReq.Type = MIB_F_NWK_S_INT_KEY;
  85. mibReq.Param.FNwkSIntKey = FNwkSIntKey;
  86. LoRaMacMibSetRequestConfirm( &mibReq );
  87. mibReq.Type = MIB_S_NWK_S_INT_KEY;
  88. mibReq.Param.SNwkSIntKey = SNwkSIntKey;
  89. LoRaMacMibSetRequestConfirm( &mibReq );
  90. mibReq.Type = MIB_NWK_S_ENC_KEY;
  91. mibReq.Param.NwkSEncKey = NwkSEncKey;
  92. LoRaMacMibSetRequestConfirm( &mibReq );
  93. mibReq.Type = MIB_APP_S_KEY;
  94. mibReq.Param.AppSKey = AppSKey;
  95. LoRaMacMibSetRequestConfirm( &mibReq );
  96. mibReq.Type = MIB_DEV_ADDR;
  97. mibReq.Param.DevAddr = DevAddr;
  98. LoRaMacMibSetRequestConfirm( &mibReq );
  99. #else
  100. mibReq.Type = MIB_APP_KEY;
  101. mibReq.Param.AppKey = AppKey;
  102. LoRaMacMibSetRequestConfirm( &mibReq );
  103. mibReq.Type = MIB_NWK_KEY;
  104. mibReq.Param.NwkKey = NwkKey;
  105. LoRaMacMibSetRequestConfirm( &mibReq );
  106. mibReq.Type = MIB_DEV_EUI;
  107. mibReq.Param.DevEui = devEui;
  108. LoRaMacMibSetRequestConfirm( &mibReq );
  109. mibReq.Type = MIB_JOIN_EUI;
  110. mibReq.Param.JoinEui = joinEui;
  111. LoRaMacMibSetRequestConfirm( &mibReq );
  112. #endif
  113. DeviceState = DEVICE_STATE_START;
  114. break;
  115. }
  116. case DEVICE_STATE_START:
  117. {
  118. if(TxNextPacketTimerFlag==0){TxNextPacketTimerFlag=1;TimerInit(&TxNextPacketTimer,OnTxNextPacketTimerEvent);}
  119. LoRaMacStart();
  120. mibReq.Type = MIB_NETWORK_ACTIVATION;
  121. status = LoRaMacMibGetRequestConfirm( &mibReq );
  122. if( status == LORAMAC_STATUS_OK )
  123. {
  124. if( mibReq.Param.NetworkActivation == ACTIVATION_TYPE_NONE )
  125. {
  126. DeviceState = DEVICE_STATE_JOIN;
  127. }
  128. else
  129. {
  130. DeviceState = DEVICE_STATE_SEND;
  131. NextTx = true;
  132. }
  133. }
  134. DeviceState = DEVICE_STATE_JOIN;
  135. break;
  136. }
  137. case DEVICE_STATE_JOIN:
  138. {
  139. mibReq.Type = MIB_DEV_EUI;
  140. #if( OVER_THE_AIR_ACTIVATION == 0 )
  141. rt_kprintf( "\n\r\n" );
  142. rt_kprintf( "###### ===== JOINED ==== ######\r\n" );
  143. rt_kprintf( "Mode : ABP\r\n\r\n" );
  144. rt_kprintf( "DevAddr : %08lX\r\n", DevAddr );
  145. rt_kprintf( "NwkSKey : %02X", FNwkSIntKey[0] );
  146. for( int i = 1; i < 16; i++ )
  147. {
  148. rt_kprintf( " %02X", FNwkSIntKey[i] );
  149. }
  150. rt_kprintf( "\r\n" );
  151. rt_kprintf( "AppSKey : %02X", AppSKey[0] );
  152. for( int i = 1; i < 16; i++ )
  153. {
  154. rt_kprintf( " %02X", AppSKey[i] );
  155. }
  156. rt_kprintf( "\n\r\n" );
  157. rt_kprintf( "Watting for Link Check\r\n" );
  158. mibReq.Type = MIB_NETWORK_ACTIVATION;
  159. mibReq.Param.NetworkActivation = ACTIVATION_TYPE_ABP;
  160. LoRaMacMibSetRequestConfirm( &mibReq );
  161. DeviceState = DEVICE_STATE_SEND;
  162. #else
  163. rt_kprintf( "\n\r\n" );
  164. rt_kprintf( "Mode : OTAA\r\n\r\n" );
  165. LoRaMacMibGetRequestConfirm( &mibReq );
  166. rt_kprintf( "DevEui : %02X", mibReq.Param.DevEui[0] );
  167. for( int i = 1; i < 8; i++ )
  168. {
  169. rt_kprintf( "-%02X", mibReq.Param.DevEui[i] );
  170. }
  171. rt_kprintf( "\r\n" );
  172. mibReq.Type = MIB_JOIN_EUI;
  173. LoRaMacMibGetRequestConfirm( &mibReq );
  174. rt_kprintf( "AppEui : %02X", mibReq.Param.JoinEui[0] );
  175. for( int i = 1; i < 8; i++ )
  176. {
  177. rt_kprintf( "-%02X", mibReq.Param.JoinEui[i] );
  178. }
  179. rt_kprintf( "\r\n" );
  180. rt_kprintf( "AppKey : %02X", NwkKey[0] );
  181. for( int i = 1; i < 16; i++ )
  182. {
  183. rt_kprintf( " %02X", NwkKey[i] );
  184. }
  185. rt_kprintf( "\n\r\n" );
  186. JoinNetwork( );
  187. #endif
  188. break;
  189. }
  190. case DEVICE_STATE_SEND:
  191. {
  192. if( NextTx == true )
  193. {
  194. if(DEVICE_CLASS==0x02)
  195. {
  196. mibReq.Type = MIB_DEVICE_CLASS;
  197. LoRaMacMibGetRequestConfirm( &mibReq );
  198. if( mibReq.Param.Class!= CLASS_C )
  199. {
  200. mibReq.Param.Class = CLASS_C;
  201. LoRaMacMibSetRequestConfirm( &mibReq );
  202. }
  203. }
  204. PrepareTxFrame( AppPort );
  205. NextTx = SendFrame( );
  206. }
  207. if(CycleFlag)DeviceState = DEVICE_STATE_CYCLE;
  208. else DeviceState = DEVICE_STATE_SLEEP;
  209. break;
  210. }
  211. case DEVICE_STATE_CYCLE:
  212. {
  213. DeviceState = DEVICE_STATE_SLEEP;
  214. TimerSetValue( &TxNextPacketTimer,CycleTime );
  215. TimerStart( &TxNextPacketTimer );
  216. break;
  217. }
  218. case DEVICE_STATE_RXC:
  219. {
  220. DeviceState = DEVICE_STATE_SLEEP;
  221. break;
  222. }
  223. case DEVICE_STATE_SLEEP:
  224. {
  225. break;
  226. }
  227. default:
  228. {
  229. DeviceState = DEVICE_STATE_RESTORE;
  230. break;
  231. }
  232. }
  233. rt_thread_mdelay(50);
  234. }
  235. }
  236. void SendDoneCallback(uint8_t *buffer,uint8_t size) //发送完成回调函数
  237. {
  238. printf("\r\nSend Done\r\n");
  239. }
  240. void ReceiveDoneCallback(uint8_t *buffer,uint8_t size) //接收完成回调函数
  241. {
  242. printf("\r\nReceive Done\r\n");
  243. }
  244. void LoRaWanInit(void) //初始化函数
  245. {
  246. static rt_thread_t tid1 = RT_NULL;
  247. tid1 = rt_thread_create("LoRaWAN",LoRaWANEntry, RT_NULL,2048,5, 20);
  248. if (tid1 != RT_NULL)
  249. {
  250. InitFlag=1;
  251. rt_thread_startup(tid1);
  252. rt_kprintf("\r\nLoRaWAN init success...\r\n");
  253. }
  254. else rt_kprintf("\r\nLoRaWAN init fail\r\n");
  255. }
  256. #ifdef LORAWAN_DRIVER_USING_Example
  257. #define CMD_LORAWAN_INIT_INDEX 0
  258. #define CMD_LORAWAN_SEND_INDEX 1
  259. #define CMD_LORAWAN_RESTART_INDEX 2
  260. #define CMD_LORAWAN_CYCLE_INDEX 3
  261. const char* LoRaWAN_Help_Info[] =
  262. {
  263. [CMD_LORAWAN_INIT_INDEX] = "LoRaWAN Driver init -- lorawan init",
  264. [CMD_LORAWAN_SEND_INDEX] = "LoRaWAN DataSend with no ack -- lorawan send hello,world",
  265. [CMD_LORAWAN_RESTART_INDEX] = "LoRaWAN Restart to init -- lorawan restart",
  266. [CMD_LORAWAN_CYCLE_INDEX] = "LoRaWAN Cycle Send -- lorawan cycle",
  267. };
  268. /* LoRaWAN Test function */
  269. static int lorawan(int argc, char ** argv)
  270. {
  271. size_t i = 0;
  272. if (argc < 2)
  273. { // parameter error
  274. rt_kprintf("\r\n");
  275. rt_kprintf("Instructions: -- Example:\n");
  276. for (i = 0; i < sizeof(LoRaWAN_Help_Info) / sizeof(char*); i++) {
  277. rt_kprintf("%s", LoRaWAN_Help_Info[i]);
  278. rt_kprintf("\r\n");
  279. }
  280. rt_kprintf("\r\n");
  281. }
  282. else
  283. {
  284. const char *cmd = argv[1];
  285. if (!rt_strcmp(cmd, "init"))
  286. {
  287. rt_kprintf("LoRaWAN start init...\n");
  288. LoRaWanInit();
  289. }
  290. else if(!rt_strcmp(cmd, "send"))
  291. {
  292. if(InitFlag==1&&CycleFlag==0)
  293. {
  294. DataSend((uint8_t *)argv[2],strlen(argv[2]));
  295. rt_kprintf("\r\nStarting to Send Data...\r\n");}
  296. else if(InitFlag==1&&CycleFlag==1)
  297. {
  298. rt_kprintf("\r\nPlease Run lorawan restart to exit cycle\r\n");
  299. }
  300. else rt_kprintf("\r\nPlease Run lorawan init First\r\n");
  301. }
  302. else if(!rt_strcmp(cmd, "restart"))
  303. {
  304. if(InitFlag)
  305. {
  306. CycleFlag=0;
  307. DeviceState = DEVICE_STATE_RESTORE;
  308. rt_kprintf("\r\nStarting to Restart...\r\n");
  309. }
  310. else rt_kprintf("\r\nPlease Run lorawan init First\r\n");
  311. }
  312. else if(!rt_strcmp(cmd, "cycle"))
  313. {
  314. if(InitFlag)
  315. {
  316. CycleFlag=1;
  317. CycleTime = atol(argv[2]);
  318. DeviceState = DEVICE_STATE_CYCLE;
  319. rt_kprintf("\r\nStarting to Cycle Send with period %d ms...\r\n",CycleTime);
  320. }
  321. else
  322. {
  323. rt_kprintf("\r\nPlease Run lorawan init First\r\n");
  324. }
  325. }
  326. else rt_kprintf("\r\nInput Wrong,Please Check again!\r\n");
  327. }
  328. return 1;
  329. }
  330. MSH_CMD_EXPORT(lorawan, lorawan driver test);
  331. #endif