PHP物联网开发中16进制转10进制几个相关函数

之前一直是在做电商那一块,基本上不涉及到16进制,与APP端打交道都是用json格式,但是自从涉及到物联网,需要与硬件电路板打交道,一些情景需要用到16进制,尤其是与硬件端通信的情况,对于单片机来说,相比JSON,16进制数组可能是比较好的通信协议,网上发现PHP开发物联网相关项目中16进制资料相对较少,这里分享下我这边与硬件通信相关的几个重点函数。

通信前提

首先,我们服务端与硬件端是通过MQTT协议进行通信,两端各监听一个topic,一个收一个发,双方使用16进制数组进行通信,如果我这句话没有表达清楚,那下面这张图应该能更明了:
mqtt-hex-dec.png
左侧是用来模拟硬件端通过MQTT Broker给服务端发送数据,中间那一列是服务端监听特定的topic用来接收所有硬件发送过来的消息,最右侧那一列是用来查看指定硬件发送的消息。
其中,硬件发送的消息格式就如上图左侧红色框框圈起的那样,Payload Type是Hex Array,服务端接收的也就是16进制数组合并成的字符串。
本文所说的几个相关函数也是基于这种通信协议。

PHP相关函数

涉及到的函数共有如下几个,相关函数的作用详情请查阅PHP的文档,说的肯定比我清楚:

  • hexdec
  • sprintf
  • chr
  • base_convert

高低字节转换

这里说的高低字节,是指用两个16进制数字组合成一个10进制数字,比如0x01,0x01按照这种转换方式转换成10进制就是257,代码如下:

    /**
     * 高低字节的两个16进制数转换成10进制
     * @param $byte1
     * @param $byte2
     * @return float|int
     */
    static public function intFrom2ByteHex($byte1, $byte2)
    {
        return hexdec($byte1) * 256 + hexdec($byte2);
    }

16进制字符串转换成16进制数组

虽然设备端发送的是16进制数组,但是服务端这边接收到的却是16进制字符串,如果下一步需要按字节进行业务处理,可通过下面代码进行将16进制字符串切割成16进制数组:

/**
     * MQTT收到的16字符串转换成16进制数组
     * @param $data
     * @return array
     */
    static public function dataToHexArray($data)
    {
        //按字符分割的16进制数组
        $hexArrayOrig = str_split($data, 1);
        $hexArray = [];
        foreach ($hexArrayOrig as $item) {
            $hexArray[] = sprintf("%02X", ord($item));
        }
        return $hexArray;
    }

10进制数组转换成16进制字符串

在服务端处理完业务之后,有点时候需要给设备端回复消息或者下发指令,就需要和上方16进制转10进制相反处理,将10进制数组转换成16进制字符串然后通过MQTT协议发送给硬件端,相关代码如下:

    /**
     * 10进制数组转16进制字符串
     * @param $array
     * @return string
     */
    static public function decArrayToHexStr($array)
    {
        $hexArray = [];
        foreach ($array as $item) {
            $hexArray[] = chr(intval($item, 16));
        }
        $hexStr = join('', $hexArray);
        return $hexStr;
    }

10进制数组转16进制数组

上面一个函数是10进制数组转16进制字符串,这个是转数组,相对来说更简单:

        static public function hexArray2DecArray($hexArray)
    {
        $decArray = [];
        foreach ($hexArray as $item) {
            $decArray[] = hexdec($item);
        }
        return $decArray;
    }

最后

以上几个函数都是我在工作中使用总结出来的,不一定适合别的情况,使用之前应考虑具体情况,如果有更好的实现方式,也可以评论区或者邮件交流下。