树莓派与安卓手机app的WIFI通信(局域网通信)
生活随笔
收集整理的這篇文章主要介紹了
树莓派与安卓手机app的WIFI通信(局域网通信)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參考:樹莓派與安卓手機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> #include<netinet/in.h> #include <arpa/inet.h> #include<stdio.h> #include<stdlib.h> #include <unistd.h> #include<string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int initsocket(){int s_fd=socket(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_family=AF_INET;addr.sin_port=htons(9001); //端口號inet_aton("192.168.200.XXX",&addr.sin_addr);//IP地址// addr.sin_port=htons(atoi(argv[2]));// inet_aton(argv[1],&addr.sin_addr);int bid=bind(s_fd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in));listen(s_fd,10);int len=sizeof(struct sockaddr_in);return s_fd; }int main(){char readbuf[2]={0};int s_fd=initsocket(); //初始化服務器printf("wait connect.....\n");while(1){int fd_a=accept(s_fd,NULL,NULL); //該函數用來接受連接,沒有連接的時候也可以用來阻塞while(1)printf("connect\n");memset(readbuf,0,2); //初始化字符串int r=read(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:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.INTERNET" />安卓按鍵發送的寫法
Button kd=(Button)findViewById(R.id.kd); kd.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {new NetUtils("A").sendMessage();}});最后,需要注意的是,安卓給服務器發送數據是按鍵一次,建立一個線程并連接一次莓派端服務器,發送完成再斷開。所以我們需要將樹莓派端的服務器阻塞設置為連接,而不是一次連接后,不斷的循環讀客戶端的數據,否則當客戶端發完數據后,斷開連接,服務器還一直在循環的讀上一個連接的數據,造成死循環。
所以服務器正確的設置應該為,接受一次連接,讀一次,阻塞等待下一次的連接。
總結
以上是生活随笔為你收集整理的树莓派与安卓手机app的WIFI通信(局域网通信)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4种kill某个用户所有进程的方法
- 下一篇: 树莓派作为客户端与WemosD1作为服务