写微信小程序用udp与服务器通信时message只可以用string和arraybuffer类型,我用了arraybuffer类型,此时涉及到string与arraybuffer的相互转换故记录所用函数以免以后忘记
通过先将字符串编码并转换为byte[],再转换为对应的arraybuffer(解析同理,先将arraybuffer转换为byte[],再进行解码)
编码及解码的过程较复杂,不过这两个函数是可以直接使用的,同时支持中文和英文。
代码局部:
//字符串内容转arraybuffer
//以下包括包头、包长和版本号,一共10个字符长度,如不需要可删除,同时把内容中的array[i+10]改为array[i]
stringToArrayBuffer:function (str) {
var bytes = new Array();
var len,c;
len = str.length;
for(var i = 0; i < len; i++){
c = str.charCodeAt(i);
if(c >= 0x010000 && c <= 0x10FFFF){
bytes.push(((c >> 18) & 0x07) | 0xF0);
bytes.push(((c >> 12) & 0x3F) | 0x80);
bytes.push(((c >> 6) & 0x3F) | 0x80);
bytes.push((c & 0x3F) | 0x80);
}else if(c >= 0x000800 && c <= 0x00FFFF){
bytes.push(((c >> 12) & 0x0F) | 0xE0);
bytes.push(((c >> 6) & 0x3F) | 0x80);
bytes.push((c & 0x3F) | 0x80);
}else if(c >= 0x000080 && c <= 0x0007FF){
bytes.push(((c >> 6) & 0x1F) | 0xC0);
bytes.push((c & 0x3F) | 0x80);
}else{
bytes.push(c & 0xFF);
}
}
var array = new Int8Array(bytes.length+10);
//包头
array[0]=239;
array[1]=207;
array[2]=254;
array[3]=252;
//包长
var leng=2+bytes.length;
console.log('leng='+leng)
if(leng<=255){
array[4]=leng;
array[5]=0;
array[6]=0;
array[7]=0;
}else{
array[4]=leng%256;
array[5]=parseInt(leng/256);
array[6]=0;
array[7]=0;
}
//版本号
array[8]=0;
array[9]=1;
//内容
for(var i=0 ;i<=bytes.length;i++){
array[i+10] =bytes[i];
}
return array.buffer;
},
//arraybuffer转字符串
arrayBufferToString:function(arr){
if(typeof arr === 'string') {
return arr;
}
var dataview=new DataView(arr.data);
var ints=new Uint8Array(arr.data.byteLength);
for(var i=0;i<ints.length;i++){
ints[i]=dataview.getUint8(i);
}
arr=ints;
var str = '',
_arr = arr;
for(var i = 0; i < _arr.length; i++) {
var one = _arr[i].toString(2),
v = one.match(/^1+?(?=0)/);
if(v && one.length == 8) {
var bytesLength = v[0].length;
var store = _arr[i].toString(2).slice(7 - bytesLength);
for(var st = 1; st < bytesLength; st++) {
store += _arr[st + i].toString(2).slice(2);
}
str += String.fromCharCode(parseInt(store, 2));
i += bytesLength - 1;
} else {
str += String.fromCharCode(_arr[i]);
}
}
return str;
},
submit:function(e){
console.log('登陆按钮被点击了');
if(this.data.user_name.length==0||this.data.user_pwd==0){
wx.showToast({
title: '账号或密码为空',
icon: "none",
duration: 1000
})
console.log(this.data.user_name)
}else{
const udp = wx.createUDPSocket()
udp.bind()
udp.send({
address:'自己的地址',
port: '自己的端口号',
// message:'{\n"operate":"user_login",\n'+
// '"user_name":"'+this.data.user_name+'",\n'+
// '"user_pwd":"'+this.data.user_pwd+'",\n'+
// '"chip_id":"1"\n}'
message: this.stringToArrayBuffer(
'{"chip_id":"xxxxx",'
+'"operate":"user_login",'+
'"user_name":"'+this.data.user_name+'",'+
'"user_pwd":"'+this.data.user_pwd+'"}'),
})
udp.onMessage(
(res)=>{
console.log(res.message)
}
)
}
},
所传数据包如下