allSDK.js 67 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897
  1. const event = require('./event');
  2. const penDataHandle = require('./penDataHandle');
  3. const utils = require('./utils');
  4. let is130 = false
  5. let battreySuccess = null
  6. let batteryFail = null
  7. let lowPower = null
  8. let getBatteryFlag = false
  9. let isOid4B = false
  10. let listenFlag = null
  11. let serviceFlag = null
  12. let initFlag = null
  13. class AllSDK {
  14. /**
  15. *
  16. * @param {number} platForm
  17. */
  18. constructor(platForm) {
  19. // 离线接收进行量
  20. this.gofflineDataProgress = 0
  21. // 离线数据量
  22. this.offlineDataNum = 0
  23. // 进度
  24. this.gefflineCounter = 0
  25. // 已连接蓝牙deviceId
  26. this.connectDeviceId = null
  27. // 已连接serviceid
  28. this.connectServiceId = null
  29. // 已连接characteristicId
  30. this.connectCharacteristicId = null
  31. this.finishFlag = false
  32. this.allDevices = {}
  33. this.allDevices.foundDevices = []
  34. this.blueToothOn = false
  35. // 日志文件储存flag
  36. this.saveDataFlag = false
  37. // 不同的平台将平台全局变量传入
  38. switch (platForm) {
  39. // 微信小程序
  40. case 0:
  41. this.platForm = wx
  42. // 此处储存日志,储存日志功能现在仅限于微信小程序
  43. this.fs = wx.getFileSystemManager()
  44. this.fileName = `${wx.env.USER_DATA_PATH}/tqlData-${Date.now()}.txt`
  45. this.fs.writeFile({
  46. filePath: this.fileName,
  47. encoding: "utf-8",
  48. success: () => {
  49. console.log('writeFileSuccess');
  50. },
  51. fail: () => {
  52. console.log('writeFileFail');
  53. }
  54. })
  55. break;
  56. // 钉钉小程序
  57. case 1:
  58. this.platForm = dd
  59. break;
  60. // 飞书小程序
  61. case 2:
  62. this.platForm = tt
  63. break;
  64. // uniApp
  65. case 3:
  66. this.platForm = uni
  67. break;
  68. default:
  69. break;
  70. }
  71. this.platFormFlag = platForm
  72. // 读取本地文件flag
  73. this.readLocalTxtFlag = false
  74. // 获取离线数据flag
  75. this.getOfflineDataFlag = false
  76. event.on('130', this, data => {
  77. console.log('130', data);
  78. is130 = data
  79. })
  80. event.on('getBatteryFlag', this, data => {
  81. console.log('getBatteryFlag', data);
  82. getBatteryFlag = data
  83. })
  84. event.on('penBattery', this, data => {
  85. console.log(data, 'penBattery');
  86. if (data) {
  87. this.startGetOfflineData(battreySuccess, batteryFail)
  88. } else {
  89. getBatteryFlag = false
  90. // 低电量方法
  91. if (lowPower) {
  92. lowPower();
  93. }
  94. }
  95. })
  96. // 2022-7-14 chende 笔类型OID
  97. this.penType = null
  98. this.penOID = null
  99. }
  100. // 监听本地蓝牙状态改变
  101. /**
  102. *
  103. * @param {Function} blueToothON
  104. */
  105. listenBlueState(blueToothON) {
  106. this.platForm.onBluetoothAdapterStateChange((res) => {
  107. if (res.available) {
  108. // 在本地蓝牙开启之后 关闭本地蓝牙状态监听
  109. if (this.platForm.offBluetoothAdapterStateChange) {
  110. this.platForm.offBluetoothAdapterStateChange()
  111. }
  112. if (blueToothON) {
  113. blueToothON()
  114. }
  115. }
  116. })
  117. }
  118. // 蓝牙错误码
  119. static BLUETOOTH_ERRORCODE = new Map([
  120. [0, '正常'],
  121. [-1, '已连接'],
  122. [10000, '未初始化蓝牙适配器'],
  123. [10001, '当前蓝牙适配器不可用'],
  124. [10002, '没有找到指定设备'],
  125. [10003, '连接失败'],
  126. [10004, '没有找到指定服务'],
  127. [10005, '没有找到指定特征'],
  128. [10006, '当前连接已断开'],
  129. [10007, '当前特征不支持此操作'],
  130. [10008, '其余所有系统上报的异常正常'],
  131. [10009, 'Android 系统特有,系统版本低于 4.3 不支持 BLE'],
  132. [10012, '连接超时'],
  133. [10013, '连接 deviceId 为空或者是格式不正确'],
  134. ])
  135. // iOS下提示
  136. static IOS_FAIL_STATE = new Map([
  137. [0, '未知'],
  138. [1, '重置中'],
  139. [2, '不支持'],
  140. [3, '未授权'],
  141. [4, '未开启'],
  142. ])
  143. /**
  144. * @param {Function} success
  145. * @param {Function} fail
  146. * @returns {void}
  147. */
  148. // 初始化蓝牙模块
  149. initBlueTooth(success, fail) {
  150. this.platForm.openBluetoothAdapter({
  151. success: () => {
  152. if (success) {
  153. success();
  154. }
  155. },
  156. fail: (e) => {
  157. console.log(e)
  158. if (fail) {
  159. const {
  160. state,
  161. errCode,
  162. errMsg
  163. } = e
  164. let msg = errMsg
  165. if (state === 3) {
  166. msg = '系统蓝牙未授权'
  167. }
  168. fail({
  169. msg
  170. });
  171. }
  172. }
  173. })
  174. }
  175. // 读取本地蓝牙适配器状态信息
  176. getLocalBlueToothState() {
  177. }
  178. // 监听蓝牙连接设备断开
  179. listenBlueConnection() {
  180. // 监听之前先移除已有的监听事件 防止同一事件多次监听
  181. if (this.platForm.offBLEConnectionStateChange) {
  182. this.platForm.offBLEConnectionStateChange();
  183. }
  184. this.platForm.onBLEConnectionStateChange(res => {
  185. if (this.connectDeviceId === res.deviceId && !res.connected) {
  186. event.emit('unConnect', true)
  187. }
  188. });
  189. }
  190. // 搜索附近的蓝牙设备
  191. /**
  192. * @param {Function} success
  193. * @param {Function} fail
  194. * @returns {void }
  195. */
  196. searchBlueTooth(success, fail) {
  197. // console.log(success)
  198. this.platForm.startBluetoothDevicesDiscovery({
  199. allowDuplicatesKey: true,
  200. success: (res) => {
  201. if (success) {
  202. success()
  203. }
  204. },
  205. fail: (res) => {
  206. if (fail) {
  207. fail()
  208. }
  209. },
  210. complete: (res) => {
  211. console.log(res)
  212. }
  213. })
  214. }
  215. // 停止搜索附近蓝牙设备
  216. stopBlueToothSearch(success, fail) {
  217. this.platForm.stopBluetoothDevicesDiscovery({
  218. success: () => {
  219. if (success) {
  220. this.showBlueToothList()
  221. success()
  222. }
  223. },
  224. fail: () => {
  225. if (fail) {
  226. fail()
  227. }
  228. }
  229. })
  230. }
  231. // 查找到的设备列表
  232. showBlueToothList() {
  233. let flag = true
  234. this.platForm.onBluetoothDeviceFound(res => {
  235. if (res) {
  236. res.devices.forEach(device => {
  237. // 此处钉钉advertisData为hexstring 飞书 uni 微信为arrayBuffer
  238. let penCheck = null
  239. if (this.platFormFlag === 1) {
  240. if (!device.advertisData) {
  241. return
  242. }
  243. let arrayData = hexToArray(device.advertisData)
  244. penCheck = ab2hex(arrayData)
  245. } else {
  246. penCheck = ab2hex(device.advertisData)
  247. }
  248. if (penCheck.length < 10) {
  249. return
  250. }
  251. if (penCheck.slice(0, 4).join(":").toUpperCase() !== '31:32:33:34') {
  252. return
  253. }
  254. device.macAddress = penCheck.slice(4, 10).reverse().join(':').toUpperCase();
  255. if (this.allDevices.foundDevices.length !== 0) {
  256. flag = this.allDevices.foundDevices.every((item, index) => {
  257. return item.deviceId !== device.deviceId
  258. })
  259. }
  260. if (flag) {
  261. this.allDevices.foundDevices.push(device)
  262. }
  263. })
  264. }
  265. // 此处做出修改 不同平台之间的赋值方式不同 统一为event发送
  266. event.emit('foundDevices', this.allDevices)
  267. })
  268. }
  269. // 释放蓝牙
  270. closeBlueTooth(success, fail) {
  271. this.platForm.closeBluetoothAdapter({
  272. success: () => {
  273. if (success) {
  274. success();
  275. }
  276. },
  277. fail: () => {
  278. if (fail) {
  279. fail();
  280. }
  281. }
  282. })
  283. }
  284. // 创建蓝牙连接
  285. createBlueToothConnection(deviceId, success, fail) {
  286. this.stopBlueToothSearch(() => {
  287. console.log('stopSearch');
  288. })
  289. switch (this.platFormFlag) {
  290. // uniapp
  291. case 3:
  292. // 微信小程序创建连接
  293. case 0:
  294. this.platForm.createBLEConnection({
  295. deviceId,
  296. success: () => {
  297. // 连接成功默认关闭蓝牙搜索
  298. // this.stopBlueToothSearch(() => {
  299. // console.log('stopBlueToothDiscovery');
  300. // })
  301. // 此处监听蓝牙断开
  302. setTimeout(() => {
  303. this.listenBlueConnection()
  304. }, 500);
  305. if (success) {
  306. success();
  307. }
  308. },
  309. fail: () => {
  310. if (fail) {
  311. fail();
  312. }
  313. }
  314. })
  315. break
  316. // 钉钉小程序
  317. case 1:
  318. // 飞书小程序
  319. case 2:
  320. this.platForm.connectBLEDevice({
  321. deviceId,
  322. success: () => {
  323. // 连接成功默认关闭蓝牙搜索
  324. this.stopBlueToothSearch(() => {
  325. console.log('stopBlueToothDiscovery');
  326. })
  327. // 此处监听蓝牙断开
  328. setTimeout(() => {
  329. this.listenBlueConnection()
  330. }, 500)
  331. if (success) {
  332. success();
  333. }
  334. },
  335. fail: () => {
  336. if (fail) {
  337. fail();
  338. }
  339. }
  340. })
  341. break
  342. default:
  343. break;
  344. }
  345. }
  346. // 断开蓝牙连接
  347. unConnectBlueTooth(deviceId, success, fail) {
  348. switch (this.platFormFlag) {
  349. // uniapp
  350. case 3:
  351. // 微信小程序
  352. case 0:
  353. this.platForm.closeBLEConnection({
  354. deviceId,
  355. success: () => {
  356. if (success) {
  357. success();
  358. }
  359. setTimeout(() => {
  360. if (this.platForm.offBLECharacteristicValueChange) {
  361. this.platForm.offBLECharacteristicValueChange(res => {
  362. console.log(res);
  363. })
  364. }
  365. }, 500)
  366. },
  367. fail: () => {
  368. if (fail) {
  369. fail();
  370. }
  371. }
  372. })
  373. break
  374. // 钉钉小程序
  375. case 1:
  376. // 飞书小程序
  377. case 2:
  378. this.platForm.disconnectBLEDevice({
  379. deviceId,
  380. success: () => {
  381. if (success) {
  382. success()
  383. }
  384. },
  385. fail: () => {
  386. if (fail) {
  387. fail()
  388. }
  389. }
  390. })
  391. break
  392. default:
  393. break
  394. }
  395. }
  396. // chende add 2022-8-8
  397. // 0-微信 / 1-钉钉 / 2-飞书 / 3-uniapp
  398. static SERVICE_ID = ['0000F100-0000-1000-8000-00805F9B34FB', '0000FFF0-0000-1000-8000-00805F9B34FB', '0000F200-0000-1000-8000-00805F9B34FB']
  399. static SERVICE_ID_KEY = (platForm) => ['uuid', 'serviceId', 'serviceId', 'uuid'][platForm]
  400. // 获取蓝牙设备服务
  401. getBlueToothService(deviceId, success, fail) {
  402. this.platForm.getBLEDeviceServices({
  403. deviceId,
  404. success: async (res) => {
  405. // console.log(res)
  406. // 获取主服务的所有特征值
  407. // 获取蓝牙设备服务不同平台属性不一样
  408. // 飞书 钉钉为serviceId 而微信小程序 uniapp为 uuid
  409. // 并且此处因为不用平台的底层实现不一样 必须有sleep才能进行
  410. if (serviceFlag) {
  411. clearTimeout(serviceFlag)
  412. }
  413. serviceFlag = setTimeout(async () => {
  414. // chende fix 2022-8-8
  415. const serviceIdKey = AllSDK.SERVICE_ID_KEY(this.platFormFlag)
  416. let length = res.services.length
  417. for (let i = 0; i < length; i++) {
  418. const serviceId = res.services[i][serviceIdKey]
  419. if (AllSDK.SERVICE_ID.includes(serviceId)) {
  420. this.getBlueToothCharaceristics(deviceId, serviceId)
  421. await sleep(100)
  422. }
  423. }
  424. // switch (this.platFormFlag) {
  425. // // 微信小程序
  426. // case 0:
  427. // // uniapp
  428. // case 3:
  429. // let length = res.services.length
  430. // for (let i = 0; i < length; i++) {
  431. // console.log('getService');
  432. // this.getBlueToothCharaceristics(deviceId, res.services[i].uuid)
  433. // await sleep(100)
  434. // }
  435. // break
  436. // // 钉钉小程序
  437. // case 1:
  438. // // 飞书小程序
  439. // case 2:
  440. // let serviceLength = res.services.length
  441. // for (let i = 0; i < serviceLength; i++) {
  442. // this.getBlueToothCharaceristics(deviceId, res.services[i].serviceId)
  443. // await sleep(100)
  444. // }
  445. // break
  446. // default:
  447. // break
  448. // }
  449. }, 500)
  450. if (success) {
  451. success()
  452. }
  453. },
  454. fail: (error) => {
  455. console.error('getBlueToothService', error)
  456. if (fail) {
  457. fail()
  458. }
  459. }
  460. })
  461. }
  462. // chende add 2022-8-8
  463. // 0-微信 / 1-钉钉 / 2-飞书 / 3-uniapp
  464. static UUID_KEY = (platForm) => ['uuid', 'characteristicId', 'characteristicId', 'uuid'][platForm]
  465. // 获取蓝牙设备的某个服务的所有特征值
  466. // 此处不同平台的属性值不一样 微信小程序 uniapp 为uuid 而飞书 钉钉为 characteristicId
  467. // 服务特征值不同平台不一样 微信为 uuid 飞书为characteristicsId
  468. // 防抖
  469. getBlueToothCharaceristics(deviceId, serviceId) {
  470. this.platForm.getBLEDeviceCharacteristics({
  471. deviceId,
  472. serviceId,
  473. success: (res) => {
  474. // chende fix 2022-8-8
  475. const uuidKey = AllSDK.UUID_KEY(this.platFormFlag)
  476. res.characteristics.forEach((item) => {
  477. const uuid = item[uuidKey]
  478. if (item.properties.notify || item.properties.indicate) {
  479. this.platForm.notifyBLECharacteristicValueChange({
  480. state: true,
  481. deviceId,
  482. serviceId,
  483. characteristicId: uuid,
  484. success: (res) => console.log(`监听特征值:${uuid}`)
  485. })
  486. }
  487. //向蓝牙写数据
  488. //此处不同的平台有不同的属性值 需要区别处理
  489. if (item.properties.write && item.uuid.toUpperCase() == '0000F102-0000-1000-8000-00805F9B34FB') {
  490. this.connectDeviceId = deviceId
  491. this.connectServiceId = serviceId
  492. this.connectCharacteristicId = uuid
  493. }
  494. })
  495. // 此处开始监听数据
  496. if (listenFlag) {
  497. clearTimeout(listenFlag)
  498. }
  499. listenFlag = setTimeout(() => {
  500. this.listenValueChange()
  501. event.emit('blueToothConnect', true)
  502. }, 2000)
  503. if (initFlag) {
  504. clearTimeout(initFlag)
  505. }
  506. initFlag = setTimeout(() => {
  507. // 此处获取笔的类型
  508. this.getPenModal();
  509. this.getValue()
  510. // 初始化笔的时间
  511. this.setRTCTime(new Date().getTime())
  512. }, 2100);
  513. // switch (this.platFormFlag) {
  514. // // 微信小程序
  515. // case 0:
  516. // // uniapp
  517. // case 3:
  518. // res.characteristics.forEach(item => {
  519. // if (item.properties.notify || item.properties.indicate) {
  520. // this.platForm.notifyBLECharacteristicValueChange({
  521. // state: true,
  522. // deviceId,
  523. // serviceId,
  524. // characteristicId: item.uuid,
  525. // success: (res) => {
  526. // console.log('notifyBLECharacteristicValueChange success------: ' + res.errMsg)
  527. // }
  528. // })
  529. // }
  530. // //向蓝牙写数据
  531. // //此处不同的平台有不同的属性值 需要区别处理
  532. // if (item.properties.write && item.uuid.toUpperCase() == '0000F102-0000-1000-8000-00805F9B34FB') {
  533. // this.connectDeviceId = deviceId
  534. // this.connectServiceId = serviceId
  535. // this.connectCharacteristicId = item.uuid
  536. // }
  537. // // 此处开始监听数据
  538. // if (listenFlag) {
  539. // clearTimeout(listenFlag)
  540. // }
  541. // listenFlag = setTimeout(() => {
  542. // this.listenValueChange()
  543. // event.emit('blueToothConnect', true)
  544. // }, 1000)
  545. // })
  546. // break
  547. // // 钉钉小程序
  548. // case 1:
  549. // // 飞书小程序
  550. // case 2:
  551. // res.characteristics.forEach((item) => {
  552. // if (item.properties.notify || item.properties.indicate) {
  553. // this.platForm.notifyBLECharacteristicValueChange({
  554. // state: true,
  555. // deviceId,
  556. // serviceId,
  557. // characteristicId: item.characteristicId,
  558. // success: (res) => {
  559. // console.log('notifyBLECharacteristicValueChange success------: ' + res)
  560. // }
  561. // })
  562. // }
  563. // // 向蓝牙写数据
  564. // if (item.properties.write && item.characteristicId.toUpperCase() === '0000F102-0000-1000-8000-00805F9B34FB') {
  565. // console.log('向蓝牙写数据')
  566. // this.connectDeviceId = deviceId
  567. // this.connectServiceId = serviceId
  568. // this.connectCharacteristicId = item.characteristicId
  569. // // console.log(deviceId,serviceId,item.characteristicId)
  570. // }
  571. // // 此处开始监听数据
  572. // if (listenFlag) {
  573. // clearTimeout(listenFlag)
  574. // }
  575. // listenFlag = setTimeout(() => {
  576. // this.listenValueChange()
  577. // event.emit('blueToothConnect', true)
  578. // }, 1000)
  579. // })
  580. // break
  581. // default:
  582. // break
  583. // }
  584. // if (initFlag) {
  585. // clearTimeout(initFlag)
  586. // }
  587. // initFlag = setTimeout(() => {
  588. // // 此处获取笔的类型
  589. // this.getPenModal();
  590. // this.getValue()
  591. // // 初始化笔的时间
  592. // this.setRTCTime(new Date().getTime())
  593. // }, 1000);
  594. },
  595. fail: (error) => {
  596. console.error('getBlueToothCharaceristics', error)
  597. }
  598. })
  599. }
  600. // 监听 第一时间处理数据
  601. listenValueChange() {
  602. // 有些平台可能会没有这个api
  603. if (this.platForm.offBLECharacteristicValueChange) {
  604. this.platForm.offBLECharacteristicValueChange()
  605. }
  606. this.platForm.onBLECharacteristicValueChange(characteristic => {
  607. switch (characteristic.characteristicId.toUpperCase()) {
  608. // 实时数据
  609. // 此处飞书 格式为hexstring uniapp为arrayBuffer 钉钉也是hexstring 微信小程序为arraybuffer
  610. case '0000FFF1-0000-1000-8000-00805F9B34FB':
  611. // 接收离线数据或者读取本地文件时停止接收实时数据
  612. if (this.readLocalTxtFlag) {
  613. return
  614. }
  615. // 微信与uniapp
  616. if (this.platFormFlag === 0 || this.platFormFlag === 3) {
  617. let dataArr = ab2hex(characteristic.value)
  618. let dataLength = dataArr.length / 10
  619. // console.log(dataArr);
  620. for (let i = 0; i < dataLength; i++) {
  621. penDataHandle.splitData(hex2Bytes(dataArr.slice(i * 10, (i + 1) * 10)))
  622. // 微信存日志
  623. if (this.saveDataFlag && this.platFormFlag === 0) {
  624. this.fs.appendFileSync(this.fileName, (dataArr.slice(i * 10, (i + 1) * 10)).join(" ") + '\n', 'utf-8')
  625. }
  626. }
  627. // 飞书与钉钉
  628. } else {
  629. let buffer = hexToArray(characteristic.value)
  630. let dataArr1 = ab2hex(buffer)
  631. let dataLength = dataArr1.length / 10
  632. for (let i = 0; i < dataLength; i++) {
  633. penDataHandle.splitData(hex2Bytes(dataArr1.slice(i * 10, (i + 1) * 10)))
  634. }
  635. }
  636. break
  637. // 离线数据
  638. case '0000F202-0000-1000-8000-00805F9B34FB':
  639. //微信与uniapp
  640. if (this.platFormFlag === 0 || this.platFormFlag === 3) {
  641. let dataArray = ab2hex(characteristic.value) //此处转换后的数据格式为['e1','08',....]
  642. // console.log(dataArray);
  643. let dataLength1 = dataArray.length / 10
  644. for (let i = 0; i < dataLength1; i++) {
  645. let newArr = dataArray.slice(i * 10, (i + 1) * 10);
  646. // 离线数据
  647. if (newArr[0] === 'e1' && newArr[1] === '08') {
  648. const oid4CodeValue = parseInt(newArr.slice(2).join(""), 16)
  649. const index = oid4CodeValue >> 10
  650. const newIndex = index % 65536
  651. let SA = Math.floor((index / 65536 / 256 / 256 / 256) % 256)
  652. let SB = Math.floor((index / 65536 / 256 / 256) % 256)
  653. let SC = Math.floor((index / 65536 / 256) % 256)
  654. let SD = Math.floor((index / 65536) % 256)
  655. emitData({
  656. cmd: 'offlineOID4codeValue',
  657. data: `${SA}-${SB}-${SC}-${SD}-${newIndex}`
  658. })
  659. console.log(`sa:${SA},sb:${SB}sc:${SC}sd:${SD}index:${newIndex}`)
  660. // 此处计数
  661. this.gofflineDataProgress += 1
  662. if (!(this.gofflineDataProgress % 50)) {
  663. event.emit('offlineGross', this.gofflineDataProgress)
  664. }
  665. // console.log(this.offlineDataNum,this.gofflineDataProgress);
  666. // if (this.offlineDataNum === this.gofflineDataProgress) {
  667. // setTimeout(() => {
  668. // this.gofflineDataProgress = 0
  669. // this.getOfflineDataFlag = false
  670. // event.emit('offlineDataFinish', true)
  671. // }, 2000)
  672. // }
  673. } else {
  674. let arr = hex2Bytes(newArr)
  675. penDataHandle.splitData(arr, false)
  676. // 此处计数
  677. this.gofflineDataProgress += 1
  678. if (!(this.gofflineDataProgress % 50)) {
  679. event.emit('offlineGross', this.gofflineDataProgress)
  680. }
  681. // console.log(this.offlineDataNum,this.gofflineDataProgress);
  682. // if (this.offlineDataNum === this.gofflineDataProgress) {
  683. // setTimeout(() => {
  684. // this.gofflineDataProgress = 0
  685. // this.getOfflineDataFlag = false
  686. // event.emit('offlineDataFinish', true)
  687. // }, 2000)
  688. // }
  689. }
  690. // console.log(this.offlineDataNum, this.gofflineDataProgress);
  691. }
  692. } else {
  693. // 飞书与钉钉
  694. let buffer1 = hexToArray(characteristic.value);
  695. let dataArray1 = ab2hex(buffer1)
  696. let dataLength2 = dataArray1.length / 10
  697. for (let i = 0; i < dataLength2; i++) {
  698. let newArr = dataArray1.slice(i * 10, (i + 1) * 10)
  699. let arr1 = hex2Bytes(newArr)
  700. penDataHandle.splitData(arr1, false)
  701. }
  702. }
  703. break
  704. // 属性列表
  705. case "0000F101-0000-1000-8000-00805F9B34FB":
  706. // 微信与uniapp
  707. if (this.platFormFlag === 0 || this.platFormFlag === 3) {
  708. let dataArr1 = ab2hex(characteristic.value)
  709. let arr1 = hex2Bytes(dataArr1)
  710. getDataInfo(arr1, this)
  711. } else {
  712. // 钉钉与飞书
  713. let buffer2 = hexToArray(characteristic.value)
  714. let dataArray2 = ab2hex(buffer2)
  715. let arr2 = hex2Bytes(dataArray2)
  716. getDataInfo(arr2, this)
  717. }
  718. break
  719. default:
  720. break
  721. }
  722. })
  723. }
  724. // 发送指令封装
  725. dealData(index, arrData, success, fail) {
  726. let buffer = new ArrayBuffer(index)
  727. let bufferView = new DataView(buffer)
  728. for (let i = 0; i < index; i++) {
  729. bufferView.setUint8(i, arrData[i])
  730. }
  731. // 发送指令是不同的平台有不同的格式
  732. // 微信小程序与uniapp为buffer 飞书和钉钉为hexstring
  733. switch (this.platFormFlag) {
  734. // 微信小程序
  735. case 0:
  736. // uniapp
  737. case 3:
  738. this.platForm.writeBLECharacteristicValue({
  739. characteristicId: this.connectCharacteristicId,
  740. serviceId: this.connectServiceId,
  741. deviceId: this.connectDeviceId,
  742. value: buffer,
  743. success: (res) => {
  744. if (success) {
  745. success();
  746. }
  747. },
  748. fail: (err) => {
  749. if (fail) {
  750. fail();
  751. }
  752. }
  753. })
  754. break;
  755. // 钉钉
  756. case 1:
  757. // 飞书
  758. case 2:
  759. // console.log(buffer)
  760. let dataHex = buf2hex(buffer)
  761. this.platForm.writeBLECharacteristicValue({
  762. characteristicId: this.connectCharacteristicId,
  763. serviceId: this.connectServiceId,
  764. deviceId: this.connectDeviceId,
  765. value: dataHex,
  766. success: () => {
  767. if (success) {
  768. success()
  769. }
  770. },
  771. fail: () => {
  772. if (fail) {
  773. fail();
  774. }
  775. }
  776. })
  777. break;
  778. default:
  779. break;
  780. }
  781. // let dataHex = buf2hex(buffer)
  782. // this.platForm.writeBLECharacteristicValue({
  783. // characteristicId: this.connectCharacteristicId,
  784. // serviceId: this.connectServiceId,
  785. // deviceId: this.connectDeviceId,
  786. // value: dataHex,
  787. // success: () => {
  788. // success();
  789. // },
  790. // fail: () => {
  791. // fail();
  792. // }
  793. // })
  794. }
  795. // 写入笔名
  796. /**
  797. *
  798. * @param {string} penName
  799. * @param {Function} success
  800. * @param {Function} fail
  801. */
  802. setPenName(penName, success, fail) {
  803. let strBytesArr = strToUtf8(penName);
  804. let byteLength = strBytesArr.length;
  805. let offLineBuffer = new ArrayBuffer(byteLength + 2);
  806. let DataViews = new DataView(offLineBuffer);
  807. DataViews.setUint8(0, 0xA2);
  808. DataViews.setUint8(1, byteLength);
  809. for (let i = 0; i < byteLength; i++) {
  810. DataViews.setUint8(i + 2, strBytesArr[i])
  811. }
  812. if (this.platFormFlag === 0 || this.platFormFlag === 3) {
  813. this.platForm.writeBLECharacteristicValue({
  814. characteristicId: this.connectCharacteristicId,
  815. serviceId: this.connectServiceId,
  816. deviceId: this.connectDeviceId,
  817. value: offLineBuffer,
  818. success: () => {
  819. if (success) {
  820. success();
  821. }
  822. },
  823. fail: () => {
  824. if (fail) {
  825. fail();
  826. }
  827. }
  828. })
  829. } else {
  830. let hexStr = buf2hex(offLineBuffer)
  831. this.platForm.writeBLECharacteristicValue({
  832. characteristicId: this.connectCharacteristicId,
  833. serviceId: this.connectServiceId,
  834. deviceId: this.connectDeviceId,
  835. value: hexStr,
  836. success: () => {
  837. if (success) {
  838. success();
  839. }
  840. },
  841. fail: () => {
  842. if (fail) {
  843. fail();
  844. }
  845. }
  846. })
  847. }
  848. }
  849. // 请求笔名
  850. getPenName(success, fail) {
  851. this.dealData(3, [0xa0, 0x01, 0xff], success, fail)
  852. }
  853. // 获取MAC地址
  854. getMACAddress(success, fail) {
  855. this.dealData(3, [164, 1, 255], success, fail)
  856. }
  857. // 获取蓝牙固件版本
  858. getPenFirmWare(success, fail) {
  859. this.dealData(3, [0xa6, 0x01, 0xff], success, fail)
  860. }
  861. // 获取剩余电量
  862. getPenBattery(success, fail) {
  863. this.dealData(3, [0xa8, 0x01, 0xff], success, fail)
  864. }
  865. // 写入rtc时间
  866. // 传入时间为想改写时间的时间戳
  867. /**
  868. *
  869. * @param {number} RTCTime
  870. * @param {Function} success
  871. * @param {Function} fail
  872. */
  873. setRTCTime(RTCTime, success, fail) {
  874. let timeStamp = (RTCTime - 1262275200000) / 1000;
  875. // console.log(timeStamp, 'timestamp')
  876. this.dealData(6, [0xac, 0x04, timeStamp & 0xff, (timeStamp >> 8) & 0xff, (timeStamp >> 16) & 0xff, (timeStamp >> 24) & 0xff], success, fail);
  877. }
  878. // 请求rtc时间
  879. getRTCTime(success, fail) {
  880. this.dealData(3, [0xaa, 0x01, 0xff], success, fail)
  881. }
  882. // 写入自动关机时间
  883. /**
  884. *
  885. * @param {number} offTime
  886. * @param {Function} success
  887. * @param {Function} fail
  888. */
  889. setPenAutoOff(offTime, success, fail) {
  890. if (offTime > 120 || offTime < 0) {
  891. return console.error('自动关机时间的范围为0~120')
  892. }
  893. this.dealData(4, [0xb2, 0x02, offTime % 256, offTime / 256], success, fail)
  894. }
  895. // 请求自动关机时间
  896. getPenAutoOff(success, fail) {
  897. this.dealData(3, [0xb0, 0x01, 0xff], success, fail)
  898. }
  899. // 获取已使用内存
  900. getPenMemory(success, fail) {
  901. this.dealData(3, [0xb6, 0x01, 0xff], success, fail)
  902. }
  903. // 获取是否点笔开机
  904. getPenClickMode(success, fail) {
  905. this.dealData(3, [0xb8, 0x01, 0xff], success, fail)
  906. }
  907. // 设置点笔开机
  908. /**
  909. *
  910. * @param {boolean} isClick
  911. * @param {Function} success
  912. * @param {Function} fail
  913. */
  914. setPenClickMode(isClick, success, fail) {
  915. this.dealData(3, [0xba, 0x01, isClick ? 0x01 : 0x00], success, fail)
  916. }
  917. // 设置是否蜂鸣
  918. /**
  919. *
  920. * @param {boolean} isOn
  921. * @param {Function} success
  922. * @param {Function} fail
  923. */
  924. setPenBeep(isOn, success, fail) {
  925. this.dealData(3, [0xbe, 0x01, isOn ? 0x01 : 0x00], success, fail)
  926. }
  927. // 获取是否蜂鸣
  928. getPenBeep(success, fail) {
  929. this.dealData(3, [0xbc, 0x01, 0xff], success, fail)
  930. }
  931. // 恢复出厂设置
  932. restoreFactory(success, fail) {
  933. this.dealData(3, [0xb4, 0x01, 0xff, success, fail])
  934. }
  935. // 写入压力敏感度
  936. /**
  937. *
  938. * @param {number} level
  939. * @param {Function} success
  940. * @param {Function} fail
  941. */
  942. setPenSensor(level, success, fail) {
  943. this.dealData(3, [0xd2, 0x01, level], success, fail)
  944. }
  945. // 获取压力敏感度
  946. getPenSensor(success, fail) {
  947. this.dealData(3, [0xd0, 0x01, 0xff], success, fail)
  948. }
  949. // 设置LED灯颜色
  950. setPenLedColor(color, success, fail) {
  951. this.dealData(3, [0xd6, 0x01, color], success, fail)
  952. }
  953. // 获取led颜色
  954. getPenLedColor(success, fail) {
  955. this.dealData(3, [0xd4, 0x01, 0xff], success, fail)
  956. }
  957. // 获取压力校正值
  958. getPenSensorRegulate(success, fail) {
  959. this.dealData(3, [0xd8, 0x01, 0xff], success, fail)
  960. }
  961. // 获取mcu固件版本
  962. getMCUVersion(success, fail) {
  963. this.dealData(3, [0xda, 0x01, 0xff], success, fail)
  964. }
  965. // 获取笔的类型
  966. getPenModal(success, fail) {
  967. this.dealData(3, [0xe4, 0x01, 0xff], success, fail)
  968. }
  969. // 获取点码类型
  970. getPenPointType(success, fail) {
  971. this.dealData(3, [0xe6, 0x01, 0xff], success, fail)
  972. }
  973. // led设置开关
  974. /**
  975. *
  976. * @param {boolean} isOn
  977. * @param {Function} success
  978. * @param {Function} fail
  979. */
  980. setLedConfig(isOn, success, fail) {
  981. this.dealData(3, [0xee, 0x01, isOn ? 0x01 : 0x00], success, fail)
  982. }
  983. // 获取led是够可以设置的结果
  984. getLedConfig(success, fail) {
  985. this.dealData(3, [0xec, 0x01, 0xff], success, fail)
  986. }
  987. // 获取离线数据量大小
  988. getPenOfflineDataSize(success, fail) {
  989. this.dealData(3, [0xc0, 0x01, 0xff], success, fail)
  990. }
  991. // 开始获得离线数据
  992. /**
  993. *
  994. * @param {Function} success
  995. * @param {Function} fail
  996. * @param {Function} lowPower
  997. */
  998. startGetOfflineData(success, fail, lowPower) {
  999. battreySuccess = success
  1000. batteryFail = fail
  1001. lowPower = lowPower
  1002. if (is130 && !getBatteryFlag) {
  1003. event.emit('getBatteryFlag', true)
  1004. this.getPenBattery();
  1005. return
  1006. }
  1007. event.emit('getBatteryFlag', false)
  1008. this.dealData(3, [0xc2, 0x01, 0x00], success, fail)
  1009. }
  1010. // 停止获得离线数据
  1011. stopGetOfflineData(success, fail) {
  1012. this.dealData(3, [0xc2, 0x01, 0x01], success, fail)
  1013. }
  1014. // 暂停获得离线数据
  1015. pauseGetOfflineData(success, fail) {
  1016. this.dealData(3, [0xcb, 0x01, 0x00], success, fail)
  1017. }
  1018. // 继续获得离线数据
  1019. continueGetOfflineData(success, fail) {
  1020. this.dealData(3, [0xcb, 0x01, 0x01], success, fail)
  1021. }
  1022. // 删除离线数据
  1023. deleteOfflineData(success, fail) {
  1024. this.dealData(3, [0xc8, 0x01, 0xff], success, fail)
  1025. }
  1026. // 确认离线数据已经接受完毕
  1027. confirmOfflineDataDone(success, fail) {
  1028. this.dealData(3, [0xc6, 0x01, this.finishFlag ? 0x00 : 0x01], success, fail)
  1029. }
  1030. // 获取客户id
  1031. getCustomerId(success, fail) {
  1032. this.dealData(3, [0xDC, 0x01, 0xff], success, fail)
  1033. }
  1034. // // 设置客户id
  1035. // setCustomerId(success,fail){
  1036. // }
  1037. // 获取oid值
  1038. getOIDValue(success, fail) {
  1039. // console.log(0xe0);
  1040. this.dealData(3, [0xE0, 0x01, 0xff], success, fail)
  1041. }
  1042. // 获取笔的镜头值
  1043. getValue(suceess, fail) {
  1044. this.dealData(3, [0xe6, 0x01, 0xff], suceess, fail)
  1045. }
  1046. // ota升级
  1047. otaUpdate(success, fail) {
  1048. this.dealData(3, [0xf4, 0x01, 0xff], success, fail)
  1049. }
  1050. // 给蓝牙装置发送升级文件
  1051. // otaUpdateFile() {
  1052. // }
  1053. // 双指令集合
  1054. // 读取本厂家参数
  1055. getMCUsetting(success, fail) {
  1056. this.dealData(6, [0x00, 0x08, 0x06, 0x05, 0x01, 0xff], success, fail)
  1057. }
  1058. // 设置厂家参数
  1059. setMCUsetting(data, success, fail) {
  1060. console.log(data);
  1061. let numA = Number(data) >> 8
  1062. let numB = Number(data) & 0xff
  1063. this.dealData(13, [0x00, 0x08, 0x06, 0x04, 8, 0, 0, 0, 0, 0, 0, numA, numB], success, fail)
  1064. }
  1065. // 获取压感设置
  1066. getPenPressure(success, fail) {
  1067. this.dealData(6, [0x00, 0x08, 0x06, 0x03, 0x01, 0xff], success, fail)
  1068. }
  1069. // 写入压感
  1070. setPenPressure() {
  1071. }
  1072. // 主动响蜂鸣器
  1073. triggerPenBeep(num, interval) {
  1074. let intervalH = Number(interval) >> 8
  1075. let intervalL = Number(interval) & 0xff
  1076. this.dealData(8, [0x00, 0x08, 0x04, 0x00, 3, Number(num), intervalH, intervalL])
  1077. }
  1078. }
  1079. // arrayBuffer转16进制字符串数组
  1080. /**
  1081. *
  1082. * @param {ArrayBufferTypes} buffer
  1083. */
  1084. const ab2hex = (buffer) => {
  1085. return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2))
  1086. }
  1087. // hex to bytes
  1088. /**
  1089. *
  1090. * @param {Array} arr
  1091. */
  1092. const hex2Bytes = (arr) => {
  1093. return arr.map((item) => {
  1094. return parseInt(item, 16)
  1095. })
  1096. }
  1097. /**
  1098. * @param {Array} lpData
  1099. * @param {object} doneFlag
  1100. */
  1101. const getDataInfo = (lpData, doneFlag) => {
  1102. // console.log('笔数据-', lpData, lpData.map(i => i.toString(16)))
  1103. const data = {};
  1104. let len = 0;
  1105. let val = lpData.slice(2, len + 2);
  1106. // 双指令接收
  1107. if (lpData[0] === 0x00 && lpData[1] === 0x08) {
  1108. // 接收通知蜂鸣器鸣叫
  1109. if (lpData[2] === 0x04 && lpData[3] === 0x00) {
  1110. emitData({
  1111. data: lpData[5] ? false : true,
  1112. cmd: 'penBeepSuccess'
  1113. })
  1114. }
  1115. // 读取无效码设置
  1116. if (lpData[2] === 0x06 && lpData[3] === 0x05) {
  1117. let newArray = lpData.slice(-2)
  1118. console.log(newArray);
  1119. let num = (newArray[0] << 8) + newArray[1]
  1120. console.log(num);
  1121. emitData({
  1122. data: num,
  1123. cmd: 'getInvalidSetting'
  1124. })
  1125. }
  1126. //设置无效码返回值
  1127. if (lpData[2] === 0x06 && lpData[3] === 0x04) {
  1128. console.log(lpData);
  1129. emitData({
  1130. data: lpData[5] ? false : true,
  1131. cmd: "setInvalidSetting"
  1132. })
  1133. }
  1134. // 读取MCU配置
  1135. if (lpData[2] === 0x06 && lpData[3] === 0x03) {
  1136. }
  1137. // 设置MCU配置返回值
  1138. if (lpData[2] === 0x06 && lpData[3] === 0x02) {
  1139. }
  1140. // 读取是否开启偏移
  1141. if (lpData[2] === 0x06 && lpData[3] === 0x01) {
  1142. }
  1143. // 偏移开启成功失败
  1144. if (lpData[2] === 0x06 && lpData[3] === 0x00) {
  1145. emitData({
  1146. data: lpData[5] ? false : true,
  1147. cmd: 'penDeviation'
  1148. })
  1149. }
  1150. // 监听无效码上报
  1151. if (lpData[2] === 0x05 && lpData[3] === 0x00) {
  1152. emitData({
  1153. cmd: 'invalidCode',
  1154. data: true
  1155. })
  1156. }
  1157. }
  1158. switch (lpData[0]) {
  1159. case 0xE7: {
  1160. doneFlag.penOID = lpData[2]
  1161. switch (lpData[2]) {
  1162. case 0x00:
  1163. //OID3
  1164. event.emit('isOffset', {
  1165. offset: true,
  1166. codeType: 12
  1167. })
  1168. break;
  1169. case 0x01:
  1170. //OID4
  1171. event.emit('isOffset', {
  1172. offset: true,
  1173. codeType: 12
  1174. })
  1175. break;
  1176. case 0x02:
  1177. //2021.05.18 增加新的点类型 用来确定角度修正值
  1178. //OID_A
  1179. event.emit('isOffset', {
  1180. offset: true,
  1181. codeType: 12
  1182. })
  1183. break;
  1184. case 0x12:
  1185. //2021.09.08 增加009镜头是否做了偏移判断
  1186. //OID_B
  1187. //009 down去掉 第一个move点变成down点
  1188. event.emit('isOffset', {
  1189. offset: false,
  1190. codeType: 12
  1191. })
  1192. break;
  1193. case 0x03:
  1194. //12x12 需要SDK内部修偏移
  1195. event.emit('isOffset', {
  1196. offset: true,
  1197. codeType: 12
  1198. })
  1199. //OID4_A
  1200. break;
  1201. case 0x13:
  1202. //12x12 不需要内部修偏移
  1203. event.emit('isOffset', {
  1204. offset: false,
  1205. codeType: 12
  1206. })
  1207. //OID4_B
  1208. break;
  1209. case 0x23:
  1210. //16x16 需要SDK内部修偏移
  1211. //OID4_A
  1212. event.emit('isOffset', {
  1213. offset: true,
  1214. codeType: 12
  1215. })
  1216. break;
  1217. case 0x33:
  1218. //16x16 不需要SDK内部修偏移
  1219. //OID4_B
  1220. event.emit('isOffset', {
  1221. offset: false,
  1222. codeType: 16
  1223. })
  1224. break;
  1225. default:
  1226. break;
  1227. }
  1228. break;
  1229. }
  1230. case 0xa1:
  1231. len = lpData[1] & 0xff;
  1232. val = byteToString(lpData.slice(2, len + 2));
  1233. emitData({
  1234. data: val,
  1235. cmd: 'getPenName'
  1236. })
  1237. break;
  1238. case 0xa3:
  1239. if (lpData[2] === 0x00) {
  1240. emitData({
  1241. cmd: 'setPenName',
  1242. data: true
  1243. })
  1244. } else {
  1245. emitData({
  1246. cmd: 'setPenName',
  1247. data: false
  1248. })
  1249. }
  1250. break
  1251. case 0xa5:
  1252. let macAddress = lpData.slice(2, lpData.length).map((item) => {
  1253. return MAC(item)
  1254. }).join(':')
  1255. emitData({
  1256. cmd: 'getMacAddress',
  1257. data: macAddress
  1258. })
  1259. break;
  1260. case 0xa7:
  1261. let res = byteToString(lpData.slice(2, lpData.length))
  1262. emitData({
  1263. cmd: 'getBlueToothVersion',
  1264. data: res
  1265. })
  1266. break;
  1267. // 2021 05 19 添加电量低于10%禁止获取离线数据
  1268. case 0xa9:
  1269. let penBattery = lpData[2] & 0xff;
  1270. let penIsCharging = lpData[3] === 0x01;
  1271. if (is130 && getBatteryFlag) {
  1272. event.emit('penBattery', penBattery > 10)
  1273. }
  1274. emitData({
  1275. cmd: 'getPenBattery',
  1276. data: {
  1277. penBattery: `${penBattery}%`,
  1278. penIsCharging
  1279. }
  1280. })
  1281. break;
  1282. // 获取笔的rtc时间
  1283. case 0xab:
  1284. console.log(lpData);
  1285. const startTime = 1262275200000; //2010.01.01开始时间戳
  1286. let currentTime = (new Date()).getTime();
  1287. let mPen_time = (lpData[2] & 0xff) | ((lpData[3] << 8) & 0xff00) | ((lpData[4] << 16) & 0xff0000) | ((lpData[5] << 24) & 0xff000000);
  1288. console.log(mPen_time * 1000);
  1289. let timeOffset = (currentTime - startTime) / 1000
  1290. let offTimeoff = timeOffset - mPen_time
  1291. console.log(offTimeoff, '时间差')
  1292. penDataHandle.changeOffset(offTimeoff);
  1293. emitData({
  1294. cmd: "getRTCtime",
  1295. data: (mPen_time * 1000 + startTime)
  1296. })
  1297. break;
  1298. case 0xad:
  1299. emitData({
  1300. cmd: 'setRTCtime',
  1301. data: lpData[2] === 0x00
  1302. })
  1303. break;
  1304. case 0xb1:
  1305. val = lpData.slice(2, 4);
  1306. let penAutoShutDown = (val[0] & 0xff) | ((val[1] << 8) & 0xff00)
  1307. emitData({
  1308. cmd: 'getPenAutoShutDownTime',
  1309. data: penAutoShutDown
  1310. })
  1311. break;
  1312. case 0xb3:
  1313. emitData({
  1314. cmd: 'setPenAutoOff',
  1315. data: lpData[2] === 0x00
  1316. })
  1317. break
  1318. case 0xb5:
  1319. emitData({
  1320. cmd: 'RestoreFactorySettings',
  1321. data: lpData[2] === 0x00
  1322. })
  1323. break
  1324. case 0xb7:
  1325. // console.log(lpData[2] & 0xff)
  1326. emitData({
  1327. cmd: 'getUsedMemory',
  1328. data: lpData[2] & 0xff + '%'
  1329. })
  1330. break;
  1331. case 0xb9:
  1332. emitData({
  1333. cmd: 'getPenClickMode',
  1334. data: lpData[2] === 0x01
  1335. })
  1336. break
  1337. case 0xbb:
  1338. emitData({
  1339. cmd: 'setPenClickMode',
  1340. data: lpData[2] === 0x00
  1341. })
  1342. break
  1343. case 0xbd:
  1344. emitData({
  1345. cmd: 'getPenBeep',
  1346. data: lpData[2] === 0x01
  1347. })
  1348. break
  1349. case 0xbf:
  1350. emitData({
  1351. cmd: 'setPenBeep',
  1352. data: lpData[2] === 0x00
  1353. })
  1354. break
  1355. case 0xd1:
  1356. emitData({
  1357. cmd: 'getPenSensor',
  1358. data: lpData[2] & 0xff
  1359. })
  1360. break
  1361. case 0xd3:
  1362. emitData({
  1363. cmd: "setPenSensor",
  1364. data: lpData[2] === 0x00
  1365. })
  1366. break
  1367. case 0xd5:
  1368. emitData({
  1369. cmd: 'getLEDColor',
  1370. data: lpData[2] & 0xff
  1371. })
  1372. break;
  1373. // case 0xd7:
  1374. // emitData({
  1375. // cmd: "setPenSensor",
  1376. // data: lpData[2] === 0x00
  1377. // })
  1378. // break
  1379. case 0xd9:
  1380. // 压力校正值
  1381. // console.log(lpData);
  1382. let lowSensor = (((lpData[3] << 8) & 0xff00) + (lpData[2] & 0xff))
  1383. let highSensor = (((lpData[5] << 8) & 0xff00) + (lpData[4] & 0xff))
  1384. // var sensitivityCorrection = "20g:" + (((lpData[3] << 8) & 0xff00) + (lpData[2] & 0xff)) + "300g:" + (((lpData[5] << 8) & 0xff00) + (lpData[4] & 0xff));
  1385. // console.log(sensitivityCorrection);
  1386. emitData({
  1387. cmd: "getSensitivityCorrection",
  1388. data: `${lowSensor}-${highSensor}`
  1389. })
  1390. break;
  1391. case 0xdb:
  1392. console.log(lpData, 'MCU');
  1393. len = lpData[1] & 0xff;
  1394. val = lpData.slice(2, len + 2);
  1395. var isR = lpData[2] & 0xff;
  1396. var mcu_firmware = "";
  1397. if (isR) {
  1398. mcu_firmware = "MCUF_" + "R" + (lpData[4] & 0xff * 10) + (lpData[5] & 0xff) + (data[6] & 0xff);
  1399. } else {
  1400. mcu_firmware = "MCUF_" + "B" + (lpData[4] & 0xff) + (lpData[5] & 0xff) + (lpData[6] & 0xff);
  1401. }
  1402. if (lpData[9] === 7 || lpData[9] === 8 || lpData[9] === 9 || lpData[9] === 10) {
  1403. if (lpData[2] === 1) {
  1404. mcu_firmware = "V" + (lpData[4] * 10 + lpData[5]) + '.' + (lpData[6] * 10 + lpData[7])
  1405. } else {
  1406. mcu_firmware = 'B' + (lpData[4] * 10 + lpData[5]) + '.' + (lpData[6] * 10 + lpData[7])
  1407. }
  1408. console.log(mcu_firmware);
  1409. }
  1410. emitData({
  1411. cmd: 'getMCUVersion',
  1412. data: mcu_firmware
  1413. })
  1414. break;
  1415. case 0xe1:
  1416. // console.log(lpData, '点读码值');
  1417. let oid4CodeValue = 0
  1418. // 离线点读码
  1419. if (lpData[1] === 8) {
  1420. // let arrayData = lpData.slice(8);//[0x18,0x69]
  1421. // console.log(arrayData);
  1422. // let value = arrayData[0] >> 2
  1423. console.log(lpData);
  1424. if (lpData.length > 10) {
  1425. for (let i = 0; i < lpData.length / 10; i++) {
  1426. let newArr = lpData.slice(i * 10, (i + 1) * 10)
  1427. let oid4CodeValue = ((newArr[3] * Math.pow(2, 40)) & 0xFF0000000000) | ((newArr[4] * Math.pow(2, 32)) & 0xFF00000000) | ((newArr[5] * Math.pow(2, 24)) & 0xFF000000) | ((newArr[6] * Math.pow(2, 16)) & 0xFF0000) | ((newArr[7] * Math.pow(2, 8)) & 0xFF00) | (newArr[9] & 0xFC)
  1428. // console.log(oid4CodeValue);
  1429. oid4CodeValue = oid4CodeValue >> 2
  1430. // console.log(oid4CodeValue);
  1431. let index = oid4CodeValue % 65536
  1432. // console.log(index, 'index');
  1433. let SA = Math.floor((oid4CodeValue / 65536 / 256 / 256 / 256) % 256)
  1434. let SB = Math.floor((oid4CodeValue / 65536 / 256 / 256) % 256)
  1435. let SC = Math.floor((oid4CodeValue / 65536 / 256) % 256)
  1436. let SD = Math.floor((oid4CodeValue / 65536) % 256)
  1437. emitData({
  1438. cmd: 'offlineOID4codeValue',
  1439. data: `${SA}-${SB}-${SC}-${SD}-${index}`
  1440. })
  1441. }
  1442. }
  1443. } else {
  1444. // console.log(lpData)
  1445. let oidFlag = (lpData[2] >> 7 & 0x01);
  1446. // let index =undefined
  1447. if (oidFlag == 1) { // oid4 high-coder
  1448. let n9 = (lpData[2] & 0xf0) >> 4
  1449. console.log(n9, 'n9');
  1450. if (n9 === 9) {
  1451. //009
  1452. let startPoint = lpData[2] & 0x03
  1453. let newArray = []
  1454. let dataArray = lpData.slice(3, 9)
  1455. for (let i = 0; i < dataArray.length; i++) {
  1456. newArray.push(numToHex(dataArray[i]))
  1457. }
  1458. let dataString = startPoint + newArray.join('')
  1459. // console.log(dataString);
  1460. dataString = dataString.slice(0, dataString.length - 1)
  1461. oid4CodeValue = (parseInt(dataString, 16))
  1462. // console.log(oid4CodeValue)
  1463. } else {
  1464. //005
  1465. // console.log(lpData);
  1466. let oid_a = (lpData[8] << 40);
  1467. oid_a = numToHex(lpData[8] & 0x3f)
  1468. // console.log(oid_a, 'oidA');
  1469. let oid_b = (lpData[9] << 32);
  1470. oid_b = numToHex(lpData[9])
  1471. let dataArray = lpData.slice(9, 14)
  1472. let stringArray = []
  1473. // console.log(oid_b, 'oidB');
  1474. for (let i = 0; i < dataArray.length; i++) {
  1475. stringArray.push(numToHex(dataArray[i]))
  1476. }
  1477. let hexNum = oid_a + stringArray.join('')
  1478. // console.log(hexNum);
  1479. oid4CodeValue = parseInt(hexNum, 16)
  1480. console.log(oid4CodeValue);
  1481. }
  1482. } else if (oidFlag == 0) { // oid3 high-coder
  1483. oid4CodeValue = ((lpData[10] & 0xff) << 24) | (lpData[11] << 16) | (lpData[12] << 8) | (lpData[13]);
  1484. } else {
  1485. // console.log("The oidFlag state is : " + oidFlag);
  1486. }
  1487. if (oid4CodeValue == 0) {
  1488. return;
  1489. }
  1490. // if ((lpData[2] & 0x10) != 0) {
  1491. // return;22222222222
  1492. // }
  1493. console.log(oid4CodeValue, 'oidValue');
  1494. let index = oid4CodeValue % 65536
  1495. console.log(index, 'index');
  1496. let SA = Math.floor((oid4CodeValue / 65536 / 256 / 256 / 256) % 256)
  1497. let SB = Math.floor((oid4CodeValue / 65536 / 256 / 256) % 256)
  1498. let SC = Math.floor((oid4CodeValue / 65536 / 256) % 256)
  1499. let SD = Math.floor((oid4CodeValue / 65536) % 256)
  1500. // console.log(`SA:${SA}/SB:${SB}/SC:${SC}/SD:${SD}/index:${index}`);
  1501. emitData({
  1502. cmd: 'getOID4CodeValue',
  1503. data: `${SA}-${SB}-${SC}-${SD}-${index}`
  1504. })
  1505. console.log(SA, SB, SC, SD, index)
  1506. }
  1507. break;
  1508. case 0xf0:
  1509. let penColor = lpData.slice(2, lpData.length);
  1510. emitData({
  1511. cmd: 'penColor',
  1512. data: penColor
  1513. })
  1514. break;
  1515. // 读取笔的类型
  1516. case 0xe5:
  1517. doneFlag.penType = lpData[2]
  1518. switch (lpData[2]) {
  1519. case 0x00:
  1520. event.emit('130', false)
  1521. utils.changeDistanceAndAngle(3.3641, 17)
  1522. break
  1523. case 0x01:
  1524. event.emit('130', false)
  1525. utils.changeDistanceAndAngle(2.9431, 180);
  1526. break;
  1527. case 0x02:
  1528. event.emit('130', false)
  1529. utils.changeDistanceAndAngle(2.9431, 180);
  1530. break
  1531. case 0x03:
  1532. event.emit('130', false)
  1533. utils.changeDistanceAndAngle(4.3841, 17);
  1534. break;
  1535. case 0x08:
  1536. // 此处为只有130的笔才有的输出三个up点
  1537. event.emit('130', true)
  1538. isOid4B ? utils.changeDistanceAndAngle(0.0, 180) : utils.changeDistanceAndAngle(2.8, 180);
  1539. break;
  1540. case 0x09:
  1541. // 此处为只有130的笔才有的输出三个up点
  1542. event.emit('130', true)
  1543. isOid4B ? utils.changeDistanceAndAngle(0.0, 180) : utils.changeDistanceAndAngle(2.8, 180);
  1544. // utils.changeDistanceAndAngle(2.8, 180)
  1545. break
  1546. case 0x10:
  1547. // 此处为只有130的笔才有的输出三个up点
  1548. event.emit('130', true)
  1549. utils.changeDistanceAndAngle(2.5, 180);
  1550. break
  1551. default:
  1552. break
  1553. }
  1554. break
  1555. // case 0xe7:
  1556. // switch (lpData[2]) {
  1557. // case 0:
  1558. // isOid4B = false
  1559. // break;
  1560. // case 1:
  1561. // isOid4B = false
  1562. // break
  1563. // case 2:
  1564. // isOid4B = false
  1565. // break
  1566. // case 18:
  1567. // isOid4B = true
  1568. // break
  1569. // default:
  1570. // break;
  1571. // }
  1572. // // console.log(lpData[2], '笔的标识位');
  1573. // break
  1574. case 0xeb:
  1575. var mPen_CurrentCodePointType = "";
  1576. switch (lpData[2]) {
  1577. case 0:
  1578. mPen_CurrentCodePointType = "OID3";
  1579. break;
  1580. case 1:
  1581. mPen_CurrentCodePointType = "OID4";
  1582. break;
  1583. default:
  1584. break;
  1585. }
  1586. emitData({
  1587. cmd: 'getCodePointType',
  1588. data: mPen_CurrentCodePointType
  1589. })
  1590. break;
  1591. // 获取离线数据量
  1592. case 0xc1:
  1593. // console.log(0xc1);
  1594. let offlineDataSize = lpData.slice(2, lpData.length);
  1595. // console.log(lpData, 'lpdata')
  1596. let offlineDataNum = parseInt((((offlineDataSize[3] << 24) & 0xff000000) | ((offlineDataSize[2] << 16) & 0xff0000) | ((offlineDataSize[1] << 8) & 0xff00) | (offlineDataSize[0] & 0xff)) / 10);
  1597. doneFlag.offlineDataNum = offlineDataNum
  1598. emitData({
  1599. cmd: "getOfflineDataNum",
  1600. data: offlineDataNum
  1601. })
  1602. break;
  1603. // 开始获取离线数据
  1604. case 0xc3:
  1605. if (lpData[2] === 0x00) {
  1606. emitData({
  1607. cmd: 'startGetOffline',
  1608. data: true
  1609. })
  1610. } else {
  1611. emitData({
  1612. cmd: "startGetOffline",
  1613. data: false
  1614. })
  1615. }
  1616. break
  1617. case 0xc4:
  1618. doneFlag.gofflineDataProgress = 0
  1619. console.log(doneFlag)
  1620. emitData({
  1621. cmd: 'offLineProgressStop',
  1622. data: lpData[2] === 0x00
  1623. })
  1624. break
  1625. case 0xc5:
  1626. doneFlag.gofflineDataProgress = 0
  1627. doneFlag.getOfflineDataFlag = false
  1628. event.emit('offlineDataFinish', true)
  1629. break
  1630. case 0xcc:
  1631. emitData({
  1632. cmd: "offLineProgressPause",
  1633. data: lpData[2] === 0x00
  1634. })
  1635. break
  1636. case 0xcd:
  1637. emitData({
  1638. cmd: 'offLineProgressContinue',
  1639. data: lpData[2] === 0x00
  1640. })
  1641. break
  1642. case 0xc5:
  1643. doneFlag.finishFlag = lpData[2] === 0x00
  1644. // console.log(doneFlag)
  1645. setTimeout(() => {
  1646. emitData({
  1647. cmd: 'offLineProgressFinish',
  1648. data: lpData[2] === 0x00 ? '100%' : false
  1649. })
  1650. // event.emit('finish', true)
  1651. doneFlag.gofflineDataProgress = 0
  1652. }, 1000)
  1653. break
  1654. case 0xc7:
  1655. emitData({
  1656. cmd: 'offLineDataConfirm',
  1657. data: lpData[2] === 0x00
  1658. })
  1659. break
  1660. case 0xc9:
  1661. emitData({
  1662. cmd: 'offLineDataDelete',
  1663. data: lpData[2] === 0x00
  1664. })
  1665. break
  1666. case 0xdd:
  1667. let id1 = (lpData[2] & 0xff) | ((data[3] << 8) & 0xff00)
  1668. let id2 = (lpData[4] & 0xff) | ((data[5] << 8) & 0xff00)
  1669. emitData({
  1670. cmd: 'customerId',
  1671. data: `${id1}-${id2}`
  1672. })
  1673. break
  1674. // ota升级返回值
  1675. case 0xf5:
  1676. break
  1677. }
  1678. }
  1679. // byte数组转字符串
  1680. /**
  1681. *
  1682. * @param {Array} arr
  1683. * @returns {string}
  1684. */
  1685. const byteToString = (arr) => {
  1686. if (typeof arr === 'string') {
  1687. return arr;
  1688. }
  1689. var str = '',
  1690. _arr = arr;
  1691. for (var i = 0; i < _arr.length; i++) {
  1692. var one = _arr[i].toString(2),
  1693. v = one.match(/^1+?(?=0)/);
  1694. if (v && one.length == 8) {
  1695. var bytesLength = v[0].length;
  1696. var store = _arr[i].toString(2).slice(7 - bytesLength);
  1697. for (var st = 1; st < bytesLength; st++) {
  1698. store += _arr[st + i].toString(2).slice(2);
  1699. }
  1700. str += String.fromCharCode(parseInt(store, 2));
  1701. i += bytesLength - 1;
  1702. } else {
  1703. str += String.fromCharCode(_arr[i]);
  1704. }
  1705. }
  1706. return str;
  1707. }
  1708. /**
  1709. *
  1710. * @param {object} val
  1711. */
  1712. const emitData = (val) => {
  1713. event.emit('penData', val);
  1714. }
  1715. // 字符串转utf-8
  1716. /**
  1717. *
  1718. * @param {string} str
  1719. * @returns {Array}
  1720. */
  1721. const strToUtf8 = (str) => {
  1722. const utf8 = [];
  1723. for (let ii = 0; ii < str.length; ii++) {
  1724. let charCode = str.charCodeAt(ii);
  1725. if (charCode < 0x80) utf8.push(charCode);
  1726. else if (charCode < 0x800) {
  1727. utf8.push(0xc0 | (charCode >> 6), 0x80 | (charCode & 0x3f));
  1728. } else if (charCode < 0xd800 || charCode >= 0xe000) {
  1729. utf8.push(0xe0 | (charCode >> 12), 0x80 | ((charCode >> 6) & 0x3f), 0x80 | (charCode & 0x3f));
  1730. } else {
  1731. ii++;
  1732. charCode = 0x10000 + (((charCode & 0x3ff) << 10) | (str.charCodeAt(ii) & 0x3ff));
  1733. utf8.push(
  1734. 0xf0 | (charCode >> 18),
  1735. 0x80 | ((charCode >> 12) & 0x3f),
  1736. 0x80 | ((charCode >> 6) & 0x3f),
  1737. 0x80 | (charCode & 0x3f),
  1738. );
  1739. }
  1740. }
  1741. //兼容汉字,ASCII码表最大的值为127,大于127的值为特殊字符
  1742. for (let jj = 0; jj < utf8.length; jj++) {
  1743. var code = utf8[jj];
  1744. if (code > 127) {
  1745. utf8[jj] = code - 256;
  1746. }
  1747. }
  1748. return utf8;
  1749. }
  1750. /**
  1751. *
  1752. * @param {number} num
  1753. * @returns {string}
  1754. */
  1755. const MAC = (num) => {
  1756. let num1 = changeData(Math.floor(num / 16));
  1757. let num2 = changeData(num % 16);
  1758. return num1 + num2
  1759. }
  1760. /**
  1761. *
  1762. * @param {number} num
  1763. * @returns {string}
  1764. */
  1765. function changeData(num) {
  1766. let nums = null
  1767. if (num >= 10) {
  1768. switch (num) {
  1769. case 10:
  1770. nums = 'A';
  1771. break;
  1772. case 11:
  1773. nums = 'B'
  1774. break;
  1775. case 12:
  1776. nums = 'C';
  1777. break;
  1778. case 13:
  1779. nums = 'D'
  1780. break
  1781. case 14:
  1782. nums = 'E';
  1783. break
  1784. case 15:
  1785. nums = 'F'
  1786. break
  1787. default:
  1788. break
  1789. }
  1790. } else {
  1791. nums = num + ''
  1792. }
  1793. return nums;
  1794. }
  1795. class Queue {
  1796. constructor() {
  1797. this.dataStore = []
  1798. }
  1799. enqueue(item) {
  1800. this.dataStore.push(item)
  1801. }
  1802. dequeue() {
  1803. return this.dataStore.shift()
  1804. }
  1805. front() {
  1806. return this.dataStore[0]
  1807. }
  1808. back() {
  1809. return this.dataStore[this.dataStore.length - 1]
  1810. }
  1811. getLength() {
  1812. return this.dataStore.length
  1813. }
  1814. empty() {
  1815. return this.dataStore.length === 0
  1816. }
  1817. toString() {
  1818. let retStr = ''
  1819. this.dataStore.forEach((item) => {
  1820. retStr += item + '\n'
  1821. })
  1822. return retStr
  1823. }
  1824. }
  1825. // hexstring转arraybuffer
  1826. /**
  1827. *
  1828. * @param {string} hexStr
  1829. * @returns {ArrayBuffer}
  1830. */
  1831. function hexToArray(hexStr) {
  1832. return new Uint8Array(hexStr.match(/[\da-f]{2}/gi).map(function (h) {
  1833. return parseInt(h, 16)
  1834. })).buffer
  1835. }
  1836. // arraybuffer转hexString
  1837. /**
  1838. *
  1839. * @param {ArrayBuffer} buffer
  1840. * @returns {string}
  1841. */
  1842. const buf2hex = buffer => {
  1843. // buffer is an ArrayBuffer
  1844. return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('')
  1845. }
  1846. /**
  1847. *
  1848. * @param {number} ms
  1849. * @returns {Promise}
  1850. */
  1851. function sleep(ms) {
  1852. return new Promise(resolve => setTimeout(resolve, ms))
  1853. }
  1854. //数字转16进制字符串补0
  1855. function numToHex(num) {
  1856. let str = num.toString(16)
  1857. if (str.length === 1) {
  1858. return '0' + str
  1859. } else {
  1860. return str
  1861. }
  1862. }
  1863. export {
  1864. AllSDK
  1865. }