如何在ios app 局域网内搜索到设备
现在很多智能家居的app都具有自动扫瞄关联设备的功能,在网上搜索了一下,了解到是通过udp的广播技术来实现的。
然后在网上查找了一些资料后,自己也使用两个app模拟了一下通信过程:其中一个app模拟设备端。
app端主要代码:用户发送了一个广播以后再启动一个监听socket,负责搜集设备返回来的设备信息。
//UDP Broadcast Sockets
-(bool) send:(NSString*) msg ipAddress:(NSString*) ip port:(int) p
{int sock;struct sockaddr_in destination;unsigned int echolen;int broadcast = 1;// if that doesn't work, try this//char broadcast = '1';if (msg == nil || ip == nil){printf("Message and/or ip address is null\n");return false;}/* Create the UDP socket */if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0){printf("Failed to create socket\n"); return false;}/* Construct the server sockaddr_in structure */memset(&destination, 0, sizeof(destination));/* Clear struct */destination.sin_family = AF_INET;/* Internet/IP */destination.sin_addr.s_addr = inet_addr([ip UTF8String]);/* IP address */destination.sin_port = htons(p);/* server port */setsockopt(sock,IPPROTO_IP,IP_MULTICAST_IF,&destination,sizeof(destination));char *cmsg = [msg UTF8String]; echolen = strlen(cmsg);// this call is what allows broadcast packets to be sent:if (setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&broadcast,sizeof broadcast) == -1){perror("setsockopt (SO_BROADCAST)");exit(1);}if (sendto(sock,cmsg,echolen,0,(struct sockaddr *) &destination,sizeof(destination)) != echolen){printf("Mismatch in number of sent bytes\n");return false;}else{[NSThread detachNewThreadSelector:@selector(startServer)toTarget:selfwithObject:nil];NSLog([NSString stringWithFormat:@"-> Tx: %@",msg]);return true;}}
- (void)startServer {NSLog(@"UDP listen started...");int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);struct sockaddr_in sa;char buffer[1024];size_t fromlen, recsize;memset(&sa, 0, sizeof(sa));sa.sin_family = AF_INET;sa.sin_addr.s_addr = INADDR_ANY;sa.sin_port = htons(3000);// bind the socket to our addressif (-1 == bind(sock,(struct sockaddr *)&sa, sizeof(struct sockaddr))){perror("error bind failed");close(sock);exit(EXIT_FAILURE);}for (;;){recsize = recvfrom(sock,(void *)buffer,1024,0,(struct sockaddr *)&sa,&fromlen);if (recsize < 0)fprintf(stderr, "%s\n", strerror(errno));NSLog([NSString stringWithUTF8String:buffer]);}
}- (IBAction)send:(id)sender {[self send:self.message.text ipAddress:@"255.255.255.255" port:5009];}
模拟设备端主要代码:程序一启动就有一个监听线程,当监听到广播信息后,从该端口报告数据上去。
//UDP Server
- (void)startServer {NSLog(@"UDP Server started...");int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);struct sockaddr_in sa;char buffer[1024];size_t fromlen, recsize;memset(&sa, 0, sizeof(sa));sa.sin_family = AF_INET;sa.sin_addr.s_addr = INADDR_ANY;sa.sin_port = htons(5009);// bind the socket to our addressif (-1 == bind(sock,(struct sockaddr *)&sa, sizeof(struct sockaddr))){perror("error bind failed");close(sock);exit(EXIT_FAILURE);}for (;;){recsize = recvfrom(sock,(void *)buffer,1024,0,(struct sockaddr *)&sa,&fromlen);if (recsize < 0)fprintf(stderr, "%s\n", strerror(errno));NSLog([NSString stringWithUTF8String:buffer]);// [self parseRX:[NSString stringWithFormat:@"<- Rx: %s",buffer]];char str[INET_ADDRSTRLEN];struct sockaddr_in cms;int n;inet_ntop(AF_INET, &sa.sin_addr, str, INET_ADDRSTRLEN);cms.sin_family = AF_INET;inet_pton(AF_INET, str, &cms.sin_addr);cms.sin_port = htons(3000);char pResponse[] = "i am device no 1";n = sendto(sock, pResponse, strlen(pResponse), 0,(struct sockaddr *) &cms, sizeof(cms));if (n < 0) {perror("sendto");}}//[pool release];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{// Override point for customization after application launch.[NSThread detachNewThreadSelector:@selector(startServer)toTarget:selfwithObject:nil];return YES;
}
以上代码在同一个手机上测试过,通信正常。
如何在ios app 局域网内搜索到设备相关推荐
- iOS 局域网内搜索硬件设备
iOS 局域网搜索可以使用两种方式.第一种方式局域网广播方式.此方式一般在3秒内就会相应.第二种方式也是比较笨拙的方式通过ping方式.这种方式一般是在硬件本身并不支持广播功能.此方法弊端:搜索时间长 ...
- 计算机搜索不到网络打印机怎么处理,局域网内搜索不到打印机怎么办
有时候我们创建了一个局域网时,共享了打印机,但是就是搜索不到打印机怎么办呢?小编来教你!下面由小编给你做出详细的局域网内搜索不到打印机解决方法介绍!希望对你有帮助! 局域网内搜索不到打印机解决方法一: ...
- 安卓app局域网内访问PC服务端
对于没有公网IP的服务器,我们如果想在真机上运行app访问PC端的服务,则需要手机跟PC在同一个局域网内.在开发测试时候可以在PC上通过第三方工具(比如猎豹免费WIFI)创建WIFI并在手机上面连接该 ...
- iOS App应用内评价
译自官方API文档 前言 从iOS 10.3开始,用户可以在APP内直接进行评分或评论,不需要再跳转到AppStore了.之前的流程是:用户点击评论按钮打开评论页面(或某个时刻自动弹出)->点击 ...
- ios 中使用DLNA搜索dms设备
什么是DLNA DLNA的全称是DIGITAL LIVING NETWORK ALLIANCE, 其宗旨是Enjoy your music, photos and videos, anywhere a ...
- ios app 应用内购买配置完全指南
第一印象觉得In-App Purchase(简称IAP)非常简单.Apple提供的大量文档应该让开发者很快熟悉地熟悉.那么,为什么在你的应用中集成IAP特性就如此令人生厌呢? 这是因为在开发过程中不可 ...
- 如何对局域网内的无线设备进行管理和流控?
无线上网已经是企业员工的基本需求,企业为了满足员工的无线上网需要,大部分都部署了无线路由器或者无线AP设备.但是,不加管理的无线接入无疑会威胁企业的信息安全,并且给带宽带来较大压力. 1. 概述 本文 ...
- zabbix 6.2版本如何实现局域网内的硬件设备状态监控详解-部署安装-界面优化-web调试
文章目录 zabbix是否可以实现局域网内部的设备状态监控 1 zabbix简介 1.1 什么是zabbix? 1.2 zabbix 都有那些功能? 2 zabbix安装-以安装在centos-str ...
- 关于小米路由器的局域网内相互ping设备IP的解决方法
1.今天调试intraweb时发现,不能访问设备IP,导致不能访问intraweb生成的网站.所以网上找了一下说是要把加密方式改一下,确实就正常了,很奇怪的现象呀,如果默认为混合加密WPA就ping不 ...
最新文章
- python使用列表推导式(list comprehension)和itertools生成浮点数列表
- js php 正则差别,正则表达式(括号)、[中括号]、{大括号}的区别小结,正则表达式小结...
- Linux学习笔记之三
- 数模学习笔记——微分方程
- 【大学课程】计算机组成原理知识点
- java.util.concurrent简介
- 华为p10plus能用鸿蒙吗,华为P10/P10 Plus对比评测:自家兄弟大对决
- 拼图游戏和它的AI算法
- SpringBoot 2 快速整合 RabbitMQ
- layUI数据表格可编辑扩展下拉框
- windows安装Composer
- ipad连接电脑显示不在充电_笔记本电脑和投影仪连接后为什么投影仪不能显示电脑内容?...
- webmagic之爬取数据存入HDFS
- rabbitmq 用户管理
- Linux下多线程查看工具(pstree、ps、pstack),linux命令之-pstree使用说明, linux 查看线程状态。 不指定...
- 给Java程序猿们推荐一些值得一看的好书
- android wifi 获取 getBssiD
- Text strings must be rendered within a Text component的一个情况
- 74LSxx versus. 74HCxx
- android 华为手机拍照,华为手机拍照不行?可能是你模式不对!
热门文章
- mysql查询补齐12个月_MySQL查询12个月数据,无数据补0
- 10月12日 阅读数异常公告
- 算法的时间复杂度详解
- 不用软件批量缩小图片文件的大小
- iphone 11显示连接服务器出现错误,iPhone11投屏方法有哪些?iPhone投屏失败的原因及解决方法...
- 小米科学计算机怎么用,小米计算器怎么用 小米计算器app使用方法
- 学校计算机一级上网题,考试经验之谈:计算机一级考试上网题怎么操作?
- Excel2013表格使用厘米为单位设置行高和列宽
- 固定资产自动盘点系统,盘点固定资产及利润更清晰
- linux磁盘坏块 cp报错,Linux磁盘坏道的检测及修复