更新记录
2.0.3(2022-05-27)
1、更新说明文档引入插件模块的名称:Qiepro-UdpModule 2、本地真机测试通过,绑定自身端口是有效的,这前模拟机绑定自身端口会被路由分配其它端口转发。估计手机使用局域网连接外网使用端口也会发生变化。完全有效估计得使自己手机在外网有独立的IP
平台兼容性
Android | Android CPU类型 | iOS |
---|---|---|
适用版本区间:5.0 - 11.0 | armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 | × |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios
注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择
Udp通讯插件
Demo:持续更新
很多东西待完善,请看官们自己研究研究。我会慢慢更新的。
主要用于技术实现及后端处理,自己本身没有啥美感,对UI没什么要求。
说明文档中补充了完整Nodejs服务端代码 /-------服务端项目文件 --udp.js --package.json
项目仅引用了一个md5用做生成客户端唯一标识的
安装使用
app 是每个项目不一样的 可以自定义的
可结合VUEX使用。增加一个udp.js的状态文件
引入再初始化即可监听数据接收及发送数据
... 额,这文档不太会写。 ...
-
Vuex模块 存放路径:/app/store/modules/udp.js
export default { state: { //基础服务端信息 serverIp:'192.168.3.88', serverPort:8060, //本地绑定端口。暂时无用 localPort:8080, //接收到的消息 data:'', //插件对象 socket:null }, getters: { udp_data: state => { return state.data } }, mutations: { udpSend(state, params) { // 发送广播数据(不传此参数默认向服务端发送消息) // user = { // 'ip':'', // 'port':'' // } state.socket.sendMessage(params/*,user*/); }, }, actions: { udpInit({state,dispatch,commit}, callback) { //服务端只需启动一条 if(state.socket !== null){ uni.showToast({ title:"服务已初始化" }) return; } state.socket = uni.requireNativePlugin("Qiepro-UdpModule"); //插件引入失败不启动 if(state.socket !== undefined){ //启动监听 state.socket.hostIp(state.serverIp); state.socket.hostPort(state.serverPort); //本地端口绑定(仅做服务端使用。这测试还未通过。系统会随机使用端口)可以不用配置 state.socket.localPort(state.localPort); //本地用户ID(不执行后端会根据客户端IP,端口生成唯一标识,客户端信息发送会带上) //state.socket.localId('default') //启动数据接收监听(这会启用服务并向服务端注册连接信息) state.socket.startServer((res)=>{ dispatch("udpReceive",res); }) } }, //接收到数据后处理(可以由服务端在连接上后推送其它连接用户的信息后做:端到端消息直推,用户连接信息由服务端更新后推送) udpReceive({state,dispatch,commit},data){ state.data = data; } } }
-
Vuex入口 路径:/app/store/index.js
import Vue from 'vue' import Vuex from 'vuex' //引入模udp状态模块 import udp from '@/app/store/modules/udp.js' Vue.use(Vuex) const store = new Vuex.Store({ state: {}, getters: {}, mutations: {}, actions: { }, modules: {udp} }) //全局状态方法 Vue.mixin({ computed:{...Vuex.mapGetters(['udp_data'])}, methods:{...Vuex.mapMutations([ 'udpSend' ]),...Vuex.mapActions([ 'udpInit','udpReceive' ])} }) //初始化 Udp服务 store.dispatch('udpInit') Vue.prototype.$store = store export default store;
-
全局引入Vuex 路径:/main.js
import Vue from 'vue' import App from './App' //引入Vuex import store from '@/app/store/index.js' Vue.config.productionTip = false App.mpType = 'app' const app = new Vue({ ...App }) app.$mount()
-
使用相关服务(这属于Vuex方法的基础操作了)
//页面方法中实时获取到最新数据可监听。udp_data //调用相关操作方法(如需向其它端发送可修改udp.jss模块中的发送方法即可) this.udpSend(消息对象)
极简UDP服务端源码
- Node服务端启动文件:/udp.js
const dgram = require('dgram'); const md5 = require('md5'); var server = dgram.createSocket('udp4'); var client = {}; server.on('close',()=>{ console.log('socket已关闭'); }); server.on('error',(err)=>{ console.log(err); }); server.on('listening',()=>{ console.log('socket正在监听中...'); server.setBroadcast(true);//开启广播 server.setTTL(128);//路由一跳TTL减一,减到零抛弃数据包 //server.send('hello i am server',8061,'192.168.1.255'); //在send {msg=close} 可以发送 colse 事件 }); //通过message事件接收数据, server.on('message',(msg,rinfo)=>{ console.log(`receive message from ${rinfo.address}:${rinfo.port}`); var newtopic = new Buffer.from(msg,"utf-8").toString();//将十六进制的消息转换成string console.log(newtopic) var key = md5(`${rinfo.address}:${rinfo.port}`) client[key]={'ip':rinfo.address,'port':rinfo.port} for(let key in client){ server.send(newtopic,client[key].port,client[key].ip) } }); //绑定本机的端口和ip地址,要接收数据的话必须绑定 server.bind('8060','192.168.3.88');
2.服务端项目包 /package.json
{
"requires": true,
"lockfileVersion": 1,
"scripts": {
"dev": "node udp.js"
},
"dependencies": {
"charenc": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
"integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA=="
},
"crypt": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
"integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
},
"is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
},
"md5": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
"integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
"requires": {
"charenc": "0.0.2",
"crypt": "0.0.2",
"is-buffer": "~1.1.6"
}
}
}
}
- 启动服务端方法,在文件目录执行以下命令
1、Node命令启动 node udp.js /或/ 2、项目命令启动 npm run dev