通过手机Wi-Fi控制设备有两种,一种是热点直连,另一种通过路由;刚好公司两个不同的项目,嵌入式那边分别用了这两个不同模式实现。笔者这两种的实现都是基于第三方库GCDAsyncSocket实现,GCDAsyncSocket只有四个文件,直接拖进项目或者pod进项目马上就能使用,而第二种的路由方案中,还要通过SmartConfig进行配网。关于SmartConfig,请自行百度。
一.热点直连
1.询问嵌入式使用哪个host、端口,接收该端口的广播;调用bindToPort,enableBroadcast,beginReceiving三个方法,之前没做过然后百度出了些答案,忘记了他们少了哪一个方法,然后一直接收不了设备返回的数据,请自行尝试;
2.交互,当向Wi-Fi模块发送数据,host,port向嵌入式工程师询问,质问,不说就吊打他们就行了;
[self.udpSocket sendData:self.readCommandData toHost:@"10.10.176.1" port:520 withTimeout:-1 tag:100];
3.Wi-Fi返回结果的时候,会触发GCDAsyncUdpSocketDelegate的回调,回调的数据处理自行发挥;
4.以上,就完成了热点直连的整个过程,简单得不要不要的,都不知道为啥当时和我一起做项目的那个安卓搞来搞去都搞不出来,其余心跳什么乱七八糟的逻辑处理请自行发挥;
热点直连的需求中,获取Wi-Fi列表是当时最头痛的问题,首先数次申请 Network Extension这个框架的使用权限,不知为何不停被拒始终申请不下来,到项目结束的现在也未能申请下来,到了怀疑人生的地步;而我们的需求是客户在系统设定中连接Wi-Fi模块热点直连后,还要客户选择要配网的路由进行配网,在拿不到这个权限而又要获取Wi-Fi列表,我们想了另一个途径,就是从Wi-Fi模块中去获取,直接发送at指令让模块给我返回附近的Wi-Fi列表,具体的at指令请咨询厂商或嵌入式工程师。后面就是modbus协议通讯交互的各种逻辑问题了,请自行发挥。
网友评论