最近无意间看到微信小程序里多了个关于UDP的API,一时间感慨良多。想当初,小程序刚发布,想开发个局域网通信的程序,翻遍API居然没有,http/websocket要求域名,蓝牙只支持ble,郁闷得还专门找客服反馈。。。网上找了下,也没看到什么文章,那我就写个总结,顺便纪念下。
既然是通信,那么至少得有两个参与者,一端已经确定微信小程序了,另一端来点不一样的,Android吧(其实是作者Android出身~~)。
局域网通信,首先得有对方的地址,也就是ip和port,所以第一步就是设备搜索。所幸,小程序里有个mDNS的API,Android里也有个NSDManager(也就是mDNS的实现)。不清楚mDNS的,自行百度,笔者懒。。。
这样方案就确定了,通过mDNS发现设备,UDP通信。这里我们以Android端为Server,小程序为client,作为例子讲解。
mDNS发现设备
Android Server端
只需要调用NSDManager.registerService就实现了mDNS的注册:
private void mDNSRegister(){
mRegistrationListener = new NsdManager.RegistrationListener() {
@Override
public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
Log.i(TAG,"onRegistrationFailed ");
}
@Override
public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
Log.i(TAG,"onUnregistrationFailed ");
}
@Override
public void onServiceRegistered(NsdServiceInfo serviceInfo) {
Log.i(TAG,"onServiceRegistered ");
}
@Override
public void onServiceUnregistered(NsdServiceInfo serviceInfo) {
Log.i(TAG,"onServiceUnregistered ");
}
};
mNsdManager = (NsdManager) getSystemService(NSD_SERVICE);
NsdServiceInfo serviceInfo = new NsdServiceInfo();
serviceInfo.setServiceName("test");
serviceInfo.setPort(CHAT_PORT);//udp通信使用的端口号,通过mDNS发出去
serviceInfo.