component.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. !function(n){"use strict";function d(n,t){var r=(65535&n)+(65535&t);return(n>>16)+(t>>16)+(r>>16)<<16|65535&r}function f(n,t,r,e,o,u){return d((u=d(d(t,n),d(e,u)))<<o|u>>>32-o,r)}function l(n,t,r,e,o,u,c){return f(t&r|~t&e,n,t,o,u,c)}function g(n,t,r,e,o,u,c){return f(t&e|r&~e,n,t,o,u,c)}function v(n,t,r,e,o,u,c){return f(t^r^e,n,t,o,u,c)}function m(n,t,r,e,o,u,c){return f(r^(t|~e),n,t,o,u,c)}function c(n,t){var r,e,o,u;n[t>>5]|=128<<t%32,n[14+(t+64>>>9<<4)]=t;for(var c=1732584193,f=-271733879,i=-1732584194,a=271733878,h=0;h<n.length;h+=16)c=l(r=c,e=f,o=i,u=a,n[h],7,-680876936),a=l(a,c,f,i,n[h+1],12,-389564586),i=l(i,a,c,f,n[h+2],17,606105819),f=l(f,i,a,c,n[h+3],22,-1044525330),c=l(c,f,i,a,n[h+4],7,-176418897),a=l(a,c,f,i,n[h+5],12,1200080426),i=l(i,a,c,f,n[h+6],17,-1473231341),f=l(f,i,a,c,n[h+7],22,-45705983),c=l(c,f,i,a,n[h+8],7,1770035416),a=l(a,c,f,i,n[h+9],12,-1958414417),i=l(i,a,c,f,n[h+10],17,-42063),f=l(f,i,a,c,n[h+11],22,-1990404162),c=l(c,f,i,a,n[h+12],7,1804603682),a=l(a,c,f,i,n[h+13],12,-40341101),i=l(i,a,c,f,n[h+14],17,-1502002290),c=g(c,f=l(f,i,a,c,n[h+15],22,1236535329),i,a,n[h+1],5,-165796510),a=g(a,c,f,i,n[h+6],9,-1069501632),i=g(i,a,c,f,n[h+11],14,643717713),f=g(f,i,a,c,n[h],20,-373897302),c=g(c,f,i,a,n[h+5],5,-701558691),a=g(a,c,f,i,n[h+10],9,38016083),i=g(i,a,c,f,n[h+15],14,-660478335),f=g(f,i,a,c,n[h+4],20,-405537848),c=g(c,f,i,a,n[h+9],5,568446438),a=g(a,c,f,i,n[h+14],9,-1019803690),i=g(i,a,c,f,n[h+3],14,-187363961),f=g(f,i,a,c,n[h+8],20,1163531501),c=g(c,f,i,a,n[h+13],5,-1444681467),a=g(a,c,f,i,n[h+2],9,-51403784),i=g(i,a,c,f,n[h+7],14,1735328473),c=v(c,f=g(f,i,a,c,n[h+12],20,-1926607734),i,a,n[h+5],4,-378558),a=v(a,c,f,i,n[h+8],11,-2022574463),i=v(i,a,c,f,n[h+11],16,1839030562),f=v(f,i,a,c,n[h+14],23,-35309556),c=v(c,f,i,a,n[h+1],4,-1530992060),a=v(a,c,f,i,n[h+4],11,1272893353),i=v(i,a,c,f,n[h+7],16,-155497632),f=v(f,i,a,c,n[h+10],23,-1094730640),c=v(c,f,i,a,n[h+13],4,681279174),a=v(a,c,f,i,n[h],11,-358537222),i=v(i,a,c,f,n[h+3],16,-722521979),f=v(f,i,a,c,n[h+6],23,76029189),c=v(c,f,i,a,n[h+9],4,-640364487),a=v(a,c,f,i,n[h+12],11,-421815835),i=v(i,a,c,f,n[h+15],16,530742520),c=m(c,f=v(f,i,a,c,n[h+2],23,-995338651),i,a,n[h],6,-198630844),a=m(a,c,f,i,n[h+7],10,1126891415),i=m(i,a,c,f,n[h+14],15,-1416354905),f=m(f,i,a,c,n[h+5],21,-57434055),c=m(c,f,i,a,n[h+12],6,1700485571),a=m(a,c,f,i,n[h+3],10,-1894986606),i=m(i,a,c,f,n[h+10],15,-1051523),f=m(f,i,a,c,n[h+1],21,-2054922799),c=m(c,f,i,a,n[h+8],6,1873313359),a=m(a,c,f,i,n[h+15],10,-30611744),i=m(i,a,c,f,n[h+6],15,-1560198380),f=m(f,i,a,c,n[h+13],21,1309151649),c=m(c,f,i,a,n[h+4],6,-145523070),a=m(a,c,f,i,n[h+11],10,-1120210379),i=m(i,a,c,f,n[h+2],15,718787259),f=m(f,i,a,c,n[h+9],21,-343485551),c=d(c,r),f=d(f,e),i=d(i,o),a=d(a,u);return[c,f,i,a]}function i(n){for(var t="",r=32*n.length,e=0;e<r;e+=8)t+=String.fromCharCode(n[e>>5]>>>e%32&255);return t}function a(n){var t=[];for(t[(n.length>>2)-1]=void 0,e=0;e<t.length;e+=1)t[e]=0;for(var r=8*n.length,e=0;e<r;e+=8)t[e>>5]|=(255&n.charCodeAt(e/8))<<e%32;return t}function e(n){for(var t,r="0123456789abcdef",e="",o=0;o<n.length;o+=1)t=n.charCodeAt(o),e+=r.charAt(t>>>4&15)+r.charAt(15&t);return e}function r(n){return unescape(encodeURIComponent(n))}function o(n){return i(c(a(n=r(n)),8*n.length))}function u(n,t){return function(n,t){var r,e=a(n),o=[],u=[];for(o[15]=u[15]=void 0,16<e.length&&(e=c(e,8*n.length)),r=0;r<16;r+=1)o[r]=909522486^e[r],u[r]=1549556828^e[r];return t=c(o.concat(a(t)),512+8*t.length),i(c(u.concat(t),640))}(r(n),r(t))}function t(n,t,r){return t?r?u(t,n):e(u(t,n)):r?o(n):e(o(n))}"function"==typeof define&&define.amd?define(function(){return t}):"object"==typeof module&&module.exports?module.exports=t:n.md5=t}(this);
  2. var md5=this.md5;
  3. function isServerId(clientId){
  4. return JSON.parse(component.getCompMqttClientIdList()).indexOf(clientId) > -1
  5. }
  6. function getPkDn(clientId){
  7. var arr=clientId.split("_");
  8. return {
  9. pk:arr[0],
  10. dn:arr[1]
  11. };
  12. }
  13. function auth(head,type,payload){
  14. if(isServerId(payload.clientid)){
  15. return {
  16. type:"serverAuth",
  17. data:{
  18. productKey:"pd",
  19. deviceName:"dn",
  20. }
  21. };
  22. }
  23. var arr= payload.clientid.split("_");
  24. if(arr.length<3){
  25. throw new Error("incorrect clientid:" + payload.clientid);
  26. }
  27. var pk=arr[0];
  28. var dn=arr[1];
  29. var model=arr[2];
  30. var pwd=md5("xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU"+payload.clientid);
  31. if(pwd!=payload.password){
  32. throw new Error("incorrect password:" + pwd);
  33. }
  34. return {
  35. type:"register",
  36. data:{
  37. productKey:pk,
  38. deviceName:dn,
  39. model:model
  40. }
  41. };
  42. }
  43. function acl(head,type,payload){
  44. var _topic = payload.topic;
  45. if(isServerId(payload.clientid)){
  46. return {
  47. type: "acl",
  48. data:{
  49. productKey:"pd",
  50. deviceName:"dn",
  51. }
  52. };
  53. }
  54. // 客户端订阅处理
  55. if (/^\/sys\/.+\/.+\/c\/#/i.test(_topic)) {
  56. return subscribe(head,type,payload);
  57. }
  58. // 服务端订阅处理
  59. if (/^\/sys\/.+\/.+\/s\/.*/i.test(_topic)) {
  60. return subscribe(head,type,payload);
  61. }
  62. }
  63. function register(head,type,payload){
  64. var auth= payload;
  65. var arr= auth.clientid.split("_");
  66. if(arr.length<3){
  67. throw new Error("incorrect clientid:" + auth.clientid);
  68. }
  69. var pk=arr[0];
  70. var dn=arr[1];
  71. var model=arr[2];
  72. var pwd=md5("xdkKUymrEGSCYWswqCvSPyRSFvH5j7CU"+auth.clientid);
  73. if(pwd!=auth.password){
  74. throw new Error("incorrect password:" + pwd);
  75. }
  76. return {
  77. type:"register",
  78. data:{
  79. productKey:pk,
  80. deviceName:dn,
  81. model:model
  82. }
  83. };
  84. }
  85. function subRegister(topic,parent, payload){
  86. if(!topic){
  87. throw new Error("topic is blank")
  88. }
  89. var params= payload.params;
  90. var reply=
  91. {
  92. productKey: parent.productKey,
  93. deviceName: parent.deviceName,
  94. mid: "0",
  95. content:{
  96. topic: topic.replace("/s/","/c/")+"_reply",
  97. payload: JSON.stringify({
  98. id: payload.id,
  99. code: 0,
  100. data: {
  101. "productKey":params.productKey,
  102. "deviceName":params.deviceName
  103. }
  104. })
  105. }
  106. };
  107. return {
  108. type:"register",
  109. data:{
  110. productKey:parent.productKey,
  111. deviceName:parent.deviceName,
  112. subDevices:[{
  113. productKey:params.productKey,
  114. deviceName:params.deviceName,
  115. model:params.model
  116. }]
  117. },
  118. action:{
  119. type:"ack",
  120. content:JSON.stringify(reply)
  121. }
  122. };
  123. }
  124. function disconnect(head,type,payload){
  125. var clientId = payload.clientid
  126. var device=getPkDn(clientId);
  127. return {
  128. type:"state",
  129. data:{
  130. productKey:device.pk,
  131. deviceName:device.dn,
  132. state:"offline"
  133. }
  134. }
  135. }
  136. function connect(head,type,payload) {
  137. var clientId = payload.clientid
  138. var device = getPkDn(clientId);
  139. return {
  140. type: "state",
  141. data: {
  142. productKey: device.pk,
  143. deviceName: device.dn,
  144. state: "online"
  145. }
  146. }
  147. }
  148. function unsubscribe(head,type,payload){
  149. var topic = payload.topic;
  150. if(isServerId(payload.clientid)){
  151. return {
  152. type: "acl",
  153. data:{
  154. productKey:"pd",
  155. deviceName:"dn",
  156. }
  157. };
  158. }
  159. var arr= topic.split('/');
  160. if(arr.length<6){
  161. throw new Error("incorrect topic: "+topic)
  162. }
  163. var pk=arr[2];
  164. var dn=arr[3];
  165. return {
  166. type:"state",
  167. data:{
  168. productKey: pk,
  169. deviceName: dn,
  170. state:"offline"
  171. }
  172. }
  173. }
  174. function subscribe(head,type,payload){
  175. var topic = payload.topic;
  176. if(isServerId(payload.clientid)){
  177. return {
  178. type: "acl",
  179. data:{
  180. productKey:"pd",
  181. deviceName:"dn",
  182. }
  183. };
  184. }
  185. var arr= topic.split('/');
  186. if(arr.length<6){
  187. throw new Error("incorrect topic: "+topic)
  188. }
  189. var pk=arr[2];
  190. var dn=arr[3];
  191. return {
  192. type: "state",
  193. data: {
  194. productKey: pk,
  195. deviceName: dn,
  196. state: "online"
  197. }
  198. }
  199. }
  200. var messageHandler = {
  201. "/sys/client/connected":connect,
  202. "/sys/client/disconnected":disconnect,
  203. "/mqtt/auth":auth,
  204. "/mqtt/acl":acl,
  205. "/sys/session/subscribed":subscribe,
  206. "/sys/session/unsubscribed":unsubscribe
  207. }
  208. //必须提供onReceive方法
  209. this.onReceive=function(head,type,payload){
  210. payload=JSON.parse(payload);
  211. var result = {};
  212. var topic = head.topic;
  213. if(!topic) {
  214. return result;
  215. }
  216. var fun = messageHandler[topic];
  217. if(fun){
  218. return fun(head,type,payload)
  219. }else{
  220. var arr= topic.split('/');
  221. if(arr.length<6){
  222. throw new Error("incorrect topic: "+topic)
  223. }
  224. var pk=arr[2];
  225. var dn=arr[3];
  226. //子设备注册
  227. if(topic.endsWith('/register')){
  228. return subRegister(topic,{productKey:pk,deviceName:dn}, payload);
  229. }
  230. //数据上报
  231. var reply=
  232. {
  233. productKey:pk,
  234. deviceName:dn,
  235. mid:payload.id,
  236. content:{
  237. topic:topic.replace("/s/","/c/")+"_reply",
  238. payload:JSON.stringify({
  239. id:payload.id,
  240. method: payload.method+"_reply",
  241. code:0,
  242. })
  243. }
  244. };
  245. var action={};
  246. if(!topic.endsWith("_reply")){
  247. //需要回复的消息
  248. action={
  249. type:"ack",
  250. content:JSON.stringify(reply)
  251. }
  252. }
  253. return {
  254. type:"report",
  255. data:{
  256. productKey:pk,
  257. deviceName:dn,
  258. mid:payload.id,
  259. content:{
  260. topic:topic,
  261. payload:payload
  262. }
  263. },
  264. action:action
  265. }
  266. }
  267. return result;
  268. }
  269. this.onRegistered=function(regInfo,result){
  270. }