php网站建设培训班,潍坊专业联轴器收购价格,成都网站建设推来客网站系统报价,封面免费制作网站参考#xff1a;树莓派与安卓手机app的WIFI通信#xff08;局域网通信#xff09; 作者#xff1a;图触靓 发布时间#xff1a; 2020-07-29 10:18:12 网址#xff1a;https://blog.csdn.net/bhbhhyg/article/details/107655967 目录树莓派作为服务器安卓端连接服务器的方… 参考树莓派与安卓手机app的WIFI通信局域网通信 作者图触靓 发布时间 2020-07-29 10:18:12 网址https://blog.csdn.net/bhbhhyg/article/details/107655967 目录树莓派作为服务器安卓端连接服务器的方法安卓AndroidManifest中需要添加的权限安卓按键发送的写法树莓派作为服务器
与树莓派与wemos的无线通信类似只不过这次我们将客户端变为安卓手机树莓派作为服务器。
#include sys/types.h
#include sys/socket.h
#includenetinet/in.h
#include arpa/inet.h
#includestdio.h
#includestdlib.h
#include unistd.h
#includestring.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
int initsocket(){int s_fdsocket(AF_INET, SOCK_STREAM,0);if (s_fd-1){perror(socket);exit(-1);}struct sockaddr_in addr;memset(addr,0,sizeof(struct sockaddr_in));addr.sin_familyAF_INET;addr.sin_porthtons(9001); //端口号inet_aton(192.168.200.XXX,addr.sin_addr);//IP地址// addr.sin_porthtons(atoi(argv[2]));// inet_aton(argv[1],addr.sin_addr);int bidbind(s_fd,(struct sockaddr *)addr,sizeof(struct sockaddr_in));listen(s_fd,10);int lensizeof(struct sockaddr_in);return s_fd;
}int main(){char readbuf[2]{0};int s_fdinitsocket(); //初始化服务器printf(wait connect.....\n);while(1){int fd_aaccept(s_fd,NULL,NULL); //该函数用来接受连接没有连接的时候也可以用来阻塞while1printf(connect\n);memset(readbuf,0,2); //初始化字符串int rread(fd_a,readbuf,2); //读指令if(r-1){perror(read);}else{printf( cmd is %c \n,readbuf[0]);//打印安卓客户端发来的指令}安卓端连接服务器的方法
package com.example.smarthome;import java.io.OutputStream;
import java.net.Socket;import android.os.Handler;public class NetUtils {public String message;public String reTurnMes;public Handler handler;public NetUtils(String message) {this.message message;}public NetUtils(String message, Handler handler) {this.message message;this.handler handler;}public void sendMessage() {new Thread(new Runnable() {Overridepublic void run() {try {Socket client new Socket(192.168.XXX.XXX,9001);//与服务器对应的IP地址与端口号OutputStream out client.getOutputStream(); out.write(message.getBytes()); //像服务器发送信息out.close(); //关闭输入流client.close(); //客户端的连接} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}
}安卓AndroidManifest中需要添加的权限 uses-permission android:nameandroid.permission.ACCESS_COARSE_LOCATION /uses-permission android:nameandroid.permission.INTERNET /安卓按键发送的写法
Button kd(Button)findViewById(R.id.kd);
kd.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View arg0) {new NetUtils(A).sendMessage();}});最后需要注意的是安卓给服务器发送数据是按键一次建立一个线程并连接一次莓派端服务器发送完成再断开。所以我们需要将树莓派端的服务器阻塞设置为连接而不是一次连接后不断的循环读客户端的数据否则当客户端发完数据后断开连接服务器还一直在循环的读上一个连接的数据造成死循环。
所以服务器正确的设置应该为接受一次连接读一次阻塞等待下一次的连接。