LoRaMac.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. /*
  2. / _____) _ | |
  3. ( (____ _____ ____ _| |_ _____ ____| |__
  4. \____ \| ___ | (_ _) ___ |/ ___) _ \
  5. _____) ) ____| | | || |_| ____( (___| | | |
  6. (______/|_____)_|_|_| \__)_____)\____)_| |_|
  7. (C)2013 Semtech
  8. ___ _____ _ ___ _ _____ ___ ___ ___ ___
  9. / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __|
  10. \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _|
  11. |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
  12. embedded.connectivity.solutions===============
  13. Description: LoRa MAC layer implementation
  14. License: Revised BSD License, see LICENSE.TXT file include in the project
  15. Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jäckle ( STACKFORCE )
  16. */
  17. #include "bsp.h"
  18. //#include "stdint.h"
  19. #include <stdbool.h>
  20. #include "LoRaMacCrypto.h"
  21. #include "LoRaMac.h"
  22. #include "utilities.h"
  23. #include "usart.h"
  24. /*!
  25. * Maximum PHY layer payload size
  26. */
  27. #define LORAMAC_PHY_MAXPAYLOAD 255
  28. /*!
  29. * Maximum MAC commands buffer size
  30. */
  31. #define LORA_MAC_COMMAND_MAX_LENGTH 15
  32. /*!
  33. * Device IEEE EUI
  34. */
  35. // 0x80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01
  36. static uint8_t LoRaMacDevEui[] =
  37. {
  38. 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
  39. };
  40. /*!
  41. * Application IEEE EUI
  42. */
  43. // 0x8a 7c 07 e4 f7 24 6e 25 6c fb 37 50 fc 92 ec d6
  44. static uint8_t LoRaMacAppEui[] =
  45. {
  46. 0x8a, 0x7c, 0x07, 0xe4, 0xf7, 0x24, 0x6e, 0x25
  47. };
  48. /*!
  49. * AES encryption/decryption cipher application key
  50. */
  51. //0xabaab826f4797818854bdbdbaa55029c
  52. static uint8_t LoRaMacAppKey[] =
  53. {
  54. 0xab, 0xaa, 0xb8, 0x26, 0xf4, 0x79, 0x78, 0x18,
  55. 0x85, 0x4b, 0xdb, 0xdb, 0xaa, 0x55, 0x02, 0x9c
  56. };
  57. /*!
  58. * AES encryption/decryption cipher network session key
  59. */
  60. static uint8_t LoRaMacNwkSKey[] =
  61. {
  62. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  63. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  64. };
  65. /*!
  66. * AES encryption/decryption cipher application session key
  67. */
  68. static uint8_t LoRaMacAppSKey[] =
  69. {
  70. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  71. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  72. };
  73. /*!
  74. * Device nonce is a random value extracted by issuing a sequence of RSSI
  75. * measurements
  76. */
  77. static uint16_t LoRaMacDevNonce;
  78. /*!
  79. * Network ID ( 3 bytes )
  80. */
  81. static uint32_t LoRaMacNetID;
  82. /*!
  83. * Mote Address
  84. */
  85. static uint32_t LoRaMacDevAddr;
  86. /*!
  87. * Indicates if the node supports repeaters
  88. */
  89. static bool RepeaterSupport;
  90. /*!
  91. * Buffer containing the data to be sent or received.
  92. */
  93. static uint8_t LoRaMacBuffer[LORAMAC_PHY_MAXPAYLOAD];
  94. /*!
  95. * Length of packet in LoRaMacBuffer
  96. */
  97. static uint16_t LoRaMacBufferPktLen = 0;
  98. /*!
  99. * Buffer containing the upper layer data.
  100. */
  101. static uint8_t LoRaMacPayload[LORAMAC_PHY_MAXPAYLOAD];
  102. static uint8_t LoRaMacRxPayload[LORAMAC_PHY_MAXPAYLOAD];
  103. /*!
  104. * LoRaMAC frame counter. Each time a packet is sent the counter is incremented.
  105. * Only the 16 LSB bits are sent
  106. */
  107. static uint32_t UpLinkCounter = 1;
  108. /*!
  109. * LoRaMAC frame counter. Each time a packet is received the counter is incremented.
  110. * Only the 16 LSB bits are received
  111. */
  112. static uint32_t DownLinkCounter = 0;
  113. /*!
  114. * Indicates if the MAC layer has already joined a network.
  115. */
  116. static bool IsLoRaMacNetworkJoined = false;
  117. /*!
  118. * LoRaMac ADR control status
  119. */
  120. static bool AdrCtrlOn = false;
  121. /*!
  122. * Counts the number of missed ADR acknowledgements
  123. */
  124. static uint32_t AdrAckCounter = 0;
  125. /*!
  126. * If the node has sent a FRAME_TYPE_DATA_CONFIRMED_UP this variable indicates
  127. * if the nodes needs to manage the server acknowledgement.
  128. */
  129. static bool NodeAckRequested = false;
  130. /*!
  131. * If the server has sent a FRAME_TYPE_DATA_CONFIRMED_DOWN this variable indicates
  132. * if the ACK bit must be set for the next transmission
  133. */
  134. static bool SrvAckRequested = false;
  135. /*
  136. extern uint8_t PrepareJoinRequestFrame(uint8_t *macHdr, MACPayload_t *mPayload_t,void *fBuffer, uint16_t fBufferSize)
  137. {
  138. if(*macHdr == 0x1c) //0x1c :Mtype=000b,RFU=111b,Major=00b
  139. {
  140. fBuffer[0]=*macHdr;
  141. fBuffer[1]=(mPayload_t->AppEUI >> 56) & 0xff;
  142. fBuffer[2]=(mPayload_t->AppEUI >> 48) & 0xff;
  143. fBuffer[3]=(mPayload_t->AppEUI >> 40) & 0xff;
  144. fBuffer[4]=(mPayload_t->AppEUI >> 32) & 0xff;
  145. fBuffer[5]=(mPayload_t->AppEUI >> 24) & 0xff;
  146. fBuffer[6]=(mPayload_t->AppEUI >> 16) & 0xff;
  147. fBuffer[7]=(mPayload_t->AppEUI ) & 0xff;
  148. }
  149. else
  150. return ERROR;
  151. }
  152. */
  153. uint8_t fDangCiDataSample[]={
  154. 0xbb, //前导码
  155. 0x1b, //长度码
  156. 0xff, //帧号
  157. 0x86, //命令码
  158. 0x00, //gun_num,00H:1号枪,01H:2号枪
  159. 0x00, //status,00H:正常抄报税;01H:重复抄报税。
  160. '2','2', //22日
  161. '1','5', //15点
  162. '0','9', //09分
  163. '1','2','3','.','0','0', //油量123.45L(或公斤)
  164. '6','2','9','.','6','0', //金额629.56(元)
  165. '5','.','1','0', //单价
  166. 0x65 //校验码
  167. };
  168. uint8_t fZongLeiJiDataSample[]={
  169. 0xbb, //前导码
  170. 0x21, //长度码
  171. 0xff, //帧号
  172. 0x89, //命令码
  173. 0x00, //gun_num,00H:1号枪,01H:2号枪
  174. 0x00, //mode,00H:正常抄报税;01H:重复抄报税。
  175. '1','2','3','4','5','6','7','8','9','.','1','2',//油量123.45L(或公斤)
  176. '6','1','7','2','8','3','9','4','5','.','6','0',//油量629.56(元)
  177. '5','.','1','0', //单价
  178. 0x0c //校验码
  179. };
  180. uint8_t jDangCiDataSample[]={
  181. 0xbb, //前导码
  182. 0x1b, //长度码
  183. 0x81, //帧号
  184. 0x00, //端口号
  185. 0xa1, //命令码
  186. 0x11, //累计类型
  187. 0x00, //gun_num,00H:1号枪,01H:2号枪
  188. 0x12, //12日
  189. 0x18, //18时
  190. 0x35, //35分
  191. 0x00,0x12,0x34,0x56,0x78, //油量123456.78L(或公斤)
  192. 0x00,0x62,0x96,0x29,0x58, //金额629629.578(元)
  193. 0x00,0x00,0x00,0x05,0x10, //单价5.1
  194. 0x65,0x00 //校验码
  195. };
  196. uint8_t jZongLeiJiDataSample[]={
  197. 0xbb, //前导码
  198. 0x1b, //长度码
  199. 0x81, //帧号
  200. 0x00, //端口号
  201. 0xa1, //命令码
  202. 0x14, //累计类型
  203. 0x00, //gun_num,00H:1号枪,01H:2号枪
  204. 0x00,0x00,0x00,0x12,0x34,0x56,0x78, //油量123456.78L(或公斤)
  205. 0x00,0x00,0x00,0x62,0x96,0x29,0x58, //金额629629.578(元)
  206. 0x0c,0x00 //校验码
  207. };
  208. uint8_t BinToByte(uint8_t Value)
  209. {
  210. uint8_t tmp = Value & 0x0f;
  211. if(tmp<0x0a)
  212. return tmp+'0';
  213. else
  214. return tmp - 0x0a + 'A';
  215. }
  216. uint8_t USART1_SendNASCII(uint8_t *p,uint16_t size)
  217. {
  218. uint8_t tmp;
  219. uint16_t i=0;
  220. for(i=0;i<size;i++)
  221. {
  222. tmp = (*(p+i) >>4 ) & 0x0f;
  223. if(tmp<0x0a)
  224. USART1_SendByte( tmp+'0');
  225. else
  226. USART1_SendByte( tmp - 0x0a + 'A');
  227. tmp = (*(p+i) >>0 ) & 0x0f;
  228. if(tmp<0x0a)
  229. USART1_SendByte( tmp+'0');
  230. else
  231. USART1_SendByte( tmp - 0x0a + 'A');
  232. }
  233. return 0;
  234. }
  235. LoRaMacStatus_t PrepareFrame( LoRaMacHeader_t *macHdr, LoRaMacFrameCtrl_t *fCtrl, uint8_t fPort, void *fBuffer, uint16_t fBufferSize )
  236. {
  237. //uint16_t i;
  238. uint8_t pktHeaderLen = 0;
  239. uint32_t mic = 0;
  240. const void* payload = fBuffer;
  241. uint8_t payloadSize = fBufferSize;
  242. uint8_t framePort = fPort;
  243. LoRaMacBufferPktLen = 0;
  244. NodeAckRequested = false;
  245. if( fBuffer == NULL )
  246. {
  247. fBufferSize = 0;
  248. }
  249. LoRaMacBuffer[pktHeaderLen++] = macHdr->Value;
  250. switch( macHdr->Bits.MType )
  251. {
  252. case FRAME_TYPE_JOIN_REQ:
  253. LoRaMacBufferPktLen = pktHeaderLen;
  254. memcpyr( LoRaMacBuffer + LoRaMacBufferPktLen, LoRaMacAppEui, 8 );
  255. LoRaMacBufferPktLen += 8;
  256. memcpyr( LoRaMacBuffer + LoRaMacBufferPktLen, LoRaMacDevEui, 8 );
  257. LoRaMacBufferPktLen += 8;
  258. LoRaMacDevNonce = 0xf85e;//Radio.Random( );
  259. LoRaMacBuffer[LoRaMacBufferPktLen++] = LoRaMacDevNonce & 0xFF;
  260. LoRaMacBuffer[LoRaMacBufferPktLen++] = ( LoRaMacDevNonce >> 8 ) & 0xFF;
  261. LoRaMacJoinComputeMic( LoRaMacBuffer, LoRaMacBufferPktLen & 0xFF, LoRaMacAppKey, &mic );
  262. LoRaMacBuffer[LoRaMacBufferPktLen++] = mic & 0xFF;
  263. LoRaMacBuffer[LoRaMacBufferPktLen++] = ( mic >> 8 ) & 0xFF;
  264. LoRaMacBuffer[LoRaMacBufferPktLen++] = ( mic >> 16 ) & 0xFF;
  265. LoRaMacBuffer[LoRaMacBufferPktLen++] = ( mic >> 24 ) & 0xFF;
  266. break;
  267. case FRAME_TYPE_DATA_UNCONFIRMED_UP:
  268. if( IsLoRaMacNetworkJoined == false )
  269. {
  270. //return LORAMAC_STATUS_NO_NETWORK_JOINED; // No network has been joined yet
  271. }
  272. fCtrl->Bits.AdrAckReq = false;//AdrNextDr( fCtrl->Bits.Adr, true, &ChannelsDatarate );
  273. if( (fBufferSize+14) > 127 )
  274. {
  275. return LORAMAC_STATUS_LENGTH_ERROR;
  276. }
  277. if( SrvAckRequested == true )
  278. {
  279. SrvAckRequested = false;
  280. fCtrl->Bits.Ack = 1;
  281. }
  282. LoRaMacBuffer[pktHeaderLen++] = ( LoRaMacDevAddr ) & 0xFF;
  283. LoRaMacBuffer[pktHeaderLen++] = ( LoRaMacDevAddr >> 8 ) & 0xFF;
  284. LoRaMacBuffer[pktHeaderLen++] = ( LoRaMacDevAddr >> 16 ) & 0xFF;
  285. LoRaMacBuffer[pktHeaderLen++] = ( LoRaMacDevAddr >> 24 ) & 0xFF;
  286. fCtrl->Bits.FOptsLen=1; //自定义协议,长度值始终为1
  287. LoRaMacBuffer[pktHeaderLen++] = fCtrl->Value;
  288. LoRaMacBuffer[pktHeaderLen++] = UpLinkCounter & 0xFF;
  289. LoRaMacBuffer[pktHeaderLen++] = ( UpLinkCounter >> 8 ) & 0xFF;
  290. LoRaMacBuffer[pktHeaderLen++] = 0x01; //自定义协议,当 PHYPayload.MACPayload.Fport==1~223 时, PHYPayload.MACPayload.FHDR.Fopts=0x01
  291. LoRaMacBuffer[pktHeaderLen++] = framePort; //自定义端口号,参考《自定义协议》LoRaWAN_PayLoadVersion部分
  292. if( ( payload != NULL ) && ( payloadSize > 0 ) )
  293. {
  294. printf("\r\n");
  295. printf("payload=\r\n");
  296. USART_printfHex((uint8_t* ) payload,payloadSize);
  297. //printf("\r\n");
  298. LoRaMacPayloadEncrypt( (uint8_t* ) payload, payloadSize, LoRaMacAppSKey, LoRaMacDevAddr, UP_LINK, UpLinkCounter, LoRaMacPayload );
  299. memcpy1( LoRaMacBuffer + pktHeaderLen, LoRaMacPayload, payloadSize );
  300. printf("LoRaMacPayloadEncrypt=\r\n");
  301. USART_printfHex(LoRaMacPayload,payloadSize);
  302. //printf("\r\n");
  303. LoRaMacPayloadDecrypt( LoRaMacPayload, payloadSize, LoRaMacAppSKey, LoRaMacDevAddr, UP_LINK, UpLinkCounter, (uint8_t* ) payload );
  304. printf("LoRaMacPayloadDecrypt=\r\n");
  305. USART_printfHex((uint8_t* ) payload,payloadSize);
  306. //printf("\r\n");
  307. }
  308. LoRaMacBufferPktLen = pktHeaderLen + payloadSize;
  309. LoRaMacComputeMic( LoRaMacBuffer, LoRaMacBufferPktLen, LoRaMacNwkSKey, LoRaMacDevAddr, UP_LINK, UpLinkCounter, &mic );
  310. LoRaMacBuffer[LoRaMacBufferPktLen + 0] = mic & 0xFF;
  311. LoRaMacBuffer[LoRaMacBufferPktLen + 1] = ( mic >> 8 ) & 0xFF;
  312. LoRaMacBuffer[LoRaMacBufferPktLen + 2] = ( mic >> 16 ) & 0xFF;
  313. LoRaMacBuffer[LoRaMacBufferPktLen + 3] = ( mic >> 24 ) & 0xFF;
  314. LoRaMacBufferPktLen += LORAMAC_MFR_LEN;
  315. break;
  316. case FRAME_TYPE_PROPRIETARY:
  317. if( ( fBuffer != NULL ) && ( fBufferSize > 0 ) )
  318. {
  319. memcpy1( LoRaMacBuffer + pktHeaderLen, ( uint8_t* ) fBuffer, fBufferSize );
  320. LoRaMacBufferPktLen = pktHeaderLen + fBufferSize;
  321. }
  322. break;
  323. default:
  324. return LORAMAC_STATUS_SERVICE_UNKNOWN;
  325. }
  326. return LORAMAC_STATUS_OK;
  327. }
  328. void sendJoinRequest(void)
  329. {
  330. LoRaMacHeader_t macHdr;
  331. uint32_t i=0;
  332. macHdr.Value=0x1c;//
  333. if( PrepareFrame( &macHdr, NULL, 0, NULL, 0)==LORAMAC_STATUS_OK)
  334. {
  335. printf("\r\n");
  336. USART_printfHex(LoRaMacBuffer,LoRaMacBufferPktLen);
  337. }
  338. }
  339. void sendUnconfirmUp(void)
  340. {
  341. LoRaMacHeader_t macHdr;
  342. LoRaMacFrameCtrl_t fCtrl;
  343. uint8_t fPort;
  344. uint32_t i=0;
  345. LoRaMacDevAddr = 0x83000031;
  346. fCtrl.Value=0x01;
  347. macHdr.Value=0x5c;//
  348. fPort=0x10;
  349. if( PrepareFrame( &macHdr, &fCtrl, fPort, fDangCiDataSample, sizeof(fDangCiDataSample))==LORAMAC_STATUS_OK)
  350. {
  351. USART_printfHex(LoRaMacBuffer,LoRaMacBufferPktLen);
  352. }
  353. if( PrepareFrame( &macHdr, &fCtrl, fPort, fZongLeiJiDataSample, sizeof(fZongLeiJiDataSample))==LORAMAC_STATUS_OK)
  354. {
  355. USART_printfHex(LoRaMacBuffer,LoRaMacBufferPktLen);
  356. }
  357. if( PrepareFrame( &macHdr, &fCtrl, fPort, jDangCiDataSample, sizeof(jDangCiDataSample))==LORAMAC_STATUS_OK)
  358. {
  359. USART_printfHex(LoRaMacBuffer,LoRaMacBufferPktLen);
  360. }
  361. if( PrepareFrame( &macHdr, &fCtrl, fPort, jZongLeiJiDataSample, sizeof(jZongLeiJiDataSample))==LORAMAC_STATUS_OK)
  362. {
  363. USART_printfHex(LoRaMacBuffer,LoRaMacBufferPktLen);
  364. }
  365. }