uniapp app(ios和Android)使用tcp实现对设备的交互
·
我这边使用的uniapp插件市场里面的TCP-Socket插件实现的,ios下发数据需要转成json去下发不然设备接收不到,由于我这边设备返回数据过多所以根据设备返回的头是不是包含emu 和长度信息,包含就是第一包,然后根据接收到的长度去判断是否和总长度一致,进行数据拼接
我这边需要一直去轮询下发命令查询数据所以在app.vue里面加了个定时器,使用方式就直接调用函数setinstruction传true,就开始发指令去查消息,传false就关闭发指令
TCP-Socket原生插件地址
tcp.js
import permision from "@/util/permission.js"
import {
getApp
} from "@/base/app"
import {
v4 as uuidv4
} from 'uuid'
const socket = {
TCPSocket: null,
// 万禾
ip: '192.168.4.1',
port: '10443',
// 设备
// ip: '192.168.4.1',
// port: '8888',
systeminfo: '',
// 超时时间 s
Timeout: 10,
wifiinfo: null,
arrList: [],
dataLength: '',
mydisconnect() {
if (socket.TCPSocket) {
socket.TCPSocket.disconnect({
channel: '1' //可选 1~20
})
socket.TCPSocket = null
socket.wifiinfo = null
socket.arrList=[]
}
},
// 初始化
initwifi() {
console.log('----------初始化wifi')
socket.TCPSocket = uni.requireNativePlugin('Aimer-TCPPlugin');
return new Promise((resolve, reject) => {
socket.TCPSocket.connect({
//charsetname:'GBK',//可不选,默认UTF-8,针对服务端数据的字符集格式转化
channel: '1', //可选 1~20
ip: socket.ip,
port: socket.port
}, result => {
uni.hideLoading()
console.log('----------TCP消息', result)
if (result.status == '0') {
socket.systeminfo = ''
resolve({
code: 100
})
} else if (result.status == '1') {
socket.mydisconnect()
resolve({
result: result,
code: 102
})
}
// if (result.receivedMsg) {
// //服务器返回字符串
// socket.systeminfo = result.receivedMsg
// }
if (result.receivedHexMsg) {
//硬件服务器返回16进制数据
let msg = result.receivedHexMsg;
let sum = msg.length / 2;
let arr = [];
for (let k = 0; k < sum; k++) {
let i = msg.substring(k * 2, k * 2 + 2);
arr.push(i);
}
try {
// 截取9位的请求头
let status = arr.slice(0, 9);
// 截取三位解析成为字符串EMU
let statusOne = status.slice(0, 3);
let stringStatusOne = socket.hexToString(statusOne.join(''));
console.log(stringStatusOne, stringStatusOne == 'EMU', "当前头3为是不是等于emu")
// 表明当前是第一包
if (stringStatusOne == 'EMU') {
// 4 5位表示当前是什么命令 如801
let statusTwo = parseInt(status.slice(3, 5).reverse().join(''), 16);
// 6 7 8 9位表示当前包的总长度
socket.dataLength = parseInt(status.slice(5).reverse().join(''), 16);
let end = arr.slice(9);
socket.arrList = end;
if (socket.dataLength == socket.arrList.length) {
socket.systeminfo = JSON.parse(socket.hexToString(socket.arrList
.join('')));
socket.arrList = [];
console.log(socket.systeminfo, "当前拿到的所有数据第一包全获取到数据")
}
} else {
socket.arrList = [...socket.arrList, ...arr];
console.log(socket.dataLength, "当前包的总长度")
console.log(socket.arrList.length, "当前包的总长度")
// 表明当前已经获取到所有的包 该去转换成字符串了
if (socket.dataLength == socket.arrList.length) {
// 给返回值赋值
socket.systeminfo = JSON.parse(socket.hexToString(socket.arrList
.join('')));
// 赋值就清空包
socket.arrList = [];
console.log(socket.systeminfo, "当前拿到的所有数据")
}
}
} catch (err) {
// 报错就清空包
socket.arrList = []
console.log(err)
// socket.systeminfo =socket.hexToString(arr.join(''));
}
}
})
})
},
async ModeSettinginitwifi() {
const app = getApp()
return new Promise(async (resolve, reject) => {
// #ifdef APP
let locationres = await socket.getlocation()
console.log('----------权限', locationres)
if (locationres != 'allLocat') {
reject(false)
return
}
let wifiinfo = await socket.getwifiinfo()
if (!wifiinfo || wifiinfo.wifi.SSID.indexOf('INV') == -1 && wifiinfo.wifi.SSID.indexOf(
'EMU') == -1) {
uni.showToast({
title: app.$t('手机未连接设备 WIFI,请先连接'),
icon: 'none'
})
reject(false)
return
}
// 未连接
if (!socket.TCPSocket) {
let res = await socket.initwifi()
if (res.code != 100) {
uni.showToast({
title: app.$t('手机未连接设备 WIFI,请先连接'),
icon: 'none'
})
reject(false)
return
}
}
resolve(wifiinfo)
// #endif
// #ifdef H5
resolve(true)
// #endif
})
},
// 发送消息
async sendmsg(zhilin) {
const app = getApp()
console.log('-------------发送指令', {
...zhilin,
"timeStamp": new Date().getTime(),
mid: uuidv4()
})
// #ifdef H5
let bytesMessage = socket.textToArrayBuffer(JSON.stringify({
...zhilin,
"timeStamp": new Date().getTime(),
mid: uuidv4()
}))
// #endif
// #ifdef APP
// 已经断开连接
if (!socket.TCPSocket) {
let initres = await socket.initwifi()
// 重连失败
if (initres.code == 102) {
socket.arrList=[]
uni.showToast({
title: app.$t('TCP连接已断开'),
icon: 'none'
})
return
}
}
let bytesMessage = socket.textToArrayBuffer(JSON.stringify({
...zhilin,
"timeStamp": new Date().getTime(),
mid: uuidv4()
}))
socket.TCPSocket.sendBytes({
channel: '1', //可选 1~20
// bytesMessage: ['f2', '03', '01', '40', '00', '01', '00', '20', 'AD', '90'],
bytesMessage: bytesMessage,
});
console.log('-------------------bytesMessage', bytesMessage)
uni.showToast({
title: app.$t('发送成功'),
icon: 'none'
})
return socket.getsysteminfo()
// #endif
},
getsysteminfo() {
const app = getApp()
uni.showLoading({
title: app.$t('请求中'),
mask: true
})
return new Promise((resolve, reject) => {
let Timeout = socket.Timeout
let returnfn = () => {
if (Timeout == 0) {
socket.arrList=[]
socket.systeminfo = ''
uni.showToast({
title: app.$t('响应超时'),
icon: 'none'
})
return reject({
code: 101,
msg: app.$t('响应超时')
})
}
if (socket.systeminfo) {
uni.hideLoading()
resolve({
code: 100,
msg: socket.systeminfo
})
socket.systeminfo = ''
socket.arrList=[]
return
} else {
Timeout = Timeout - 1
setTimeout(() => {
returnfn()
}, 1000)
}
}
returnfn()
})
},
// 转hexarr
strToHexArray(str) {
var result = [];
for (var i = 0; i < str.length; i++) {
result.push(str.charCodeAt(i).toString(16));
}
return result;
},
// 转字符串
hexToString(hex) {
var str = '';
for (var i = 0; i < hex.length; i += 2) {
str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
}
return str;
},
async getwifiinfo() {
return new Promise(async (resolve, reject) => {
if (socket.wifiinfo && socket.TCPSocket) {
resolve(socket.wifiinfo)
return
}
try {
uni.startWifi({
success: (res) => {
console.log('----------startWifi成功', res)
uni.getConnectedWifi({
success: (success) => {
console.log('-------------success', success)
// 测试修改WiFi名称
// success = {
// "wifi": {
// "SSID": "INV_12345",
// // "SSID": "EMU_12345",
// }
// }
socket.wifiinfo = success
resolve(success)
},
fail: (fail) => {
console.log('-------------fail', fail)
socket.wifiinfo = ''
resolve('')
},
})
},
fail: (err) => {
console.log('----------startWifi失败', err)
socket.wifiinfo = ''
resolve('')
}
})
} catch (err) {
console.log(err)
}
})
},
getlocation() {
console.log("授权111111111")
const app = getApp()
return new Promise(async (resolve, reject) => {
let system = uni.getSystemInfoSync(); // 获取系统信息
console.log("授权222222",system)
if (system.platform === 'android') { // 判断平台
var context = plus.android.importClass("android.content.Context");
var locationManager = plus.android.importClass("android.location.LocationManager");
console.log("授权locationManager",locationManager)
var main = plus.android.runtimeMainActivity();
console.log("授权main",main)
var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
console.log("授权mainSvr",mainSvr)
if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
// console.log('-----------------系统定位失败')
uni.showToast({
title: app.$t('获取定位权限失败,请开启定位后重试'),
icon: 'none'
})
resolve('Locatfalse')
return
}
}
// else if (system.platform === 'ios') {
// var cllocationManger = plus.ios.import("CLLocationManager");
// var enable = cllocationManger.locationServicesEnabled();
// var status = cllocationManger.authorizationStatus();
// plus.ios.deleteObject(cllocationManger);
// console.log('-----------------系统定位失败1',status)
// uni.showToast({
// title: app.$t('获取定位权限失败,请开启定位后重试'),
// icon: 'none'
// })
// resolve('Locatfalse')
// return
// }
// 定位权限
let quanxian = 1
if (system.platform == 'android') {
quanxian = await permision.requestAndroidPermission(
'android.permission.ACCESS_FINE_LOCATION')
} else {
const islocation = await permision.judgeIosPermission('location')
quanxian = islocation ? '1' : '0'
}
console.log(quanxian,"1111")
if (quanxian == 1) {
// console.log('-----------------应用定位成功')
resolve('allLocat')
} else {
uni.showToast({
title: app.$t('获取定位权限失败,请开启定位后重试'),
icon: 'none'
})
// console.log('-----------------应用定位失败')
resolve('Locatfalse')
}
})
},
textToArrayBuffer(s) {
var i = s.length;
var n = 0;
var ba = new Array()
for (var j = 0; j < i;) {
var c = s.codePointAt(j);
if (c < 128) {
ba[n++] = c;
j++;
} else if ((c > 127) && (c < 2048)) {
ba[n++] = (c >> 6) | 192;
ba[n++] = (c & 63) | 128;
j++;
} else if ((c > 2047) && (c < 65536)) {
ba[n++] = (c >> 12) | 224;
ba[n++] = ((c >> 6) & 63) | 128;
ba[n++] = (c & 63) | 128;
j++;
} else {
ba[n++] = (c >> 18) | 240;
ba[n++] = ((c >> 12) & 63) | 128;
ba[n++] = ((c >> 6) & 63) | 128;
ba[n++] = (c & 63) | 128;
j += 2;
}
}
ba = ba.map(item => item.toString(16))
return ba;
},
// 发送消息测试
mysendmsg(zhilin) {
zhilin.wifi.name = socket.textToArrayBuffer(zhilin.wifi.name)
console.log('-------------发送指令', {
...zhilin,
mid: uuidv4()
})
let bytesMessage = socket.strToHexArray(JSON.stringify({
...zhilin,
mid: uuidv4()
}))
console.log('----------bytesMessage', bytesMessage)
// 转换为十进制数字
let myname = socket.textToArrayBuffer('万禾悦能')
console.log('----------myname', myname)
let myname2 = socket.strToHexArray(JSON.stringify(myname))
console.log('-----------转换后name', myname2)
},
}
export default socket;
permission.js
/**
* 本模块封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启
*/
var isIos
// #ifdef APP-PLUS
isIos = (plus.os.name == "iOS")
// #endif
// 判断推送权限是否开启
function judgeIosPermissionPush() {
var result = false;
var UIApplication = plus.ios.import("UIApplication");
var app = UIApplication.sharedApplication();
var enabledTypes = 0;
if (app.currentUserNotificationSettings) {
var settings = app.currentUserNotificationSettings();
enabledTypes = settings.plusGetAttribute("types");
console.log("enabledTypes1:" + enabledTypes);
if (enabledTypes == 0) {
console.log("推送权限没有开启");
} else {
result = true;
console.log("已经开启推送功能!")
}
plus.ios.deleteObject(settings);
} else {
enabledTypes = app.enabledRemoteNotificationTypes();
if (enabledTypes == 0) {
console.log("推送权限没有开启!");
} else {
result = true;
console.log("已经开启推送功能!")
}
console.log("enabledTypes2:" + enabledTypes);
}
plus.ios.deleteObject(app);
plus.ios.deleteObject(UIApplication);
return result;
}
// 判断定位权限是否开启
function judgeIosPermissionLocation() {
var result = false;
var cllocationManger = plus.ios.import("CLLocationManager");
var status = cllocationManger.authorizationStatus();
result = (status != 2)
console.log("定位权限开启:" + result);
// 以下代码判断了手机设备的定位是否关闭,推荐另行使用方法 checkSystemEnableLocation
/* var enable = cllocationManger.locationServicesEnabled();
var status = cllocationManger.authorizationStatus();
console.log("enable:" + enable);
console.log("status:" + status);
if (enable && status != 2) {
result = true;
console.log("手机定位服务已开启且已授予定位权限");
} else {
console.log("手机系统的定位没有打开或未给予定位权限");
} */
plus.ios.deleteObject(cllocationManger);
return result;
}
// 判断麦克风权限是否开启
function judgeIosPermissionRecord() {
var result = false;
var avaudiosession = plus.ios.import("AVAudioSession");
var avaudio = avaudiosession.sharedInstance();
var permissionStatus = avaudio.recordPermission();
console.log("permissionStatus:" + permissionStatus);
if (permissionStatus == 1684369017 || permissionStatus == 1970168948) {
console.log("麦克风权限没有开启");
} else {
result = true;
console.log("麦克风权限已经开启");
}
plus.ios.deleteObject(avaudiosession);
return result;
}
// 判断相机权限是否开启
function judgeIosPermissionCamera() {
var result = false;
var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
console.log("authStatus:" + authStatus);
if (authStatus == 3) {
result = true;
console.log("相机权限已经开启");
} else {
console.log("相机权限没有开启");
}
plus.ios.deleteObject(AVCaptureDevice);
return result;
}
// 判断相册权限是否开启
function judgeIosPermissionPhotoLibrary() {
var result = false;
var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
var authStatus = PHPhotoLibrary.authorizationStatus();
console.log("authStatus:" + authStatus);
if (authStatus == 3) {
result = true;
console.log("相册权限已经开启");
} else {
console.log("相册权限没有开启");
}
plus.ios.deleteObject(PHPhotoLibrary);
return result;
}
// 判断通讯录权限是否开启
function judgeIosPermissionContact() {
var result = false;
var CNContactStore = plus.ios.import("CNContactStore");
var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
if (cnAuthStatus == 3) {
result = true;
console.log("通讯录权限已经开启");
} else {
console.log("通讯录权限没有开启");
}
plus.ios.deleteObject(CNContactStore);
return result;
}
// 判断日历权限是否开启
function judgeIosPermissionCalendar() {
var result = false;
var EKEventStore = plus.ios.import("EKEventStore");
var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
if (ekAuthStatus == 3) {
result = true;
console.log("日历权限已经开启");
} else {
console.log("日历权限没有开启");
}
plus.ios.deleteObject(EKEventStore);
return result;
}
// 判断备忘录权限是否开启
function judgeIosPermissionMemo() {
var result = false;
var EKEventStore = plus.ios.import("EKEventStore");
var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
if (ekAuthStatus == 3) {
result = true;
console.log("备忘录权限已经开启");
} else {
console.log("备忘录权限没有开启");
}
plus.ios.deleteObject(EKEventStore);
return result;
}
// Android权限查询
function requestAndroidPermission(permissionID) {
return new Promise((resolve, reject) => {
plus.android.requestPermissions(
[permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装
function(resultObj) {
var result = 0;
for (var i = 0; i < resultObj.granted.length; i++) {
var grantedPermission = resultObj.granted[i];
console.log('已获取的权限:' + grantedPermission);
result = 1
}
for (var i = 0; i < resultObj.deniedPresent.length; i++) {
var deniedPresentPermission = resultObj.deniedPresent[i];
console.log('拒绝本次申请的权限:' + deniedPresentPermission);
result = 0
}
for (var i = 0; i < resultObj.deniedAlways.length; i++) {
var deniedAlwaysPermission = resultObj.deniedAlways[i];
console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
result = -1
}
resolve(result);
// 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
// if (result != 1) {
// gotoAppPermissionSetting()
// }
},
function(error) {
console.log('申请权限错误:' + error.code + " = " + error.message);
resolve({
code: error.code,
message: error.message
});
}
);
});
}
// 使用一个方法,根据参数判断权限
function judgeIosPermission(permissionID) {
if (permissionID == "location") {
return judgeIosPermissionLocation()
} else if (permissionID == "camera") {
return judgeIosPermissionCamera()
} else if (permissionID == "photoLibrary") {
return judgeIosPermissionPhotoLibrary()
} else if (permissionID == "record") {
return judgeIosPermissionRecord()
} else if (permissionID == "push") {
return judgeIosPermissionPush()
} else if (permissionID == "contact") {
return judgeIosPermissionContact()
} else if (permissionID == "calendar") {
return judgeIosPermissionCalendar()
} else if (permissionID == "memo") {
return judgeIosPermissionMemo()
}
return false;
}
// 跳转到**应用**的权限页面
function gotoAppPermissionSetting() {
if (isIos) {
var UIApplication = plus.ios.import("UIApplication");
var application2 = UIApplication.sharedApplication();
var NSURL2 = plus.ios.import("NSURL");
// var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");
var setting2 = NSURL2.URLWithString("app-settings:");
application2.openURL(setting2);
plus.ios.deleteObject(setting2);
plus.ios.deleteObject(NSURL2);
plus.ios.deleteObject(application2);
} else {
// console.log(plus.device.vendor);
var Intent = plus.android.importClass("android.content.Intent");
var Settings = plus.android.importClass("android.provider.Settings");
var Uri = plus.android.importClass("android.net.Uri");
var mainActivity = plus.android.runtimeMainActivity();
var intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
}
// 检查系统的设备服务是否开启
// var checkSystemEnableLocation = async function () {
function checkSystemEnableLocation() {
if (isIos) {
var result = false;
var cllocationManger = plus.ios.import("CLLocationManager");
var result = cllocationManger.locationServicesEnabled();
console.log("系统定位开启:" + result);
plus.ios.deleteObject(cllocationManger);
return result;
} else {
var context = plus.android.importClass("android.content.Context");
var locationManager = plus.android.importClass("android.location.LocationManager");
var main = plus.android.runtimeMainActivity();
var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);
console.log("系统定位开启:" + result);
return result
}
}
module.exports = {
judgeIosPermission: judgeIosPermission,
requestAndroidPermission: requestAndroidPermission,
checkSystemEnableLocation: checkSystemEnableLocation,
gotoAppPermissionSetting: gotoAppPermissionSetting
}
app.vue
<script>
import {
pollingIstruction
} from "@/util/pollingInstruction.js"
import socket from '@/util/tcp'
export default {
data() {
return {
pollingTime: ""
}
},
onShow() {
if (this.pollingTime) {
clearInterval(this.pollingTime);
this.pollingTime = '';
}
this.pollingTime = setInterval(function() {
pollingIstruction();
}, 30000)
},
onHide: function() {
if (this.pollingTime) {
clearInterval(this.pollingTime);
this.pollingTime = '';
}
console.log('App Hide')
},
onUnload() {
if (this.pollingTime) {
clearInterval(this.pollingTime);
this.pollingTime = '';
}
},
methods: {
}
}
</script>
<style lang="scss">
page {
width: 100%;
height: 100%;
background: #30333d;
}
.dark {
.uni-picker-header {
background-color: #30333d !important;
}
.uni-picker-content {
background-color: #30333d !important;
}
}
.light {
.uni-picker-header {
background-color: #FF3229 !important;
}
.uni-picker-content {
background-color: #FF3229 !important;
}
}
</style>
pollingInstruction.js
import socket from '@/util/tcpTwo'
import {
getCurrentTimer,
parseTime
} from "@/util/tools.js"
import store from '@/store/index.js'
let instruction = null;
let timeInter = null;
let wifiinfoTwo=null;
export function setinstruction(flag=null){
if(flag){
instruction=flag;
}
}
export function pollingIstruction(flag=null) {
// console.log(instruction,"连接未通了")
if (!instruction) {
if(socket.TCPSocket){
socket.mydisconnect()
}
return
}
// console.log(instruction,"连接通了")
getwifiinfo();
}
async function getwifiinfo() {
let t = this;
// #ifdef APP
console.log('------------位置')
let locationres = await socket.getlocation()
if (locationres != 'allLocat') {
return
}
let wifiinfo = await socket.getwifiinfo();
if (!wifiinfo) {
return
}
if (wifiinfo.wifi.SSID.indexOf('EMU') == -1) {
return
}
if (wifiinfo && wifiinfo.wifi.SSID.includes('EMU')) {
wifiinfoTwo = wifiinfo.wifi.SSID.slice(4);
}
// 未连接
if (!socket.TCPSocket) {
let res = await socket.initwifi()
console.log(res, "判断是否连接-----")
if (res.code !== 100) {
console.log("没连接")
} else {
await sendmsg(805);
// clearInterval(timeInter)
// timeInter = setInterval(function() {
// console.log("打印了setInterval");
// sendmsg(805);
// }, 60000);
}
} else {
await sendmsg(805);
// clearInterval(timeInter)
// timeInter = setInterval(function() {
// console.log("打印了setInterval");
// sendmsg(805);
// }, 60000);
}
// #endif
};
// 发送至EMU
async function sendmsg(e) {
if (!socket.TCPSocket) {
let res = await socket.initwifi()
if (res.code !== 100) {
return
}
}
if (!wifiinfoTwo) {
return
}
let tcpmsg = {
"frameType": e,
'sn': wifiinfoTwo
}
let res = await socket.sendmsg(tcpmsg);
console.log(res)
if (res && res.msg) {
if(e=='805'||e==805){
uni.setStorageSync('emu805',res)
console.log(res.msg,"805---------------+++++++++++++");
// 读参数
let invData = res.msg;
let all=0;
invData.invData.map(v=>{
all+=v.data.acTempPower
})
// this.$nextTick(function(){
let time=getCurrentTimer();
// 获取发电功率本地缓存
let perCentArr=uni.getStorageSync('perCentArr')||'';
let timeOne=new Date();
// 获取今天日期
let today=parseTime(timeOne,'{y}-{m}-{d}');
// 是否存在本地缓存
if(perCentArr){
// 日期是否是同一天
if(perCentArr.time==today){
perCentArr.data.push([time,all.toFixed(3)]);
}else{
perCentArr={
time:today,
data:[[time,all.toFixed(3)]]
}
}
}else{
perCentArr={
time:today,
data:[[time,all.toFixed(3)]]
}
}
uni.setStorageSync('perCentArr',perCentArr);
let storageUpdate= store.state.storageUpdate;
store.commit('setStorageUpdate',!storageUpdate);
// })
}else{
uni.setStorageSync('emu807',res)
}
}
}
更多推荐

所有评论(0)