1
我正在制作一个iOS应用程序,它将通过UDP套接字程序通过Modbus通信设备访问IP地址,而不是所有在wifi中存在的IP地址,因为该项目已经存在于github中。我有android代码,它是用java编写的,我需要在objective-c平台中使用相同的基本逻辑。它不能通过j2objc转换器工作。 这里是在Java的Android项目中的代码,需要iOS平台相同的代码:如何通过modbus通讯获取IP地址?
public void startTimerForNetworkAccess()
{
try{
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
//System.out.println("TIMER starts");
getNetworkStatus();
}
}, 0, 5000);
}catch(IllegalStateException ise)
{
//ise.printStackTrace();
System.out.println("TIMER WAS CANCELLED");
}
}
public void getNetworkStatus()
{
asyncTaskNetworkStatusCheck = new AsyncTaskNetworkStatusCheck();
asyncTaskNetworkStatusCheck.execute();
}
// Async Task Class for Network status check
public class AsyncTaskNetworkStatusCheck extends AsyncTask<Void, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(Void... params) {
String status="";
try {
status = NetworkUtil.getNetConnectivityStatus(getActivity());
if(status.equals("Wifi enabled"))
{
if(timer != null)
{
//System.out.println("TIMER STOPPER");
timer.cancel();
timer = null;
}
}
System.out.println("STATUS:"+status);
} catch (Exception e) {
Log.e("Error: ", e.getMessage());
}
return status;
}
@Override
protected void onPostExecute(String networkStatus) {
try{
//Toast.makeText(getActivity(), ""+networkStatus, Toast.LENGTH_LONG).show();
if(networkStatus.equals("Wifi enabled"))
{
txt_net_error.setVisibility(View.GONE);
if(menu_save != null)
{
menuFlag = 0;
menu_progress.setActionView(R.layout.action_progressbar);
//menu_progress.expandActionView();
menu_progress.setVisible(true);
menu_save.setVisible(false);
menu_edit.setVisible(false);
//menu_load.setVisible(false);
}
discoverIpListView.setVisibility(View.VISIBLE);
discoverIpAddressAsyncTask();
}else if(networkStatus.equals("Mobile data enabled")){
//discoverIpListView.setVisibility(View.GONE);
//showPopDialog();
txt_net_error.setVisibility(View.VISIBLE);
try{
if(menuFlag != 1)
{
menuFlag = 1;
//menu_refresh.setVisible(true);
//menu_progress.setActionView(null);
//menu_progress.expandActionView();
//menu_progress.setVisible(false);
}
//menuFlag = 0;
//menu_refresh.setVisible(true);
if(timer == null)
{
startTimerForNetworkAccess();
}
}catch(NullPointerException npe){
npe.printStackTrace();
}
}else{
//discoverIpListView.setVisibility(View.GONE);
//showPopDialog();
menuFlag = 0;
menu_refresh.setVisible(true);
txt_net_error.setVisibility(View.VISIBLE);
if(timer == null)
{
startTimerForNetworkAccess();
}
}
}catch(NullPointerException npe){
if(timer != null)
{
timer.cancel();
}else{
timer = null;
}
startTimerForNetworkAccess();
}
}
}
public void discoverIpAddressAsyncTask()
{
discoverIpAsync = new DiscoverIpAsyncTask();
discoverIpAsync.execute("");
}
// Async Task Class
public class DiscoverIpAsyncTask extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... urls) {
setUDPBroadcast();
socketAccessCount = 0;
return null;
}
@Override
protected void onPostExecute(String result) {
//menu_progress.setActionView(null);
menu_progress.setVisible(false);
menu_save.setVisible(true);
menu_edit.setVisible(true);
//menu_load.setVisible(true);
if(!discoverIpAsync.isCancelled())
{
menuFlag = 1;
}else{
menuFlag = 2;
}
}
}
private int socketAccessCount = 0;
private int countLoop = 1;
**public boolean setUDPBroadcast()
{
DatagramSocket datagramSocket;
//DatagramPacket sendPacket;
// Find the server using UDP broadcast
try {
byte[] sendData = "pe identify".getBytes();
while(socketAccessCount < 5)
{
//Open a random port to send the package
datagramSocket = new DatagramSocket();
datagramSocket.setBroadcast(true);
datagramSocket.setSoTimeout(5000);
//while(IpAddr.size() < 20)
//System.out.println("SECOND TIME----------"+socketAccessCount);
if(discoverIpAsync.isCancelled())
{
}
while(countLoop <= 30)
{
if(!discoverIpAsync.isCancelled())
{
try {
//Try the 255.255.255.255 first
try {
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("255.255.255.255"), 505);
//System.out.println("SOCKET SENT");
datagramSocket.send(sendPacket);
//System.out.println(getClass().getName() + ">>> Request packet sent to: 255.255.255.255 (DEFAULT)");
} catch (Exception e) {
//System.out.println("DATAGRAM ERROR");
e.printStackTrace();
datagramSocket.close();
break;
}
// Broadcast the message over all the network interfaces
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface = (NetworkInterface) interfaces.nextElement();
if (networkInterface.isLoopback() || !networkInterface.isUp()) {
//System.out.println("LOOPBACK");
continue; // Don't want to broadcast to the loopback interface
}
for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {
InetAddress broadcast = interfaceAddress.getBroadcast();
if (broadcast == null) {
continue;
}
// Send the broadcast package!
DatagramPacket sendPacket1 = new DatagramPacket(sendData, sendData.length, broadcast, 505);
datagramSocket.send(sendPacket1);
//System.out.println(getClass().getName() + ">>> Request packet sent to: " + broadcast.getHostAddress() + "; Interface: " + networkInterface.getDisplayName());
}
}
//System.out.println(getClass().getName() + ">>> Done looping over all network interfaces. Now waiting for a reply!");
//Wait for a response
byte[] recvBuf = new byte[15000];
DatagramPacket receivePacket = new DatagramPacket(recvBuf, recvBuf.length);
try{
datagramSocket.receive(receivePacket);
}catch(SocketTimeoutException sto)
{
//System.out.println("SOCKET TIME OUT");
//datagramSocket.send(sendPacket);
break;
}
//We have a response
//System.out.println(getClass().getName() + ">>> Broadcast response from server: " + receivePacket.getAddress().getHostAddress());
//Check if the message is correct
//String message = new String(receivePacket.getData()).trim();
//if(message.equals("Solar Inverter"))
//{
if(!IpAddr.contains(""+receivePacket.getAddress().getHostAddress()) || IpAddr.isEmpty())
{
IpAddr.add(""+receivePacket.getAddress().getHostAddress());
//System.out.println(getClass().getName() + ">>> Broadcast response from server: " + receivePacket.getAddress().getHostAddress());
//SI_Count++;
if(getActivity() != null)
{
getActivity().runOnUiThread (new Thread(new Runnable() {
public void run() {
listAdapter.notifyDataSetChanged();
discoverIpListView.invalidateViews();
discoverIpListView.refreshDrawableState();
}
}));
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
}
}
//}
countLoop++;
} catch (Exception e) {
e.printStackTrace();
}
}else{
//getTargetFragment().setMenuVisibility(false);
//menu_progress.setActionView(null);
//menu_progress.setVisible(false);
//discoverIpAddressAsyncTask();
if(menuFlag == 2)
{
}else{
menuFlag = 0;
}
System.out.println("CANCELLED");
return true;
}
}
if(IpAddr.size() > 0){}
//Close the port!
datagramSocket.close();
socketAccessCount++;
}
} catch (IOException ex) {
//Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex);
//System.out.println(""+ex);
}
/*for(int i=0;i<IpAddr.size();i++)
{
System.out.println("IP:"+IpAddr.get(i));
}*/
return true;
}**