index.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. <template>
  2. <view class="page">
  3. <view>uni-app本地图片压缩+上传</view>
  4. <view class="photo-box ">
  5. <button type="primary" @tap="clickImg()">点击上传</button>
  6. <view v-if="image">
  7. <img :src="image" mode="aspectFit">
  8. </view>
  9. <view class="photo-txt">{{'压缩后图片地址: ' + imageInfo.target}}</view>
  10. <view class="photo-txt">{{'压缩后图片size: '+ imageInfo.size}}</view>
  11. </view>
  12. <view>
  13. MQTT
  14. <button @click="mqtt('connect')">开启连接</button>
  15. <button @click="mqtt('subscribe')">订阅主题</button>
  16. <button @click="mqtt('unsubscribe')">取消订阅主题</button>
  17. <button @click="mqtt('send')">发送数据</button>
  18. <button @click="mqtt('close')">关闭连接</button>
  19. <button @click="mqtt('isConnected')">是否已连接</button>
  20. </view>
  21. <button @click="message = []">清空屏幕消息</button>
  22. <view class="msg">
  23. <div v-for="(item,index) in message" :key="index">{{JSON.stringify(item)}}</div>
  24. </view>
  25. </view>
  26. </template>
  27. <script>
  28. const _MQTT = uni.requireNativePlugin("zad-socket-mqtt");
  29. function str2asc(str)
  30. {
  31. var n = UnicodeToAnsi(str.charCodeAt(0));
  32. var s = n.toString(16);
  33. return str.toUpperCase();
  34. }
  35. function urlEncode(str)
  36. {
  37. var ret = "";
  38. var strSpecial = "!\"#$%&’()*+,/:;<=>?[]^`{|}~%";
  39. var tt = "";
  40. for(var i = 0; i < str.length; i++)
  41. {
  42. var chr = str.charAt(i);
  43. var c = str2asc(chr);
  44. tt += chr + ":" + c + "n";
  45. if (parseInt("0x" + c) > 0x7f)
  46. {
  47. ret += "%" + c.slice(0,2) + "%" + c.slice(-2);
  48. }
  49. else
  50. {
  51. if (chr == " ")
  52. ret += "+";
  53. else if (strSpecial.indexOf(chr) != -1)
  54. ret += "%" + c.toString(16);
  55. else
  56. ret += chr;
  57. }
  58. }
  59. return ret;
  60. }
  61. import base64 from "@/common/base64.js"
  62. import md5 from "@/common/hex_md5.js"
  63. // import {testToken, getToken} from "@/common/token"
  64. // // import { MyMqttManager } from '@/utssdk/mqtt/index.uts';
  65. // import { MyMqttManager } from '@/uni_modules/flight-mqtt';
  66. import {Onenet} from "@/common/onenet"
  67. const client = new Onenet("LTt3E9vn93", "865522079861164", "jdMvXePFKd3ZBZFn19GnsZ1pww3tbVFtyePlyXH3Ex0=", "Du4Q3aT7WSY4L5jJzG5i7wPLpvWEu18YLQmhuOS0idOT/Wk+UMBGWhz+djms87iHA5KaRh7ylOsSBjhbjzZlhg==","139522");
  68. client.connectMqttServer()
  69. export default {
  70. data() {
  71. return {
  72. image:"",
  73. imageInfo:{},
  74. message: [{ code: 200, data: 'Socket 插件测试' }],
  75. productId: "123",
  76. deviceName: "321",
  77. scret: "TVdiUWx0Ym12cVlRUEx1QUpRMnZlTzhaQzdHUU1yeFo=",
  78. version: "2018-10-31"
  79. };
  80. },
  81. onLoad() {
  82. setInterval(()=>{
  83. client.publishRealData(()=>{
  84. return {
  85. ConveyorBeltSwitch: "1",
  86. Voltage: 12.312
  87. }
  88. })
  89. }, 10000)
  90. },
  91. methods:{
  92. clickImg(){ //选择图片
  93. let _this=this
  94. uni.chooseImage({
  95. count: 1,
  96. sizeType:['compressed'],
  97. success(res) {
  98. // _this.uploadFile(res.tempFilePaths[0]) // 上传图片到服务器
  99. console.log("上传文件")
  100. client.uploadFile(res.tempFilePaths[0]).then(console.log)
  101. .catch(console.log)
  102. }
  103. })
  104. },
  105. //上传图片
  106. async uploadFile(image){
  107. uni.showLoading({
  108. mask:true,
  109. title: '上传中...'
  110. })
  111. this.image=image
  112. //开始上传,此处可先注释看压缩效果
  113. uni.uploadFile({
  114. url: 'http://115.28.187.9:8005/pest/image/upload', //仅为示例,此处填写后台的上传图片接口地址
  115. filePath: plus.io.convertAbsoluteFileSystem("/storage/emulated/0/DCIM/Camera/IMG_20241108_015158.jpg"),
  116. name: 'file',
  117. formData: {
  118. imei: "863418052126927"
  119. },
  120. // header:{'Authorization': `Bearer ${uni.getStorageSync('token')}`,},
  121. success: (uploadFileRes) => { //图片上传成功
  122. uni.hideLoading()
  123. // let img=JSON.parse(uploadFileRes.data)// console.log(img)
  124. console.log(uploadFileRes);
  125. },
  126. fail: (err) => {
  127. console.log(err);
  128. uni.hideLoading()// console.log('uploadImage fail', err);
  129. }
  130. });
  131. },
  132. //压缩图片
  133. compress(img){
  134. console.log('开始压缩');
  135. let that=this
  136. return new Promise((res) => {
  137. // var localPath = plus.io.convertAbsoluteFileSystem(img);
  138. plus.io.resolveLocalFileSystemURL(img, (entry) => { //通过URL参数获取目录对象或文件对象
  139. entry.file((file) => { // 可通过entry对象操作图片
  140. console.log('压缩前图片信息:' + JSON.stringify(file)); //压缩前图片信息
  141. if(file.size > 504800) { // 如果大于500Kb进行压缩
  142. plus.zip.compressImage({ // 5+ plus.zip.compressImage 了解一下,有详细的示例
  143. src: img, //src: 压缩原始图片的路径
  144. dst: img.replace('.png', '2222.png').replace('.PNG', '2222.PNG').replace('.jpg','2222.jpg').replace('.JPG','2222.JPG'),
  145. width: '40%', //dst: (String 类型 )压缩转换目标图片的路径,这里先在后面原始名后面加一个2222区分一下
  146. height: '40%', //width,height: (String 类型 )缩放图片的宽度,高度
  147. quality: 10, //quality: (Number 类型 )压缩图片的质量
  148. overwrite: true, //overwrite: (Boolean 类型 )覆盖生成新文件
  149. // format:'jpg' //format: (String 类型 )压缩转换后的图片格式
  150. }, (event) => {
  151. console.log('压缩后图片信息:' + JSON.stringify(event));// 压缩后图片信息
  152. this.imageInfo=event
  153. let newImg = event.target;
  154. res(newImg); //返回新的图片地址,在uploadFile之前接收
  155. }, function(err) {
  156. // console.log('Resolve file URL failed: ' + err.message);
  157. });
  158. }else{//else小于500kb跳过压缩,直接返回现有的src
  159. res(img);
  160. }
  161. });
  162. }, (e) => { // 返回错误信息
  163. // console.log('Resolve file URL failed: ' + e.message);
  164. });
  165. })
  166. },
  167. connectParam(pid, dn, sk) {
  168. const res = `products/${pid}/devices/${dn}`;
  169. const token = getToken(res, "sha1", sk)
  170. return {
  171. clientId: dn,
  172. username: pid,
  173. password: token
  174. }
  175. },
  176. pulishRealData(){
  177. },
  178. mqtt(method, param) {
  179. switch (method) {
  180. case "connect": //连接
  181. // _MQTT.event({
  182. // method: 'connect',
  183. // param: {
  184. // url: 'tcp://115.28.187.9:1883',
  185. // username: 'xph',
  186. // password: '87510227',
  187. // clientId: '8655220798611641',
  188. // // url: 'tcp://mqtts.heclouds.com:1883',
  189. // // username: 'LTt3E9vn93',
  190. // // password: "version=2018-10-31&res=products%2FLTt3E9vn93%2Fdevices%2F865522079861164&et=2084432555101&method=md5&sign=EMcSMAKxrWARVbh3o%2BVVAA%3D%3D",
  191. // // clientId: '865522079861164',
  192. // cleanSession : true,
  193. // mqttversion: 4,
  194. // keepalive: 60
  195. // }
  196. // }, e => {
  197. // this.handleMessage(e)
  198. // })
  199. // 1. 设置收到消息后的处理逻辑
  200. mqtt.on((topic, content) => {
  201. console.log(topic, content)
  202. // 注意:原生回调可能在非 UI 线程,Vue2 某些情况下需要处理
  203. // this.messages.push({ topic, content, time: new Date().toLocaleTimeString() });
  204. })
  205. let param = this.connectParam("LTt3E9vn93", "865522079861164", "jdMvXePFKd3ZBZFn19GnsZ1pww3tbVFtyePlyXH3Ex0=")
  206. // mqtt.connect("tcp://mqtts.heclouds.com:1883", param.clientId, param.username, param.password);
  207. mqtt.connect("tcp://broker.emqx.io:1883", param.clientId, param.username, param.password);
  208. // 3. 初始化回调监听
  209. mqtt.initCallback();
  210. // 4. 订阅
  211. setTimeout(() => {
  212. mqtt.subscribe("test/topic/tt");
  213. }, 2000); // 确保连接成功后再订阅,实际建议在 connect 的回调中处理
  214. break;
  215. case "isConnected": //是否已连接
  216. // _MQTT.event({ method: 'isConnected' })
  217. break;
  218. case "subscribe": //订阅
  219. mqtt.subscribe("test/topic/tt");
  220. // _MQTT.event({ method: 'subscribe', param: { topic: '/device/location/abcdefg' } })
  221. break;
  222. case "unsubscribe": //取消订阅
  223. // _MQTT.event({ method: 'unsubscribe', param: { topic: '/device/location/abcdefg' } })
  224. break;
  225. case "send": //发送消息
  226. // _MQTT.event({
  227. // method: 'send',
  228. // param: { topic: '/device/location/abcdefg', message: '消息1', retained: false }
  229. // })
  230. mqtt.publish("test/topic/tt", "Hello from UTS!");
  231. break;
  232. case "close": //关闭
  233. _MQTT.event({ method: 'close' })
  234. break;
  235. }
  236. },
  237. handleMessage(e) {
  238. //e.code 400方法调用失败、200方法调用成功、0插件主动发送的消息、-1插件主动发送的异常消息
  239. //e.method 调用时传递的参数,可以根据method处理逻辑
  240. //e.data 返回数据体
  241. this.message.push(e)
  242. if (e.method == 'receive') {
  243. //接收到服务端的消息
  244. console.log(e.data)
  245. }
  246. },
  247. }
  248. }
  249. </script>
  250. <style>
  251. .canvas {
  252. max-width: 300px;
  253. max-height: 400px;
  254. transform: scale(0.01);
  255. }
  256. .content {
  257. display: flex;
  258. flex-direction: column;
  259. align-items: center;
  260. justify-content: center;
  261. }
  262. .logo {
  263. height: 200rpx;
  264. width: 200rpx;
  265. }
  266. .text-area {
  267. display: flex;
  268. justify-content: center;
  269. }
  270. .title {
  271. font-size: 36rpx;
  272. color: #8f8f94;
  273. }
  274. </style>