现在很多智能家居的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 局域网内搜索到设备相关推荐

  1. iOS 局域网内搜索硬件设备

    iOS 局域网搜索可以使用两种方式.第一种方式局域网广播方式.此方式一般在3秒内就会相应.第二种方式也是比较笨拙的方式通过ping方式.这种方式一般是在硬件本身并不支持广播功能.此方法弊端:搜索时间长 ...

  2. 计算机搜索不到网络打印机怎么处理,局域网内搜索不到打印机怎么办

    有时候我们创建了一个局域网时,共享了打印机,但是就是搜索不到打印机怎么办呢?小编来教你!下面由小编给你做出详细的局域网内搜索不到打印机解决方法介绍!希望对你有帮助! 局域网内搜索不到打印机解决方法一: ...

  3. 安卓app局域网内访问PC服务端

    对于没有公网IP的服务器,我们如果想在真机上运行app访问PC端的服务,则需要手机跟PC在同一个局域网内.在开发测试时候可以在PC上通过第三方工具(比如猎豹免费WIFI)创建WIFI并在手机上面连接该 ...

  4. iOS App应用内评价

    译自官方API文档 前言 从iOS 10.3开始,用户可以在APP内直接进行评分或评论,不需要再跳转到AppStore了.之前的流程是:用户点击评论按钮打开评论页面(或某个时刻自动弹出)->点击 ...

  5. ios 中使用DLNA搜索dms设备

    什么是DLNA DLNA的全称是DIGITAL LIVING NETWORK ALLIANCE, 其宗旨是Enjoy your music, photos and videos, anywhere a ...

  6. ios app 应用内购买配置完全指南

    第一印象觉得In-App Purchase(简称IAP)非常简单.Apple提供的大量文档应该让开发者很快熟悉地熟悉.那么,为什么在你的应用中集成IAP特性就如此令人生厌呢? 这是因为在开发过程中不可 ...

  7. 如何对局域网内的无线设备进行管理和流控?

    无线上网已经是企业员工的基本需求,企业为了满足员工的无线上网需要,大部分都部署了无线路由器或者无线AP设备.但是,不加管理的无线接入无疑会威胁企业的信息安全,并且给带宽带来较大压力. 1. 概述 本文 ...

  8. zabbix 6.2版本如何实现局域网内的硬件设备状态监控详解-部署安装-界面优化-web调试

    文章目录 zabbix是否可以实现局域网内部的设备状态监控 1 zabbix简介 1.1 什么是zabbix? 1.2 zabbix 都有那些功能? 2 zabbix安装-以安装在centos-str ...

  9. 关于小米路由器的局域网内相互ping设备IP的解决方法

    1.今天调试intraweb时发现,不能访问设备IP,导致不能访问intraweb生成的网站.所以网上找了一下说是要把加密方式改一下,确实就正常了,很奇怪的现象呀,如果默认为混合加密WPA就ping不 ...

最新文章

  1. python使用列表推导式(list comprehension)和itertools生成浮点数列表
  2. js php 正则差别,正则表达式(括号)、[中括号]、{大括号}的区别小结,正则表达式小结...
  3. Linux学习笔记之三
  4. 数模学习笔记——微分方程
  5. 【大学课程】计算机组成原理知识点
  6. java.util.concurrent简介
  7. 华为p10plus能用鸿蒙吗,华为P10/P10 Plus对比评测:自家兄弟大对决
  8. 拼图游戏和它的AI算法
  9. SpringBoot 2 快速整合 RabbitMQ
  10. layUI数据表格可编辑扩展下拉框
  11. windows安装Composer
  12. ipad连接电脑显示不在充电_笔记本电脑和投影仪连接后为什么投影仪不能显示电脑内容?...
  13. webmagic之爬取数据存入HDFS
  14. rabbitmq 用户管理
  15. Linux下多线程查看工具(pstree、ps、pstack),linux命令之-pstree使用说明, linux 查看线程状态。 不指定...
  16. 给Java程序猿们推荐一些值得一看的好书
  17. android wifi 获取 getBssiD
  18. Text strings must be rendered within a Text component的一个情况
  19. 74LSxx versus. 74HCxx
  20. android 华为手机拍照,华为手机拍照不行?可能是你模式不对!

热门文章

  1. mysql查询补齐12个月_MySQL查询12个月数据,无数据补0
  2. 10月12日 阅读数异常公告
  3. 算法的时间复杂度详解
  4. 不用软件批量缩小图片文件的大小
  5. iphone 11显示连接服务器出现错误,iPhone11投屏方法有哪些?iPhone投屏失败的原因及解决方法...
  6. 小米科学计算机怎么用,小米计算器怎么用 小米计算器app使用方法
  7. 学校计算机一级上网题,考试经验之谈:计算机一级考试上网题怎么操作?
  8. Excel2013表格使用厘米为单位设置行高和列宽
  9. 固定资产自动盘点系统,盘点固定资产及利润更清晰
  10. linux磁盘坏块 cp报错,Linux磁盘坏道的检测及修复