proto.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include "mqtt/proto.h"
  2. #include "mqtt/ringbuf.h"
  3. I8 ICACHE_FLASH_ATTR PROTO_Init(PROTO_PARSER *parser, PROTO_PARSE_CALLBACK *completeCallback, U8 *buf, U16 bufSize)
  4. {
  5. parser->buf = buf;
  6. parser->bufSize = bufSize;
  7. parser->dataLen = 0;
  8. parser->callback = completeCallback;
  9. parser->isEsc = 0;
  10. return 0;
  11. }
  12. I8 ICACHE_FLASH_ATTR PROTO_ParseByte(PROTO_PARSER *parser, U8 value)
  13. {
  14. switch (value) {
  15. case 0x7D:
  16. parser->isEsc = 1;
  17. break;
  18. case 0x7E:
  19. parser->dataLen = 0;
  20. parser->isEsc = 0;
  21. parser->isBegin = 1;
  22. break;
  23. case 0x7F:
  24. if (parser->callback != NULL)
  25. parser->callback();
  26. parser->isBegin = 0;
  27. return 0;
  28. break;
  29. default:
  30. if (parser->isBegin == 0) break;
  31. if (parser->isEsc) {
  32. value ^= 0x20;
  33. parser->isEsc = 0;
  34. }
  35. if (parser->dataLen < parser->bufSize)
  36. parser->buf[parser->dataLen++] = value;
  37. break;
  38. }
  39. return -1;
  40. }
  41. I8 ICACHE_FLASH_ATTR PROTO_Parse(PROTO_PARSER *parser, U8 *buf, U16 len)
  42. {
  43. while (len--)
  44. PROTO_ParseByte(parser, *buf++);
  45. return 0;
  46. }
  47. I16 ICACHE_FLASH_ATTR PROTO_ParseRb(RINGBUF* rb, U8 *bufOut, U16* len, U16 maxBufLen)
  48. {
  49. U8 c;
  50. PROTO_PARSER proto;
  51. PROTO_Init(&proto, NULL, bufOut, maxBufLen);
  52. while (RINGBUF_Get(rb, &c) == 0) {
  53. if (PROTO_ParseByte(&proto, c) == 0) {
  54. *len = proto.dataLen;
  55. return 0;
  56. }
  57. }
  58. return -1;
  59. }
  60. I16 ICACHE_FLASH_ATTR PROTO_Add(U8 *buf, const U8 *packet, I16 bufSize)
  61. {
  62. U16 i = 2;
  63. U16 len = *(U16*) packet;
  64. if (bufSize < 1) return -1;
  65. *buf++ = 0x7E;
  66. bufSize--;
  67. while (len--) {
  68. switch (*packet) {
  69. case 0x7D:
  70. case 0x7E:
  71. case 0x7F:
  72. if (bufSize < 2) return -1;
  73. *buf++ = 0x7D;
  74. *buf++ = *packet++ ^ 0x20;
  75. i += 2;
  76. bufSize -= 2;
  77. break;
  78. default:
  79. if (bufSize < 1) return -1;
  80. *buf++ = *packet++;
  81. i++;
  82. bufSize--;
  83. break;
  84. }
  85. }
  86. if (bufSize < 1) return -1;
  87. *buf++ = 0x7F;
  88. return i;
  89. }
  90. I16 ICACHE_FLASH_ATTR PROTO_AddRb(RINGBUF *rb, const U8 *packet, I16 len)
  91. {
  92. U16 i = 2;
  93. if (RINGBUF_Put(rb, 0x7E) == -1) return -1;
  94. while (len--) {
  95. switch (*packet) {
  96. case 0x7D:
  97. case 0x7E:
  98. case 0x7F:
  99. if (RINGBUF_Put(rb, 0x7D) == -1) return -1;
  100. if (RINGBUF_Put(rb, *packet++ ^ 0x20) == -1) return -1;
  101. i += 2;
  102. break;
  103. default:
  104. if (RINGBUF_Put(rb, *packet++) == -1) return -1;
  105. i++;
  106. break;
  107. }
  108. }
  109. if (RINGBUF_Put(rb, 0x7F) == -1) return -1;
  110. return i;
  111. }