【问题标题】:Android TCP client can't send data to serverAndroid TCP客户端无法向服务器发送数据
【发布时间】:2021-02-21 05:03:33
【问题描述】:

我正在用信标做项目。

智能手机(安卓客户端)收集附近的 rssi 信标并发送到 python(服务器)

->当捕获到新的信标信号时,显示信标的rssi值,Mac地址

-> 连接tcp并实时发送到python服务器(问题!!)

当使用带有buttonclickevent的方法(向python服务器发送文本消息)时, 连接和发送短信效果很好。

但是当我使用带有 listview 适配器的方法时(使用 ArrayMap), 连接效果很好,但无法发送 rssi。

更多细节,等待数据的无限循环

我认为使用 runOnUiThread 和数据发送之间存在问题,但我不确定。

主要活动

package midascon.example.scanlist;

import com.hanvitsi.midascon.Beacon;
import com.hanvitsi.midascon.BeaconCallback;
import com.hanvitsi.midascon.MidasApplication;
import com.hanvitsi.midascon.manager.ContextManager;

import android.Manifest;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.StrictMode;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.widget.ListView;


public class MainActivity extends Activity implements BeaconCallback, Runnable
{
    private static final int MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 100;
    private ContextManager contextManager;
    private BeaconListAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); }

        checkPermission();

        contextManager = getMidasApplication().getContextManager();
        contextManager.getBeaconSettings().setMidasScanMode(false);

        adapter = new BeaconListAdapter(getBaseContext()); // Beacon list adapter

        ListView listView = (ListView) findViewById(R.id.listView);
        listView.setAdapter(adapter);
    }

    @Override
    public void onBeaconCallback(int status, Beacon beacon) // add beacon to list when beacon signal captured
    {
        switch (status) {
        case STATUS_CODE_ENTER:
        case STATUS_CODE_UPDATE:
            if (adapter != null)
                adapter.addBeacon(beacon);
            break;

        case STATUS_CODE_EXIT:
            if (adapter != null)
                adapter.removeBeacon(beacon);
            break;

        default:
            break;
        }

        runOnUiThread(this);
    }

    public void checkPermission() // allow permission
    {
        if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        }
    }

    @Override
    public void run() {
        if (adapter != null)
            adapter.notifyDataSetChanged();
    }

    // call name class setting by AndroidManifest.xml
    public MidasApplication getMidasApplication() {
        return (MidasApplication) getApplication();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
                ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
            }
            else
            {
                ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
            }
        }

        else {
            if (BluetoothAdapter.getDefaultAdapter().isEnabled()) {
                // register callback
                contextManager.setBeaconCallback(this);
                contextManager.startLeScan();
            } else {
                contextManager.stopLeScan();

                Intent settingsIntent = new Intent(android.provider.Settings.ACTION_BLUETOOTH_SETTINGS);
                startActivity(settingsIntent);
            }
        }
    }

    @Override
    protected void onPause() {
        super.onPause();

        contextManager.stopLeScan();
    }   
}

midas 是制造信标的公司

BeaconListAdapter

公共类 BeaconListAdapter 扩展 BaseAdapter { private final LayoutInflater inflater;

private int count; //counting beacon

private final ArrayMap<String, Beacon> itemMap = new ArrayMap<String, Beacon>();


private final int padding;
public int CurBeaconHave = 2;

private Handler mHandler;

public int port = 9999;

public int initcnt = 0;
public int stackcnt = 0;
public int serveractivate = 0;
public int praccnt = 0;

public static String Sendrssi = "";
public Socket socket = null;


public BeaconListAdapter(Context context) {
    super();
    padding = (int) context.getResources().getDimension(R.dimen.activity_vertical_margin);
    this.inflater = LayoutInflater.from(context);
}

public int addBeacon(Beacon beacon) {
    synchronized (itemMap) {
        itemMap.put(beacon.getMac(), beacon);
        count = itemMap.size();
        return count;
    }
}

public int removeBeacon(Beacon beacon) {
    synchronized (itemMap) {
        itemMap.remove(beacon.getMac());
        count = itemMap.size();
        return count;
    }
}

@Override
public int getCount() {
    return count;
}

@Override
public Beacon getItem(int position) {
    synchronized (itemMap) {
        return itemMap.valueAt(position);
    }
}

void ToPython() {
    try {
            String tmp = Sendrssi;

            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
            out.println(tmp);
            out.flush();
            Log.d("sendrssi ",tmp);
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

/*public void ToPython() {
    try {
        String tmp = Sendrssi;
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

        out.write(tmp);
        out.newLine();
        out.flush();
        Log.d("Sending. Rssi : ", tmp);
    } catch (Exception e) {
        e.printStackTrace();
    }
}*/

void connect() {

    Log.w("state", "connecting..");
    Thread checkUpdate = new Thread() {
        public void run() {
            String newip = "192.168.0.4";

            try {

                socket = new Socket(newip, port);
                Log.w("state ", "server connected");
                serveractivate = 1;

            } catch (IOException e1) {
                Log.w("state ", "failed");
                e1.printStackTrace();
                System.out.println("error :" + e1.getMessage());
            }
        }
    };
    checkUpdate.start();
}

@Override
public long getItemId(int position) {
    return position;
}
public void stopsocket()
{
    try
    {
        socket.close();
    } catch (IOException e){
        e.printStackTrace();
    }
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
    TextView textView = null;
    if (convertView == null)
    {
        convertView = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);
        textView = (TextView) convertView.findViewById(android.R.id.text1);
        textView.setBackgroundColor(Color.WHITE);
        textView.setTextColor(Color.BLACK);
        textView.setPadding(padding, padding, padding, padding);
        convertView.setTag(textView);
    }

    else
    {
        textView = (TextView) convertView.getTag();
    }

    Beacon item = getItem(position);
    int temprssi = item.getRssi();

    while(serveractivate == 0)
    {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.d("Connect State : ","wait for Server Connect...");
        connect();
    }

    if(serveractivate == 1)
    {
        try {
            socket.setTcpNoDelay(true);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    int[] values = BeaconUtils.getAccelerometer(item);
    textView.setText(String.format("[%s]\nMAC : %s\nRssi : %d\n", item.getType() == Beacon.TYPE_MIDAS ? "Midascon" : "Beacon", item.getMac(),temprssi));

    if(count == CurBeaconHave)
    {
        if(stackcnt == CurBeaconHave)
        {
            ToPython();
            stackcnt = 0;
            Sendrssi = "";
        }

        else if(stackcnt != CurBeaconHave)
        {
            Sendrssi = Sendrssi + temprssi + " " ;//+ (temprssi - 3) + " " + (temprssi + 5) + " " + (temprssi - 7) + " ";
            stackcnt++;
        }
    }

    return convertView;
}

}


total code line is about 400 line, so i upload code that have problem i think.


thank you for reading and try to solve my problem

if you need another code i'll upload it

Note that i'm not good at english, so you may have difficult with reading and understand. sorry for that :(

【问题讨论】:

  • using runOnUiThread 我没有看到你在使用它。
  • 发布错误、异常和堆栈跟踪。
  • 我的错误。我上传 Mainactivity 部分。 connect 和 sendata 方法是 listadapter 的一部分
  • 在我调查之前,您最好先说明问题所在。 Post errors, exceptions and stacktraces.
  • 你说的是蓝牙插座吗?

标签: python android server tcp client


【解决方案1】:

问题解决了。 这不是正常的方法,请耐心等待。

连接方法中的BeaconListadapter,我使用线程。 但我不在 Topython 方法中使用线程。 因此,发送数据时的套接字信息有问题 所以我在连接方法中删除线程并运行和方法 在主线程中(我知道这是白痴)

如果你像我一样使用,可能在一个线程中使用连接和发送数据方法

【讨论】:

    猜你喜欢
    • 2019-07-24
    • 2015-12-26
    • 2014-03-10
    • 2014-03-08
    • 2018-10-19
    • 2019-06-29
    • 2015-02-10
    • 1970-01-01
    • 2019-01-01
    相关资源
    最近更新 更多