base.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. import {getAllMethods, logs, sleep, sliceChunk} from "@/utils/util";
  2. /**
  3. *
  4. */
  5. export class Base {
  6. constructor(topClass, usbSerial) {
  7. this.topClass = topClass
  8. this.usbSerial = usbSerial
  9. this.title = '设备名'
  10. this.id = null
  11. this.k = null
  12. this.key = null
  13. this.open = false
  14. this.auth = false
  15. this.config = {
  16. baudRate: 9600,
  17. dataBits: 8,
  18. stopBits: 1,// 停止位 1: STOP_BITS_1 2: STOP_BITS_2 3: STOP_BITS_15
  19. parity: null, // 校验位 0: PARITY_NONE 1: PARITY_ODD 2: PARITY_EVEN 3: PARITY_MARK 4:PARITY_SPACE
  20. flowControl: null, // 流控 0: FLOW_CONTROL_OFF 1: FLOW_CONTROL_RTS_CTS 2: FLOW_CONTROL_DSR_DTR 3: FLOW_CONTROL_XON_XOFF
  21. }
  22. this.notifyFun = null
  23. this.startChar = 0x02;
  24. this.endChar = 0x03;
  25. this.buffer = new Uint8Array(0); // 初始化空的Uint8Array作为缓冲区
  26. }
  27. setWatch(fun = null) {
  28. this.notifyFun = fun
  29. }
  30. async _init(k, key) {
  31. // logs('ScanMachine init')
  32. if (!key) {
  33. return;
  34. }
  35. if (this.key && this.open) {
  36. await this.close()
  37. await sleep(800)
  38. }
  39. this.k = k
  40. this.key = key
  41. await this.connect()
  42. // logs('ScanMachine init2')
  43. }
  44. async connect() {
  45. // logs('base connect', this.key || '-', this.open || '-')
  46. return new Promise(async (resolve, reject) => {
  47. if (!this.key || (this.key && this.open)) return reject('设备已启动')
  48. try {
  49. let option = Object.assign(this.config, {
  50. key: this.key,
  51. open: () => {
  52. this.openHandle()
  53. // logs('扫码器开始监听')
  54. resolve()
  55. },
  56. read: this.read.bind(this)
  57. })
  58. await this.usbSerialHandle(option)
  59. } catch (e) {
  60. reject(e)
  61. console.error('bmiMachine error', e)
  62. }
  63. })
  64. }
  65. read(resp) {
  66. }
  67. openHandle() {
  68. this.open = true
  69. }
  70. async close() {
  71. if (!this.open) return;
  72. await this.usbSerial.syncClose({
  73. key: this.key
  74. });
  75. this.auth = false
  76. this.key = null
  77. this.open = false
  78. uni.$emit('machineUsb', {
  79. id: this.id,
  80. up: false,
  81. })
  82. }
  83. async usbSerialHandle(option = {}) {
  84. let op = {
  85. key: option.key || null,
  86. baudRate: option.baudRate || 9600,
  87. dataBits: option.dataBits || 8,
  88. stopBits: option.stopBits || 1,
  89. open: option.open || null,
  90. read: option.read || null,
  91. }
  92. if (!op.key) throw '无法监听,请确认参数key'
  93. if (!this.auth) throw '未授权无法监听'
  94. try {
  95. // await this.usbSerial.requestPermission({
  96. // key: op.key,
  97. // });
  98. // logs('start requestPermission')
  99. // await sleep(5000)
  100. // logs('start 1')
  101. this.usbSerial.open({
  102. key: op.key,
  103. })
  104. await sleep(100)
  105. // logs('start 2')
  106. this.usbSerial.setBaudRate({
  107. key: op.key,
  108. value: op.baudRate,
  109. });
  110. // await sleep(100)
  111. // logs('start 3')
  112. this.usbSerial.setDataBits({
  113. key: op.key,
  114. value: op.dataBits,
  115. });
  116. // await sleep(100)
  117. // logs('start 4')
  118. this.usbSerial.setStopBits({
  119. key: op.key,
  120. value: op.stopBits,
  121. });
  122. // await sleep(100)
  123. // logs('start 5')
  124. if (op.parity) this.usbSerial.setParity({
  125. key: op.key,
  126. value: op.parity,
  127. });
  128. // await sleep(100)
  129. // logs('start 5')
  130. if (op.parity) this.usbSerial.setFlowControl({
  131. key: op.key,
  132. value: op.flowControl,
  133. });
  134. await sleep(500)
  135. // logs('start 6')
  136. this.usbSerial.read({
  137. key: op.key
  138. }, (resp) => {
  139. if (!resp.data) return;
  140. op.read(resp)
  141. });
  142. if (op.open) op.open()
  143. logs('开始监听', this.id, this.key, this.title)
  144. } catch (e) {
  145. // console.error('start error', e)
  146. throw e
  147. }
  148. }
  149. setPacket(startChar = 0x02, endChar = 0x03) {
  150. this.startChar = startChar
  151. this.endChar = endChar
  152. }
  153. packetManager(data) {
  154. if (!data) return;
  155. if (typeof data === 'string') {
  156. // 如果输入是字符串,将其转换为ASCII码数组
  157. data = sliceChunk(data, 2)
  158. }
  159. // logs('data', data)
  160. // 将新接收到的数据追加到现有缓冲区
  161. let tempBuffer = new Uint8Array(this.buffer.length + data.length);
  162. tempBuffer.set(this.buffer, 0);
  163. tempBuffer.set(data, this.buffer.length);
  164. this.buffer = tempBuffer;
  165. // logs('this.buffer', this.buffer)
  166. let packets = [];
  167. let start = 0;
  168. let end = 0;
  169. // 循环查找完整的数据包
  170. while ((start = this.buffer.indexOf(this.startChar, end)) !== -1 && (end = this.buffer.indexOf(this.endChar, start + 1)) !== -1) {
  171. // 提取从开始字符到结束字符的数据包
  172. const packet = this.buffer.slice(start, end + 1);
  173. // logs('packet', packet)
  174. packets.push(this.bufferTOString(packet));
  175. // 更新处理后的缓冲区内容
  176. this.buffer = this.buffer.slice(end + 1);
  177. }
  178. // logs('packets', packets)
  179. if (!packets) return false
  180. // logs('packets2', packets)
  181. // 返回所有找到的完整数据包
  182. return packets;
  183. }
  184. bufferTOString(buffer) {
  185. const hexArr = Array.prototype.map.call(
  186. new Uint8Array(buffer),
  187. function (bit) {
  188. return ('00' + bit).slice(-2).toUpperCase()
  189. }
  190. )
  191. return hexArr.join('')
  192. }
  193. parsePacket(packet) {
  194. if (packet[0] === this.startChar && packet[packet.length - 1] === this.endChar) {
  195. // 解析数据包内容,这里仅返回去除开始和结束字符的内容
  196. const content = packet.slice(1, -1);
  197. return content; // 返回解析后的内容
  198. } else {
  199. throw new Error('Invalid packet format.');
  200. }
  201. }
  202. }