helper.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. //此文件实现将控制命令封装成协议,具体协议内容请看:
  2. //链接:http://note.youdao.com/noteshare?id=dabda6c613adef7a416bd2625cd770a1
  3. //bcc校验码计算
  4. //arry: 要计算的数组
  5. //返回计算协议中校验位的校验码
  6. function calBcc(arry) {
  7. var bcc = 0;
  8. for (var i = 0; i < arry.length; i++) {
  9. bcc ^= arry[i];
  10. }
  11. return bcc;
  12. }
  13. //数组打印,调试用
  14. function PrintArry(data) {
  15. var str = '';
  16. for (var i = 0; i < data.length; i++) {
  17. str = str + data[i].toString(16).padStart(2, '0');
  18. }
  19. str = str.toUpperCase();
  20. return str;
  21. }
  22. //sn:板卡sn号,stirng
  23. //type:数据类型,数字
  24. //jsonCmd: json命令
  25. //返回值:生成一个Uint8Array,通过websocket发送给板卡
  26. function makeFrame(sn, dataType, jsonCmd) {
  27. var index = 0;
  28. var dataLen = jsonCmd.length;
  29. var frameLen = dataLen + 26;
  30. var outPut = new Uint8Array(frameLen);
  31. outPut[index++] = 0x68;
  32. outPut[index++] = (dataLen & 0xff000000) >> 24;
  33. outPut[index++] = (dataLen & 0x00ff0000) >> 16;
  34. outPut[index++] = (dataLen & 0x0000ff00) >> 8;
  35. outPut[index++] = dataLen & 0x000000ff;
  36. outPut[index++] = 0; //类型为client
  37. //sn号赋值,string转ascii
  38. for (var i = 0; i < sn.length; i++) {
  39. outPut[index++] = sn[i].charCodeAt();
  40. }
  41. outPut[index++] = dataType; //指定数据类型为json
  42. //json string转ascii
  43. for (var i = 0; i < jsonCmd.length; i++) {
  44. outPut[index++] = jsonCmd[i].charCodeAt();
  45. }
  46. var bccBuffer = outPut.slice(1, frameLen - 3 + 1); //忽略协议头和协议尾
  47. outPut[index++] = calBcc(bccBuffer);
  48. outPut[index++] = 0x16;
  49. //console.log("打印数组:%s", PrintArry(outPut));
  50. // return PrintArry(outPut);//C# 转发器专用
  51. return outPut;
  52. }
  53. //{"data":{"keyCode":"25"},"event":"keyCode"}
  54. //触发键盘事件, code表示键盘值
  55. function ExexuteKeyDown(code) {
  56. var jsonObj = { data: { keyCode: code }, event: 'keyCode' };
  57. var json = JSON.stringify(jsonObj);
  58. var sn = 'RK3923C1201900139';
  59. return makeFrame(sn, 0, json);
  60. }
  61. //触发鼠标按下事件,x:x坐标, y:y坐标
  62. function ExexuteMouseDown(x, y) {
  63. var jsonObj = {
  64. data: { action: 0, count: 1, pointerId: 0, x: x, y: y },
  65. event: '0',
  66. };
  67. var json = JSON.stringify(jsonObj);
  68. var sn = 'RK3923C1201900139';
  69. return makeFrame(sn, 0, json);
  70. }
  71. //触发鼠标移动事件,x:x坐标, y:y坐标
  72. function ExexuteMouseMove(x, y) {
  73. var jsonObj = {
  74. data: { action: 2, count: 1, pointerId: 0, x: x, y: y },
  75. event: '2',
  76. };
  77. var json = JSON.stringify(jsonObj);
  78. var sn = 'RK3923C1201900139';
  79. return makeFrame(sn, 0, json);
  80. }
  81. //触发鼠标抬起事件,x:x坐标, y:y坐标
  82. function ExexuteMouseUp(x, y) {
  83. var jsonObj = {
  84. data: { action: 1, count: 1, pointerId: 0, x: x, y: y },
  85. event: '1',
  86. };
  87. var json = JSON.stringify(jsonObj);
  88. var sn = 'RK3923C1201900139';
  89. return makeFrame(sn, 0, json);
  90. }
  91. function ExexuteKeyBoard(keycode) {
  92. // 187:虚拟按键菜单键,3:虚拟按键home键,4:虚拟按键返回键,24:音量增大,25:音量减小
  93. var jsonObj = { data: { keyCode: keycode.toString() }, type: 'keyCode' };
  94. return JSON.stringify(jsonObj);
  95. }
  96. function makeFrameExtend(sn, dataType, body) {
  97. var index = 0;
  98. var dataLen = body.length;
  99. var frameLen = dataLen + 26;
  100. var outPut = new Uint8Array(frameLen);
  101. outPut[index++] = 0x68;
  102. outPut[index++] = (dataLen & 0xff000000) >> 24;
  103. outPut[index++] = (dataLen & 0x00ff0000) >> 16;
  104. outPut[index++] = (dataLen & 0x0000ff00) >> 8;
  105. outPut[index++] = dataLen & 0x000000ff;
  106. outPut[index++] = 0; //类型为client
  107. //sn号赋值,string转ascii
  108. for (var i = 0; i < sn.length; i++) {
  109. outPut[index++] = sn[i].charCodeAt();
  110. }
  111. outPut[index++] = dataType; //指定数据类型为json
  112. //json string转ascii
  113. for (var i = 0; i < body.length; i++) {
  114. outPut[index++] = body[i];
  115. }
  116. var bccBuffer = outPut.slice(1, frameLen - 3 + 1); //忽略协议头和协议尾
  117. outPut[index++] = calBcc(bccBuffer);
  118. outPut[index++] = 0x16;
  119. //var str = PrintArry(outPut);
  120. //console.log("打印数组:%s", PrintArry(outPut));
  121. //return PrintArry(outPut);
  122. return outPut;
  123. }
  124. //根据报文识别屏幕方向, 0横屏,1竖屏
  125. function CheckScreenDirection(data) {
  126. if (data[0] == 0 && data[1] == 0 && data[2] == 0 && data[3] == 1) {
  127. if (data[4] == 1 && data[5] == 1) {
  128. if (data[6] == 1) {
  129. screen = data[7];
  130. return screen;
  131. }
  132. }
  133. }
  134. }
  135. var emptyCount = 0;
  136. function GetEmptyFrame() {
  137. var emptyFrame = new Uint8Array([
  138. 0xff, 0xf1, 0x50, 0x80, 0x12, 0x5f, 0xfc, 0x21, 0x1a, 0xc8, 0x01, 0x27,
  139. 0xfc, 0xc0, 0x00, 0x7e, 0x03, 0x10, 0x40, 0x63, 0x3d, 0x77, 0xe2, 0xb6,
  140. 0xe3, 0x6e, 0x00, 0x37, 0x56, 0x78, 0xeb, 0x70, 0xab, 0xc5, 0x58, 0x08,
  141. 0x59, 0x76, 0xf0, 0x47, 0x3d, 0x23, 0x6c, 0xa6, 0x2b, 0x59, 0x4e, 0x9c,
  142. 0xe0, 0x23, 0x1c, 0x2d, 0x74, 0xcb, 0xe2, 0xfc, 0x77, 0x7d, 0x26, 0x13,
  143. 0xc3, 0x04, 0x40, 0x02, 0x60, 0xf6, 0x03, 0x20, 0x80, 0xc7, 0x9a, 0x11,
  144. 0x0e, 0x9b, 0xda, 0xa0, 0x84, 0x00, 0x2a, 0x95, 0x4a, 0x1e, 0x74, 0xa5,
  145. 0x40, 0x2a, 0xca, 0xa8, 0xca, 0xf0, 0xf2, 0x1e, 0xa8, 0x77, 0x86, 0xa0,
  146. 0x62, 0x8c, 0xb8, 0x5f, 0xa6, 0x67, 0xbf, 0x0d, 0x27, 0x8b, 0xf9, 0x58,
  147. 0xbd, 0xe3, 0x2d, 0x0c, 0xbf, 0x48, 0x3c, 0xfd, 0x70, 0x78, 0x5e, 0xa9,
  148. 0x0b, 0x24, 0x9c, 0x13, 0x98, 0xa4, 0xa0, 0x6e, 0xca, 0xaa, 0x7a, 0x88,
  149. 0xa5, 0x0c, 0x2e, 0x83, 0x59, 0x02, 0x24, 0x01, 0x41, 0x03, 0x92, 0x10,
  150. 0x40, 0x07,
  151. ]);
  152. return emptyFrame;
  153. }
  154. //查询屏幕方向
  155. function GetScreenState() {
  156. var sn = 'RK3923C1201900139';
  157. var outPut = new Uint8Array([0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02]);
  158. return makeFrameExtend(sn, 5, outPut);
  159. }
  160. //生成鉴权报文
  161. function VerifyCode(sn, code) {
  162. var len = code.length + 1;
  163. var codeBuffer = new TextEncoder('utf-8').encode(code); //获取字符串ascii码
  164. var buffer = new Uint8Array(len);
  165. buffer[0] = 0x04;
  166. for (var i = 0; i < codeBuffer.length; i++) {
  167. buffer[i + 1] = codeBuffer[i];
  168. }
  169. return makeFrameExtend(sn, 6, buffer);
  170. }
  171. //
  172. function CheckVerifyCode(data) {
  173. var dataLen = data.length - 26;
  174. var body = data.slice(24, 24 + dataLen);
  175. console.log('打印:' + PrintArry(body));
  176. if (body[3] == 0x03) {
  177. return true;
  178. }
  179. return false;
  180. }
  181. //通道配置
  182. function ConfigChannel(sn, channelName) {
  183. var chanelBuffer = new TextEncoder('utf-8').encode(channelName);
  184. var outPut = [];
  185. outPut.push(0x07);
  186. for (var i = 0; i < chanelBuffer.length; i++) {
  187. outPut.push(chanelBuffer[i]);
  188. }
  189. return makeFrameExtend(sn, 6, outPut);
  190. }
  191. function OpenFileLog(sn) {
  192. var outPut = new Uint8Array([0x01]);
  193. return makeFrameExtend(sn, 7, outPut);
  194. }
  195. //多端登录json 汇报生成
  196. function makeMultiLogin(sn, jsonData) {
  197. var jsonObj = {
  198. type: 3,
  199. data: jsonData,
  200. };
  201. var jsonStr = JSON.stringify(jsonObj);
  202. var outPut = new TextEncoder('utf-8').encode(jsonStr);
  203. return makeFrameExtend(sn, 0x0d, outPut);
  204. }
  205. //统计登录信息
  206. function makeStatistics(sn, jsonData) {
  207. var jsonObj = {
  208. type: 4,
  209. data: jsonData,
  210. };
  211. var jsonStr = JSON.stringify(jsonObj);
  212. var outPut = new TextEncoder('utf-8').encode(jsonStr);
  213. return makeFrameExtend(sn, 0x0d, outPut);
  214. }
  215. //多端登录数据解析
  216. function checkMultiLoginInfo(input) {
  217. var dataLen = input.length - 26; //得到json 长度
  218. var jsonHex = input.slice(24, 24 + dataLen); //截取json hex二进制数据
  219. var jsonStr = new TextDecoder('utf-8').decode(jsonHex);
  220. console.log('取得json 字符串:' + jsonStr);
  221. var jsonObj = JSON.parse(jsonStr);
  222. return jsonObj;
  223. }
  224. //切换清晰度
  225. function makeSharpness(level) {
  226. var sn = 'RK3923C1201900139';
  227. var jsonObj = {
  228. type: 2,
  229. data: { definition: level, clientType: 'h5', sceneType: 'cloudPhone' },
  230. };
  231. var jsonStr = JSON.stringify(jsonObj);
  232. var outPut = new TextEncoder('utf-8').encode(jsonStr);
  233. return makeFrameExtend(sn, 0xd, outPut);
  234. }
  235. //I 帧请求报文生成
  236. function RequestIFrame() {
  237. var sn = 'RK3923C1201900139';
  238. var outPut = new Uint8Array([0x20]);
  239. return makeFrameExtend(sn, 6, outPut);
  240. }