util.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. const SERVICE_TYPE = "_notice_service._tcp.";
  2. const FACE_DERECT = "face_detect";
  3. const FACE_RECOGNIZE = "face_recognize";
  4. const FACE_ENROll = "face_enroll";
  5. const STOP_STREAM = "stop_stream";
  6. const GET_ID = "get_id";
  7. const FACE_DELETE = "face_delete";
  8. const DELETE_ALL = "delete_all";
  9. const ON_STATUS = 1;
  10. const OFF_STATUS = 0;
  11. const HTTP_STR = "http://null:80/control";
  12. const HTTP_STATUS = "http://null:80/status";
  13. const HTTP_STREAM = "http://null:81/stream";
  14. const FRAME_CTRL_POSITION_ENCRYPTED = 0;
  15. const FRAME_CTRL_POSITION_CHECKSUM = 1;
  16. const FRAME_CTRL_POSITION_DATA_DIRECTION = 2;
  17. const FRAME_CTRL_POSITION_REQUIRE_ACK = 3;
  18. const FRAME_CTRL_POSITION_FRAG = 4;
  19. const DIRECTION_OUTPUT = 0;
  20. const DIRECTION_INPUT = 1;
  21. const AES_BASE_IV = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
  22. const NEG_SET_SEC_TOTAL_LEN = 0x00;
  23. const NEG_SET_SEC_ALL_DATA = 0x01;
  24. const PACKAGE_VALUE = 0x01;
  25. const SUBTYPE_NEG = 0x00;
  26. const SUBTYPE_WIFI_MODEl = 0x02;
  27. const SUBTYPE_END = 0x03;
  28. const PACKAGE_CONTROL_VALUE = 0x00;
  29. const SUBTYPE_WIFI_NEG = 0x09;
  30. const SUBTYPE_SET_SSID = 0x2;
  31. const SUBTYPE_SET_PWD = 0x3;
  32. const SUBTYPE_WIFI_LIST_NEG = 17;
  33. const SUBTYPE_NEGOTIATION_NEG = 0;
  34. const SUBTYPE_CUSTOM_DATA = 0x13;
  35. var DH_P = "cf5cf5c38419a724957ff5dd323b9c45c3cdd261eb740f69aa94b8bb1a5c96409153bd76b24222d03274e4725a5406092e9e82e9135c643cae98132b0d95f7d65347c68afc1e677da90e51bbab5f5cf429c291b4ba39c6b2dc5e8c7231e46aa7728e87664532cdf547be20c9a3fa8342be6e34371a27c06f7dc0edddd2f86373";
  36. var DH_G = "02";
  37. const descSucListEN = ["Bluetooth connecting...", "Bluetooth connection successful", "Device information is successfully obtained", "Attribute information is successfully obtained", "Send configuration information...", "Configuration information sent successfully", "Connection successfully"];
  38. const descFailListEN = ["Bluetooth connection failed", "Device information acquisition failed", "Attribute information acquisition failed", "Configuration information sent failed", "Distribution network failed"];
  39. const descSucList = ["蓝牙连接...", "蓝牙连接成功", "设备信息已成功获取", "属性信息已成功获取", "发送配置信息...", "成功发送配置信息", "成功连接"];
  40. const descFailList = ["蓝牙连接失败", "设备信息获取失败", "属性信息获取失败", "配置信息发送失败", "网络配置失败","蓝牙异常断开"];
  41. const successList = {
  42. "0": "NULL",
  43. "1": "STA",
  44. "2": "SoftAP",
  45. "3": "SoftAP & STA"
  46. };
  47. const failList = {
  48. "0": "sequence error",
  49. "1": "checksum error",
  50. "2": "decrypt error",
  51. "3": "encrypt error",
  52. "4": "init security error",
  53. "5": "dh malloc error",
  54. "6": "dh param error",
  55. "7": "read param error",
  56. "8": "make public error"
  57. };
  58. var CRC_TB = [
  59. 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
  60. 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
  61. 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
  62. 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
  63. 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
  64. 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
  65. 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
  66. 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
  67. 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
  68. 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
  69. 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
  70. 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
  71. 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
  72. 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
  73. 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
  74. 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
  75. ];
  76. //转16进制
  77. const ab2hex = buffer => {
  78. var hexArr = Array.prototype.map.call(
  79. new Uint8Array(buffer),
  80. function(bit) {
  81. return ('00' + bit.toString(16)).slice(-2)
  82. }
  83. )
  84. return hexArr;
  85. }
  86. //16进制转字符串
  87. const hexCharCodeToStr = hexCharCodeStr => {
  88. var trimedStr = hexCharCodeStr.trim();
  89. var rawStr =
  90. trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr;
  91. var len = rawStr.length;
  92. if (len % 2 !== 0) {
  93. alert("Illegal Format ASCII Code!");
  94. return "";
  95. }
  96. var curCharCode;
  97. var resultStr = [];
  98. for (var i = 0; i < len; i = i + 2) {
  99. curCharCode = parseInt(rawStr.substr(i, 2), 16); // ASCII Code Value
  100. resultStr.push(String.fromCharCode(curCharCode));
  101. }
  102. return resultStr.join("");
  103. }
  104. //过滤名称
  105. const filterDevice = (devices, filterName) => {
  106. var self = this,
  107. list = [];
  108. for (var i = 0; i < devices.length; i++) {
  109. var device = devices[i];
  110. var re = new RegExp("^(" + filterName + ")");
  111. if (re.test(device["name"])) {
  112. list.push(device);
  113. }
  114. }
  115. return list;
  116. }
  117. //获去type
  118. const getType = (pkgType, subType) => {
  119. return (subType << 2) | pkgType;
  120. }
  121. //unit8Arry转数组
  122. const uint8ArrayToArray = uint8Array => {
  123. var array = [];
  124. for (var i = 0; i < uint8Array.byteLength; i++) {
  125. array[i] = uint8Array[i];
  126. }
  127. return array;
  128. }
  129. //16进制转二进制数组
  130. const hexToBinArray = str => {
  131. var dec = parseInt(str, 16),
  132. bin = dec.toString(2),
  133. len = bin.length;
  134. if (len < 8) {
  135. var diff = 8 - len,
  136. zeros = "";
  137. for (var i = 0; i < diff; i++) {
  138. zeros += "0";
  139. }
  140. bin = zeros + bin;
  141. }
  142. return bin.split("");
  143. }
  144. //16进制转数组
  145. const hexByArray = str => {
  146. var arr = [];
  147. if (str.length % 2 != 0) {
  148. str = "0" + str;
  149. }
  150. for (var i = 0; i < str.length; i += 2) {
  151. arr.push(str.substring(i, i + 2))
  152. }
  153. return arr;
  154. }
  155. //16进制转整形数组
  156. const hexByInt = str => {
  157. var arr = [];
  158. if (str.length % 2 != 0) {
  159. str = "0" + str;
  160. }
  161. for (var i = 0; i < str.length; i += 2) {
  162. arr.push(parseInt(str.substring(i, i + 2), 16))
  163. }
  164. return arr;
  165. }
  166. //排序
  167. const sortBy = (attr, rev) => {
  168. //第二个参数没有传递 默认升序排列
  169. if (rev == undefined) {
  170. rev = 1;
  171. } else {
  172. rev = (rev) ? 1 : -1;
  173. }
  174. return function(a, b) {
  175. a = a[attr];
  176. b = b[attr];
  177. if (a < b) {
  178. return rev * -1;
  179. } else if (a > b) {
  180. return rev * 1;
  181. }
  182. return 0;
  183. }
  184. }
  185. //判断非空
  186. const _isEmpty = str => {
  187. if (str === "" || str === null || str === undefined || str === "null" || str === "undefined") {
  188. return true;
  189. } else {
  190. return false;
  191. }
  192. }
  193. //设置配网失败背景色
  194. const setFailBg = () => {
  195. wx.setNavigationBarColor({
  196. frontColor: "#ffffff",
  197. backgroundColor: '#737d89',
  198. })
  199. }
  200. //设置配网成功背景色
  201. const setSucBg = () => {
  202. wx.setNavigationBarColor({
  203. frontColor: "#ffffff",
  204. backgroundColor: '#4d9efb',
  205. })
  206. }
  207. //组装数据格式
  208. const writeData = (type, subType, frameCtl, seq, len, data) => {
  209. var value = [],type = getType(type, subType);
  210. value.push(type);
  211. value.push(frameCtl);
  212. value.push(seq);
  213. value.push(len);
  214. if (!_isEmpty(data)) {
  215. value = value.concat(data);
  216. }
  217. return value;
  218. }
  219. //是否分包
  220. const isSubcontractor = (data, checksum, sequence, encrypt) => {
  221. var len = 0,
  222. lenData = [],
  223. laveData = [],
  224. flag = false;
  225. var total = data.length;
  226. if (total > 16) {
  227. if (checksum) {
  228. lenData = data.slice(0, 12);
  229. laveData = data.slice(12);
  230. } else {
  231. lenData = data.slice(0, 14);
  232. laveData = data.slice(14);
  233. }
  234. var len1 = (total >> 8) & 0xff;
  235. var len2 = total & 0xff;
  236. lenData.splice(0, 0, len1);
  237. lenData.splice(0, 0, len2);
  238. len = lenData.length;
  239. flag = true;
  240. } else {
  241. lenData = data;
  242. len = lenData.length;
  243. }
  244. if (checksum) {
  245. lenData = assemblyChecksum(lenData, len, sequence);
  246. }
  247. return {
  248. "len": len,
  249. "lenData": lenData,
  250. "laveData": laveData,
  251. "flag": flag
  252. }
  253. }
  254. const assemblyChecksum = (list, len, sequence, encrypt) => {
  255. var checkData = [];
  256. checkData.push(sequence);
  257. checkData.push(len);
  258. checkData = checkData.concat(list);
  259. var crc = caluCRC(0, checkData);
  260. var checksumByte1 = crc & 0xff;
  261. var checksumByte2 = (crc >> 8) & 0xff;
  262. list.push(checksumByte1);
  263. list.push(checksumByte2);
  264. return list;
  265. }
  266. //加密发送的数据
  267. const encrypt = (aesjs, md5Key, sequence, data, checksum) => {
  268. var iv = generateAESIV(sequence),
  269. sumArr = [],
  270. list = [];
  271. if (checksum) {
  272. var len = data.length - 2;
  273. list = data.slice(0, len);
  274. sumArr = data.slice(len);
  275. } else {
  276. list = data;
  277. }
  278. var encryptData = uint8ArrayToArray(blueAesEncrypt(aesjs, md5Key, iv, new Uint8Array(list)));
  279. return encryptData.concat(sumArr);
  280. }
  281. //DH加密
  282. const blueDH = (p, g, crypto) => {
  283. var client = crypto.createDiffieHellman(p, "hex", g, "hex");
  284. var clientKey = client.generateKeys();
  285. //var clientSecret = client.computeSecret(server.getPublicKey());
  286. return client;
  287. }
  288. //md5加密
  289. const blueMd5 = (md5, key) => {
  290. var arr = md5.array(key);
  291. return arr;
  292. }
  293. // aes加密
  294. const blueAesEncrypt = (aesjs, mdKey, iv, bytes) => {
  295. var aesOfb = new aesjs.ModeOfOperation.ofb(mdKey, iv);
  296. var encryptedBytes = aesOfb.encrypt(bytes);
  297. return encryptedBytes;
  298. }
  299. //aes解密
  300. const blueAesDecrypt = (aesjs, mdKey, iv, bytes) => {
  301. var aesOfb = new aesjs.ModeOfOperation.ofb(mdKey, iv);
  302. var decryptedBytes = aesOfb.decrypt(bytes);
  303. return decryptedBytes;
  304. }
  305. //获取Frame Control
  306. const getFrameCTRLValue = (encrypted, checksum, direction, requireAck, frag) => {
  307. var frame = 0;
  308. if (encrypted) {
  309. frame = frame | (1 << FRAME_CTRL_POSITION_ENCRYPTED);
  310. }
  311. if (checksum) {
  312. frame = frame | (1 << FRAME_CTRL_POSITION_CHECKSUM);
  313. }
  314. if (direction == DIRECTION_INPUT) {
  315. frame = frame | (1 << FRAME_CTRL_POSITION_DATA_DIRECTION);
  316. }
  317. if (requireAck) {
  318. frame = frame | (1 << FRAME_CTRL_POSITION_REQUIRE_ACK);
  319. }
  320. if (frag) {
  321. frame = frame | (1 << FRAME_CTRL_POSITION_FRAG);
  322. }
  323. return frame;
  324. }
  325. //获取aes iv
  326. const generateAESIV = sequence => {
  327. var result = [];
  328. for (var i = 0; i < 16; i++) {
  329. if (i == 0) {
  330. result[0] = sequence;
  331. } else {
  332. result[i] = AES_BASE_IV[i];
  333. }
  334. }
  335. return result;
  336. }
  337. //计算CRC值
  338. const caluCRC = (crc, pByte) => {
  339. crc = (~crc) & 0xffff;
  340. for (var i in pByte) {
  341. crc = CRC_TB[((crc & 0xffff) >> 8) ^ (pByte[i] & 0xff)] ^ ((crc & 0xffff) << 8);
  342. }
  343. return (~crc) & 0xffff;
  344. }
  345. const send = (method, url, data, suc, error) => {
  346. console.log(url);
  347. wx.request({
  348. url: url,
  349. data: data,
  350. header: {
  351. 'Content-Type': 'application/json'
  352. },
  353. method: method,
  354. success: function(res) {
  355. if (!_isEmpty(suc)) {
  356. suc(res.data);
  357. }
  358. },
  359. fail: function(res) {
  360. if (!_isEmpty(error)) {
  361. error();
  362. }
  363. }
  364. })
  365. }
  366. const showLoading = msg => {
  367. wx.hideLoading();
  368. wx.showLoading({
  369. title: msg,
  370. mask: true
  371. });
  372. }
  373. const showToast = msg => {
  374. wx.showToast({
  375. title: msg,
  376. icon: 'none',
  377. duration: 2000
  378. })
  379. }
  380. module.exports = {
  381. _isEmpty: _isEmpty,
  382. send: send,
  383. SERVICE_TYPE: SERVICE_TYPE,
  384. FACE_DERECT: FACE_DERECT,
  385. FACE_RECOGNIZE: FACE_RECOGNIZE,
  386. FACE_ENROll: FACE_ENROll,
  387. STOP_STREAM: STOP_STREAM,
  388. GET_ID: GET_ID,
  389. ON_STATUS: ON_STATUS,
  390. OFF_STATUS: OFF_STATUS,
  391. HTTP_STR: HTTP_STR,
  392. HTTP_STATUS: HTTP_STATUS,
  393. HTTP_STREAM: HTTP_STREAM,
  394. FACE_DELETE: FACE_DELETE,
  395. DELETE_ALL: DELETE_ALL,
  396. ab2hex: ab2hex,
  397. hexCharCodeToStr: hexCharCodeToStr,
  398. filterDevice: filterDevice,
  399. getType: getType,
  400. hexToBinArray: hexToBinArray,
  401. hexByArray: hexByArray,
  402. hexByInt: hexByInt,
  403. sortBy: sortBy,
  404. setFailBg: setFailBg,
  405. setSucBg: setSucBg,
  406. writeData: writeData,
  407. isSubcontractor: isSubcontractor,
  408. getFrameCTRLValue: getFrameCTRLValue,
  409. blueDH: blueDH,
  410. blueMd5: blueMd5,
  411. blueAesEncrypt: blueAesEncrypt,
  412. blueAesDecrypt: blueAesDecrypt,
  413. uint8ArrayToArray: uint8ArrayToArray,
  414. generateAESIV: generateAESIV,
  415. caluCRC: caluCRC,
  416. encrypt: encrypt,
  417. DH_P: DH_P,
  418. DH_G: DH_G,
  419. DIRECTION_OUTPUT: DIRECTION_OUTPUT,
  420. DIRECTION_INPUT: DIRECTION_INPUT,
  421. NEG_SET_SEC_TOTAL_LEN: NEG_SET_SEC_TOTAL_LEN,
  422. NEG_SET_SEC_ALL_DATA: NEG_SET_SEC_ALL_DATA,
  423. PACKAGE_VALUE: PACKAGE_VALUE,
  424. SUBTYPE_NEG: SUBTYPE_NEG,
  425. PACKAGE_CONTROL_VALUE: PACKAGE_CONTROL_VALUE,
  426. SUBTYPE_WIFI_NEG: SUBTYPE_WIFI_NEG,
  427. SUBTYPE_WIFI_LIST_NEG: SUBTYPE_WIFI_LIST_NEG,
  428. SUBTYPE_NEGOTIATION_NEG: SUBTYPE_NEGOTIATION_NEG,
  429. SUBTYPE_WIFI_MODEl: SUBTYPE_WIFI_MODEl,
  430. SUBTYPE_SET_SSID: SUBTYPE_SET_SSID,
  431. SUBTYPE_SET_PWD: SUBTYPE_SET_PWD,
  432. SUBTYPE_END: SUBTYPE_END,
  433. SUBTYPE_CUSTOM_DATA: SUBTYPE_CUSTOM_DATA,
  434. descSucList: descSucList,
  435. descFailList: descFailList,
  436. successList: successList,
  437. failList: failList,
  438. showToast: showToast,
  439. showLoading: showLoading
  440. }