简 书:http://www.jianshu.com/p/e9f8af1ab76f
导读
前段时间在做智能家居项目(ZigBee),使用UDP通信协议控制智能家居,比如说调节LED灯的亮度。在通信部分我使用了CocoaAsyncSocket这个非常主流的开源库,发送和接受传感器发来的数据是很容易的,我将它封装了一下,一句代码就能实现了,所以下面分享的是如何做接下来的工作:1.解读UDP协议指令,2.将16进制字符串抓换成我们需要的指令数据,3.解析发来的数据。
概览
LSUDPDataDetail:一个在UDP或TCP通信时,对16进制、10进制、NSData等数据之间的转换发送等进行处理的工具类库 一般我们在发送指令到传感器时,指令发送成功了传感器不一定会响应,这个类库对这个问题做了一个封装,能够正确的发送传感器需要的指令。里面还有些各个进制直接的转换方法,大家可以直接使用。
一、UDP协议指令(ZigBee数据格式)解读
1.1这是需要我们发送或者接收指令格式:
指令格式
右图是LSUDPDataDetail类库中的Demo示例里面的对照(版本更新可能会有变动)
1.2示例介绍:
如果看完上面的对照图片还是一脸懵逼,那我们来一起举个栗子聊聊吧~
比如说上面是控制LED灯的数据格式:
& * 分别是帧头和帧尾;
TRC是命令头,这个可以区分是什么传感器,比如LED是TLL,可燃气体是TRC;
00000001yy是地址,这里需要注意的是控制传感器不能直接使用“00000001yy”这个地址,每个传感器下面都有一个底座,也就是节点,每个节点都有自己的地址,在UDP连接成功后节点会发送一条数据,数据里面包含了节点地址,拿到那个节点地址是我们通信的前提,具体可参考:LSUDPDataDetail类库中的ViewController.m Demo文件;
xxzzzxxxxxxxxxxx是我们要发送的控制指令数据,传感器也是根据这条数据来做出相应的动作。而需注意的是最后一个数据是CRC验证,如果有需要您需要计算出CRC!(之所以说如果有需要是因为我在CRC位随意输入一个数据是可以和传感器正常工作的,灯也会亮。。。)
* 重要提示!:*
折腾半天可能传感器还没反应,那么有可能是这里错了~ 上面的一串“&TRC00000001yyxxzzzxxxxxxxxxxx*” 全都是缩写/字符格式,包括“0”和“1”!你需要统一将他们转换成HexString或者DecString或者其他进制字符串。 Demo里面实际操作的过程中用到了混拼,也就是一串指令中间是10进制字符串,两头是16进制字符串,当然外面进行了些包装,这样也是可以的,因为无论是16进制还是10进