转自:https://blog.csdn.net/lj779323436/article/details/79911322
我在此基础上时间并进行了些许修正。

先在树莓派上创建热点:

https://blog.csdn.net/fm0517/article/details/80939113

在树莓派上编写脚本代码:tcpserver.py

#!/usr/bin/python
#coding=utf-8
import socket
import time
import sysHOST_IP = "192.168.12.1"    #我的树莓派作为AP热点的ip地址
HOST_PORT = 7654            #端口号print("Starting socket: TCP...")
socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    #创建socketprint("TCP server listen @ %s:%d!" %(HOST_IP, HOST_PORT) )
host_addr = (HOST_IP, HOST_PORT)
socket_tcp.bind(host_addr)    #绑定我的树莓派的ip地址和端口号
socket_tcp.listen(1)    #listen函数的参数是监听客户端的个数,这里只监听一个,即只允许与一个客户端创建连接while True:print ('waiting for connection...')socket_con, (client_ip, client_port) = socket_tcp.accept()    #接收客户端的请求print("Connection accepted from %s." %client_ip)socket_con.send("Welcome to RPi TCP server!")    #发送数据while True:data=socket_con.recv(1024)    #接收数据if data:    #如果数据不为空,则打印数据,并将数据转发给客户端print(data)socket_con.send(data)socket_tcp.close()

用AndroidStudio创建安卓工程MyApplication:

1.activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="lh.wifidemo.ui.activity.Device_Control_Activity"><TextView
        android:layout_width="match_parent"android:layout_height="wrap_content"android:text="设备控制"/><EditText
        android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/et_send"/><Button
        android:layout_width="match_parent"android:layout_height="wrap_content"android:text="发送"android:id="@+id/bt_send"/><TextView
        android:layout_width="match_parent"android:layout_height="wrap_content"android:text="接收到的信息:"/><TextView
        android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/tv_recv"/>
</LinearLayout>

2.MainActivity.java

package com.example.chenth.myapplication;import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;/*import com.example.chenth.myapplication.R;*/public class MainActivity extends AppCompatActivity {private EditText et_send;private Button bt_send;private TextView tv_recv;private String send_buff=null;private String recv_buff=null;private Handler handler = null;Socket socket = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();handler = new Handler();//单开一个线程来进行socket通信new Thread(new Runnable() {@Overridepublic void run() {try {socket = new Socket("192.168.12.1" , 7654);if (socket!=null) {System.out.println("###################");while (true) {      //循环进行收发recv();send();Thread.sleep(50);}}elseSystem.out.println("socket is null");} catch (Exception e) {e.printStackTrace();}}}).start();send();}private void recv() {//单开一个线程循环接收来自服务器端的消息InputStream inputStream = null;try {inputStream = socket.getInputStream();} catch (IOException e) {e.printStackTrace();}if (inputStream!=null){try {byte[] buffer = new byte[1024];int count = inputStream.read(buffer);//count是传输的字节数recv_buff = new String(buffer);//socket通信传输的是byte类型,需要转为String类型System.out.println(recv_buff);} catch (IOException e) {e.printStackTrace();}}//将受到的数据显示在TextView上if (recv_buff!=null){handler.post(runnableUi);}}//不能在子线程中刷新UI,应为textView是主线程建立的Runnable runnableUi = new Runnable() {@Overridepublic void run() {tv_recv.append("\n"+recv_buff);}};private void send() {bt_send.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {new Thread(new Runnable() {@Overridepublic void run() {send_buff = et_send.getText().toString();//向服务器端发送消息System.out.println("------------------------");OutputStream outputStream=null;try {outputStream = socket.getOutputStream();} catch (IOException e) {e.printStackTrace();}if(outputStream!=null){try {outputStream.write(send_buff.getBytes());System.out.println("1111111111111111111111");outputStream.flush();} catch (IOException e) {e.printStackTrace();}}}}).start();}});}private void initView() {et_send = (EditText) findViewById(R.id.et_send);bt_send = (Button) findViewById(R.id.bt_send);tv_recv = (TextView) findViewById(R.id.tv_recv);}
}

3. AndroidManifest.xml

主要是增加了网络访问权限:

<uses-permission android:name="android.permission.INTERNET"/>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.chenth.myapplication"><uses-permission android:name="android.permission.INTERNET"/><application
        android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity
            android:name=".MainActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

这里有几个地方需要特别注意:

1、创建socket时需要开一个子线程,而不能直接在主线程中完成,否则会报错

2、当接收来自树莓派服务器的消息时,需要刷新TextView,而刷新TextView的操作不能直接在子线程中完成,需要用Handler来实现,否则会报错,提示view只能由源线程来更改

整个项目需要先启动树莓派,然后手机连上树莓派的WIFI热点,如果想要查看树莓派的输出信息,则可以利用window的远程桌面连接树莓派,也可以用putty这个软件进行命令行控制,当然,有条件的完全可以用HDMI接口给你的树莓派连一个显示器

最后上图:

图1.树莓派上的程序运行:

图2.手机上的程序运行:

树莓派与Android客户端进行socket通信相关推荐

  1. 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互

    基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互 一.前言 1.Java服务端程序代码的项目名为TcpSocketServerOfJava,包名为com.exam ...

  2. Android简单实现Socket通信,客户端连接服务器后,服务器向客户端发送文字数据

    案例实现的是简单的Socket通信,当客户端(Android客户端)连接到指定服务器以后,服务器向客户端发送一句话文字信息(你可以拓展其它的了) 先看一下服务端程序的实现吧 Server.java i ...

  3. Android中关于Socket通信数据大小,内存缓冲区和数据可靠性的一点调查

    关于TCP和UDP Socket通信的区别: 应用场景: UDP传输协议效率高,但不可靠: TCP传输效率低,但可靠. 传输数据大小: UDP传输数据限定在64K以下: TCP传输数据无大小限制,可进 ...

  4. Android进程间通信之socket通信

    用Java中的socket编程. 通过socket实现两个应用之间的通信,可以接收和发送数据,同时将接收到的数据显示在activity界面上. Server端: ServerLastly.java p ...

  5. java服务端与Android客户端使用 websocket 通信

    最近因为项目需要所以得使用 websocket 来进行服务器与客户端的通信.使用java 来实现服务端,Android 实现客户端. 刚开始服务端使用 @ServerEndPoint 注解来实现 We ...

  6. Android开发之Socket通信的方法

    老套图上图: 如上所示: 我这边定义了两个APP一个是server端一个是客户端 步骤: 先安装服务端APP,再安装客户端APP,然后打开客户端APP后悔自动打开服务端的service然后开启服务端的 ...

  7. Android服务的通信方式,android客户端与服务器通信的HTTP通信

    如下,给出HTTP通信的主要代码: 一.post方式通信 主要分为以下几步: 1.新建Httppost对象: 2.为Httppost设置参数和编码格式: 3.新建HttpClient对象: 4.新建H ...

  8. Android客户端与PC服务器实现Socket通信(wifi)

    转载自:http://www.cnblogs.com/dwayne/archive/2012/05/22/Android_pc_wifi_socket.html 本文介绍Android终端持续扫描AP ...

  9. Android客户端与PC服务器实现Socket通信

    Android终端持续扫描AP信息并发送给服务器端的实现.首先基于TCP协议在Android终端和PC两端之间形成网络虚拟链路.使用ServerSocket创建TCP服务器端,然后在Android客户 ...

最新文章

  1. Documentum常见问题2—压力测试时一旦用户数超过一定数量就不能登录了
  2. tornado 表单 post 提交
  3. 一篇文章教会你使用html+css3制作GIF图
  4. 在GridView中加入单选按钮RadioButton
  5. Spring Bean生命周期-obtainFreshBeanFactory(三)
  6. 【12-05】面试题
  7. springBoot+springSecurity 数据库动态管理用户、角色、权限
  8. 三实系统地址是什么意思_终于明白!火灾报警系统的余量应该如何设置?地址数又是什么?...
  9. 正则表达式修正符的学习
  10. 增广拉格朗日 matlab,大连理工优化方法增广拉格朗日方法MATLAB程序
  11. 每个叶子节点(nil)是黑色。_129. 求根到叶子节点数字之和
  12. 一个winform中多线程的例子
  13. R 和 Python用于统计学分析,哪个更好?
  14. 【CSDN】博文导入微信公众号
  15. 13天Java进阶笔记-day11-网络编程和NIO
  16. ih5连接mysql数据库_iH5高级教程:H5数据应用,多种数据的判断
  17. 4G路由 linux,DIY低成本4G路由器:性能高,易于开发和应用
  18. 腾讯华为签署《深圳市APP个人信息保护自律承诺书》举措新解读
  19. Node Sass could not find a binding for your current environment
  20. 智博通 ZBT WG2626原机编程器

热门文章

  1. 姍姍遲來的iPhone文檔處理功能
  2. Java 使用List集合实现图书增删改查
  3. HDU 1297 Children’s Queue
  4. 牛客第四次多校Maximum Mode
  5. Linux centosVMware shell中的函数、shell中的数组、
  6. 学生选课数据库MySQL语句练习题45道
  7. 荣耀 6 安装 SD 卡,提示:SD卡已安全移除
  8. SonarQube代码质量管理工具安装与使用(sonarqube5.1.2 + sonar-runner-dist-2.4 + MySQL5.x)
  9. ECMAScript5之Object学习笔记(二)
  10. Ubuntu配置上位机Blackfin开发环境手记